本篇介紹如何手動架設 RHadoop 計算伺服器,並使用 RHadoop 相關套件進行巨量資料分析。

RHadoop 是由 Revolution Analytics 所發展的 R 套件集,可讓 R 使用者更方便的使用 Hadoop 分析巨量資料,適用於 Cloudera、Hortonworks 等 Hadoop 發行版,以下是基本的 RHadoop 計算環境架設流程、MapReduce 用法與簡單的範例程式碼。

基本 Hadoop 環境架設

請參考 Ubuntu Linux 架設 Hadoop 單節點測試主機教學,將基本的 Hadoop 計算環境架設好。

使用前先測試一下 Hadoop 環境是否正常,先啟動 NameNode 與 DataNode daemon:

start-dfs.sh

檢查 daemon 是否有正常啟動:

jps
3370 Jps
3068 DataNode
3261 SecondaryNameNode

測試執行範例程式:

hadoop jar \
  $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar \
  pi 10 100
[略]
Job Finished in 5.478 seconds
Estimated value of Pi is 3.14800000000000000000

測試完 Hadoop 環境之後,停止 NameNode 與 DataNode daemon:

stop-dfs.sh

安裝 R

在 Ubuntu Linux 中使用 apt 安裝 R 套件:

sudo apt install r-base-core

安裝 RHadoop

RHadoop 是一套 R 語言的工具組,可讓使用者結合 R 與 Hadoop 進行巨量資料的分析,其包含五個 R 套件。

套件說明
rhdfs提供 HDFS 檔案系統的存取功能,R 程式設計者可以透過此套件瀏覽、讀取、寫入或修改 HDFS 中的檔案。
rhbase提供 HBASE 資料庫的存取功能,R 程式設計者可以透過此套件瀏覽、讀取、寫入或修改 HBASE 中的資料表。
plyrmr提供類似 plyrreshape2 的資料處理功能,使用 Hadoop 的 MapReduce 架構整理資料,但是在使用上比較類似 plyr,沒有太多複雜的 MapReduce 細節。
rmr2在 Hadoop 架構下,以 MapReduce 對巨量資料進行各種統計分析。
ravro提供本機與 HDFS 上 avro 檔案格式的存取功能。

安裝 rmr2

Hadoop 的每一個節點都要安裝 rmr2,首先安裝必要的 R 套件:

install.packages(c("Rcpp", "RJSONIO", "digest", "functional", "reshape2", "stringr", "plyr", "caTools"))

GitHub 上下載 rmr2 套件檔,直接安裝:

install.packages("rmr2_3.3.1.tar.gz")

設定 rmr2 所需的 Linux shell 環境變數:

export HADOOP_CMD=$HADOOP_HOME/bin/hadoop
export HADOOP_STREAMING=$HADOOP_HOME/share/hadoop/tools/lib/hadoop-streaming-2.7.3.jar

安裝 plyrmr

Hadoop 的每一個節點都要安裝 plyrmr,先裝一些必要的套件:

install.packages(c("dplyr", "reshape2", "plyr", "R.methodsS3", "Hmisc", "functional", "digest", "memoise", "lazyeval", "rjson"))

GitHub 上下載 plyrmr 套件檔,直接安裝:

install.packages("plyrmr_0.6.0.tar.gz")

設定 plyrmr 所需的 Linux shell 環境變數:

export HADOOP_CMD=$HADOOP_HOME/bin/hadoop
export HADOOP_STREAMING=$HADOOP_HOME/share/hadoop/tools/lib/hadoop-streaming-2.7.3.jar

安裝 rhdfs

安裝 rJava

install.packages("rJava")

GitHub 上下載 plyrmr 套件檔,直接安裝:

install.packages("rhdfs_1.0.8.tar.gz")

設定 rhdfs 所需的 Linux shell 環境變數:

export HADOOP_CMD=$HADOOP_HOME/bin/hadoop

安裝 rhbase

Apache Thrift 官方網站上下載原始碼,自行編譯安裝 Thrift。

GitHub 上下載 rhbase 套件檔,直接安裝:

install.packages("rhbase_1.2.1.tar.gz")

安裝 ravro

安裝必要的 R 套件:

install.packages(c("bit64", "rjson", "Rcpp"))

GitHub 上下載 ravro 套件檔,直接安裝:

install.packages("ravro_1.0.4.tar.gz")

測試 RHadoop

首先啟動 NameNode 與 DataNode daemon:

start-dfs.sh

進入 R 環境:

R

載入並測試 rmr2 套件:

library(rmr2)
from.dfs(to.dfs(1:100))
from.dfs(mapreduce(to.dfs(1:100)))

載入並測試 rhdfs 套件:

library(rhdfs)
hdfs.init()
hdfs.ls("/")

載入並測試 rhbase 套件:

library(rhbase)
hb.init()
hb.list.tables()

問題與解決方法

我在測試 rhdfs 時,會出現這樣的問題:

17/04/24 14:37:44 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

StackOverflow 上有一些解決方法,我是在 .bashrc 中加入一行設定來解決:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HADOOP_HOME/lib/native