• 沒有找到結果。

第三章 相關研究

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 的方

相關文件