第三章 相關研究
3.3 R 與 Hadoop 的整合
3.3.3 Hadoop Streaming
3.3.3 Hadoop Streaming
Hadoop 為了增加程式設計的使用彈性,提供 Hadoop Streaming 的 API 方式,讓使 用者除了Java 之外,可以使用支援 stdin/stdout 的語言或可執行的腳本語言(Scripts)撰寫 map 和 reduce 功能。Hadoop Streaming 使用 Unix 的標準串流方式作為 Hadoop 和使用者 程式之間的界面,使用者藉由標準輸入(stdin)和寫入到標準輸出(stdout),可以使用多種 語言撰寫MapReduce 程式。Hadoop Streaming 通常需要編寫兩個功能:Map 與 Reduce,
程式名稱分別為mapper 與 reducer。Map 先將資料分割成獨立的區塊,Reduce 結合 Map 產生的結果來執行有用的分析。底下為Hadoop Streaming 範例。
$HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/hadoop-streaming.jar \ -input myInputDirs \
-output myOutputDir \ -mapper /bin/cat \ -reducer /bin/wc
在上面的例子中,首先指定資料的輸入、輸出目錄與檔名,mapper 與 reducer 逐行 從標準輸入(stdin)讀取資料,再把處理過的資料後發送到標準輸出(stdout)。Hadoop Streaming 依據 mapper 與 reducer 產生對應的 Map / Reduce 作業( Job),該作業( Job)會被 送到適當的Hadoop cluster,並監視作業( Job)的進度直到完成。
當程式被指定為mapper 時,如/bin/cat,map 會以獨立的程序啟動這個程式。當 mapper 執行時,它會把資料逐行分割提供給程式,當作標準輸入(stdin)的內容。在此同時,mapper 從標準輸出(stdout)收集資料,輸出(key/value)格式作為 map 的輸出結果。
同樣的方式套用在reducer。當程式被指定為 reducer 時,如/bin/wc,reducer 會以獨
立的程序啟動這個程式。當reducer 執行時,它會把資料逐行分割提供給程式,當作標
準輸入(stdin)的內容。在此同時,mapper 從標準輸出(stdout)收集資料,並輸出為(key/value) 格式,作為reducer 的輸出。
Hadoop Streaming 與 R 整合變得相當簡單,但是 Hadoop Cluster 的每個 DataNode 都必須安裝R 程式。使用 Hadoop Streaming 的優點是,它允許 Java 以及非 Java 的
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
18
MapReduce 程式在 Hadoop cluster 上執行,Hadoop 的 JobTracker 與 TaskTracker 會自動 管理MapReducer 作業程序。除了 Java 之外,Hadoop Streaming 支援的語言還包括 Perl、
Python、PHP 、R、C + +與 Sehll Scripts 語言,程式開發人員需要把程式轉換為 Mapper 與Reducer、輸出結果為 Key/Value 的架構。
R 與 Hadoop 的整合方式如上面敘述,每種方式各有優點與限制,歸納如下:
(1) 先使用 Hadoop 彙整資料後,再提供給 R 作深入分析。
(2) 避免使用 R 作一般的 MapReduce 使用。
(3) 一般簡單的 MapReduce 工作,考慮使用 Hadoop Streaming 的處理方式,缺點是只 能處理文字資料,好處是非常容易的在非Hadoop 的環境中作測試,例如使用 pipe 架構多個串連指令。
(4) 其他狀況下,建議使用 RHIPE 或是 RHadoop。
RHadoop 與 RHIPE 的缺點:
(1) 需要使用 MapReduce 架構格式來撰寫 R 程式,學習曲線較久 (2) 穩定度與效能不及 Hadoop(Java)、Pig
(3) 執行時需要載入較多的 R libraries
本研究使用R+Hive 架構分析大量的 FOAF 資料,對於一般的使用者而言,除了 R 語言之外,只需要具備的SQL 語法背景。首先,將分析的資料放置 Hadoop HDFS 檔案 系統上,從R 介面使用 RHive 程式庫,透過 Hive 把 HQL 轉換為 MapReduce 分散式運
算架構處理,第二階段再將處理結果交給R,依據不同需求載入需要統計分析工具作運
算,最後完成繪製圖表工作。
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
19
表 3 :R 與 Hadoop 整合技術比較表 R+Hive
(R+HQL+Hadoop) RHadoop RHIPE Hadoop Streaming Snowfall/Multicore R parallel packages
User Friendly V V V X V
Easy Learning V X X X V
Handle Large
data set V V V V X
Apply statistical
algorithm V V V X V
Large Data
visualization V V V X X
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
20
第四章 方法架構設計
4.1 研究架構
本研究希望透過結合R 與 Hadoop/MapReduce 來分析處理大量的社群網路資料,我 們使用Hadoop/MapReduce 架構對大量的資料作簡單的資料統計,再用 R 豐富的程式庫 與函數作進階的統計分析,最後使用R 的 rhive 程式庫,透過 Hive 結合 R 與
Hadoop/MapReduce,分析處理大量的社群網路資料,如圖 4。
圖 4:研究架構圖
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
21
4.2 FOAF分析
4.2.1 R+Hadoop Streaming分析(RHS Analytics)
本研究將會探討使用Hadoop/MapReduce方式分析FOAF資料,在本研究的情境中,
FOAF 資料儲存於 Hadoop HDFS,利用 MapReduce 架構對 FOAF 資料進行簡單的分析 運算,以達到存取巨量資料與簡易運算的目的,如圖 5。章節 3.3.3 提到支援 Hadoop Streaming 的語言包括 Java、Python、PHP、C + +、R 與 Sehll Scripts 語言,本研究使用 R 語言作為範例。
圖 5:R+Hadoop Streaming 分析(RHS Analytics)架構圖
本研究借用WordCount 的概念,找出 FOAF 檔案中的關鍵字並加以統計字數,如圖 6。以 foaf 為例,使用 R 的 str_extract_all 功能取出符合比對規則的字串,當作 MapReduce 中Map 的 Key 鍵,Val 數值為"1",再由 Reduce 的 sum 作總和運算,最後再輸出分析統 計結果。
MapReduce 的運作流程如下:MapReduce 將要執行的問題,分別拆解成 Map 和 Reduce
的架構來執行,以達到分散式運算的效果。MapReduce 運算可利用兩個函數表示:
map (k1,v1) → list(k2,v2)
reduce (k2,list(v2)) → list(k3,v3).
MapReduce 演算法:
對應演算法中的Divide and conquer,將問題拆解為許多小問題後,再作最後的總和。雖
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
22
然Hadoop framework 是用 Java 完成,但是 Map/Reduce 不一定要用 Java 來寫,Hadoop Streaming 使用 Unix 標準的串流(streaming)當作 Hadoop 與使用者自行撰寫程式的介面,
實作上使用者可以使用其他程式語言來執行,如Pipe 指令、PHP、Ruby、Python、C++
與 R 等。
圖 6:使用 MapReduce 分析 FOAF 關鍵字
#Map Function
Map wc.map = function(., lines) {
foaf.text <-unlist(str_extract_all( matrix,tagpattern)) keyval(foaf.text,1)
} #Reduce Function Reduce
wc.reduce =function(word, counts ) { keyval(word, sum(counts)) }
#完整的 MapReduce 程式 MapReduce
mapreduce(input = input ,output = output, input.format = "text", map = wc.map, reduce = wc.reduce,combine = T)
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
23
4.2.2 R+MySQL分析(RMS Analytics)
在本研究中,利用MySQL 儲存 FOAF 資料,評估與測試 R 使用 MySQL 的極限。
我們將使用R 豐富的程式庫與函數分析統計 FOAF 資料,利用 FOAF 中 foaf:knows 的特 性與R 的社會網路分析工具(igraph)做方析,如圖 7。首先從 MySQL 的 RDF 資料中過 濾出foaf:knows 關係,作為成圖形中的 edgelist,再利用 igraph 提供的社會網路分析功 能計算集中度指標(degree Centrality ),之後增加 MySQL 的資料量,測試資料庫查詢的 時間,最後再與Hive 進行效能比較。
圖 7:R+MySQL 分析(RMS Analytics)架構圖
FOAF 檔案敘述自己與其他人之間的關係,包括名字(foaf:name)、認識(foaf:knows) 與email(foaf:mbox)等資料。藉由過濾出 foaf:name 字串,得到 Subject 與 Object 確認 Person
‧
間的關係,藉以找出網路中重要的個體與特性。常見的分析測量指標(Centrality)有 Degree (分支度)、Betweenness (中介中心性) 、Closeness (接近中心性)與 Eigenvector (特徵性) 等。1. 建立 MySQL 資料庫
從MySQL 建立資料庫,資料庫名稱為 btc。
SQL:
CREATE DATABASE btc;
2. 建立 btc2012 表格
本研究的實驗資料為N-Quads,是 N-Triples 加上 context 的擴展形式,組成格式為:
<subject> <predicate> <object> <context> .。
USE btc;
CREATE TABLE IF NOT EXISTS btc2012(
subject varchar(128), predicate varchar(128), object varchar(128), context varchar(128));
3. 載入資料至 btc2012 表格
#將本地目錄'/home/hduser/btc2012/data-1.nq'資料載入 table btc2012,使用' '(空白 #鍵) 區分欄位,第一次載入約7.8GB。
LOAD DATA LOCAL INFILE '/home/hduser/btc2012/data-1.nq' INTO table btc2012 FIELDS TERMINATED BY ' ';
4. R 結合 MySQL 與社會網絡分析(使用 igraph)
本研究使用R 的 igraph 程式庫,此程式庫提供各種社會網路分析計算工具。我們透 過RMySQL 得到 FOAF 認識的關係後,將資料轉換為 graph.data.frame,使用 igraph 產
‧
生社群網路的計算指標(Centrality Measures):
(1)R 使用 RMySQL 與 MySQL 連接
#使用 library library("DBI") library("RMySQL") library("igraph")
#Connect to MySQL
conn <- dbConnect(MySQL(), dbname = "btc", username="rmysql", password="rmysql") (2)找出學術單位的認識關係 SQL 語法
foaf_know_edu_query <- ("
SELECT subject,object FROM btc2012
WHERE `predicate` = '<http://xmlns.com/foaf/0.1/knows>'
AND subject LIKE '%edu%'
")
#excute mysql
foaf_know_edu_mysql_df = dbGetQuery(conn, foaf_know_edu_query)
(3)計算連接中間指標(Degree Centrality):
我們從7.8GB 資料中找出教育界的認識關係,使用分群函數與顏色區分不同群組,計算
連接中間指標,找出最大中間指標端點,標示出名稱與圖示。
(4)資料量擴充測試
初步資料使用為7.8GB,之後以 3000 萬筆資料(約 5GB)增加至 btc 資料庫,最後增加至 30GB,紀錄 MySQL 查詢工作所需時間,之後再與 Hive 的結果作比較。MySQL 載入資 料指令範例如下:
LOAD DATA LOCAL INFILE '/home/hduser/btc2012/data-5-30M-tail.nq' INTO table btc2012 FIELDS TERMINATED BY ' ';
其中'/home/hduser/btc2012/data-5-30M-tail.nq'是檔案資料,btc2012 是表格(table),欄位分 辨使用' '(空白字元)。
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
26
4.2.3 R+Hive分析(RH Analytics)
4.3.1 章節提到 R+Hadoop Streaming 分析(RHS Analytics)透過 Hadoop/MapReduce 架 構能夠處理大量的資料,卻只能做簡單的統計分析;反觀 R+MySQL 分析(RMS Analytics)
利用R 優秀的資料處理與統計能力,但是受限於本機的記憶體空間因素,只能處理有限
的資料。但無論是Hadoop Streaming 或是使用 RHadoop,要把問題轉換 MapReduce 的 程式架構與功能並不容易,因此我們在Hadoop/MapReduce 架構上面加上一層 Hive,R 再透過Rhive 程式庫與 Hive 連接,我們可以使用 R 介面與簡單的 HiveQL,Rhive 與 Hive 將查詢的工作轉換為MapReduce 任務。藉由 Hive,結合 Hadoop/MapReduce 與 R 兩者
的優點,不但可以處理大量的資料,而且可以作複雜的統計分析,我們稱作R+Hive 分
析(RH Analytics)分析,如圖 8。
圖 8:R+Hive 分析(RH Analytics)架構圖
首先將FOAF 資料上傳到 Hadoop cluster 的 HDFS,使用 R 介面透過 Rhive 與 Hive 連接,再用HiveQL 查詢 FOAF 資料,查詢結果傳遞給 R,igraph 程式庫計算大量資料
‧
啟動Hive 之後,依據 FOAF 的資料格式建立資料表格,包括 Subject、Object 與 Predicate 等欄位,再將 HDFS 的 FOAF 資料載入 Hive table。回到 R 介面,載入 Hadoop 與rhive 等相關程式庫,使用 rhive 連接 Hive server,以 foaf:knows 當作關鍵字,最後使 用Hive query language (HiveQL)查詢放在 Hive 的 FOAF 資料。得到 Hive 的查詢結果後,
得到兩者的認識關係,比照R+MySQL 分析(RMS Analytics)的分析方式轉為圖形的資料 框(dataframe)格式,最後再繪製 social network 相關圖形。
Hive 與 Hadoop/MapReduce、HDFS 1. FOAF 資料存放至 Hadoop HDFS
執行Hadoop HDFS 指令,把分析資料上傳至目錄/hdfs/btc2012:
hadoop fs –put file /hdfs/btc2012
2. 建立 Hive 資料庫
Hive 建立資料庫,資料庫名稱為 btc HiveQL:
CREATE DATABASE IF NOT EXISTS btc;
3. 建立 Hive 表格與資料目錄
本研究的實驗資料為N-Quads,是 N-Triples 加上 context 的擴展形式,組成格式為:
<subject> <predicate> <object> <context> .。我們使用外部表格(external table)的方式,指 定資料存放於Hadoop HDFS 的目錄 /hdfs/btc2012 位置。
HiveQL:
USE btc;
CREATE EXTERNAL TABLE IF NOT EXISTS btc2012(
subject STRING, predicate STRING, object STRING, context STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ' LOCATION '/hdfs/btc2012';
‧
從FOAF 資料的 predicate 欄位,選出包含 foaf:knows 的關鍵字,執行 HiveQL 時候,Hive 程式轉換HiveQL 變為 Hadoop/MapReduce 的工作。
HiveQL:
SELECT subject,object FROM btc2012
WHERE `predicate` = '<http://xmlns.com/foaf/0.1/knows>';
舉例來說,本研究找出subject 或是 object 為學術單位的認識關係,
HQL 語法為:
CREATE VIEW foaf_edu_knows AS SELECT subject,object FROM btc2012
WHERE `predicate` = '<http://xmlns.com/foaf/0.1/knows>' AND subject LIKE '%.edu%'
OR object LIKE '%.edu%';
R 結合 Hive 與社會網絡分析(使用 igraph) 1. R 使用 RHive 與 Hive 連接
在R 的介面中,使用 rhive 程式庫連接到 Hive,執行查詢工作或是 HDFS 的功能 rhive.connect(
host="192.168.1.66",port=10000, hiveServer2=TRUE, defaultFS=NULL, updateJar=FALSE, user='hive', password='hive')
rhive.hdfs.ls(path="/")
2. rhive 執行 HQL 語法,回傳結果為 dataframe 格式,再將 dataframe 轉換為 graph dataframe,指定 g 為 graph 物件。
foaf_know_relation_not_edu_df <- rhive.query("
SELECT subject,object FROM btc2012
WHERE `predicate` = '<http://xmlns.com/foaf/0.1/knows>' AND subject NOT LIKE '%edu%'
AND object NOT LIKE '%edu%'
")
g <- graph.data.frame(foaf_know_relation_df,directed = TRUE) #有向圖 3. R 與社會網路分析
igraph 程式庫提供許多社會網路分析的工具,先將 graph 物件 g 分成群組,並將不 同的群組使用不同的顏色代表,挑選章節4.2.2 提到計算指標(Centrality Measures)
‧
的最大數值,使用特定顏色與圖示大小表示Degree (分支度)、Betweenness (中介中 心性) 、Closeness (接近中心性)與 Eigenvector (特徵性)等,最後再繪製圖型輸出。
#分群 components = clusters(g)$membership
#colours = sample(rainbow( max( components )+ 1)) colours = (rainbow( max( components )+ 1))
V(g)$color = colours[ components +1]
#集中度計算
V(g)$degree <- degree(g) V(g)$bte <- betweenness(g) V(g)$clo <-closeness(g) V(g)eig <- evcent(g)
#標示出指標最高者-圖形大小
V(g)$size = V(g)$degree/(max(V(g)$degree)/5)+ .3
#標示出指標最高者-圖形顏色
V(g)$color[which( degree(g) == max(degree(g)), arr.ind = TRUE )] = "blue"
#圖形輸出
plot(g, layout = layout.fruchterman.reingold, vertex.size = V(g)$size, vertex.color = V(g)$color, vertex.label = V(g)$label, (RHS Analytics)
R+MySQL 分析
(RMS Analytics) R+Hive 分析 (RH Analytics)
主要機制
Hadoop Streaming (MapReduce 架 構,Key/Value 的方
Hadoop Streaming (MapReduce 架 構,Key/Value 的方