第四章 方法架構設計
4.2 FOAF 分析
4.2.3 R+Hive 分析(RH Analytics)
國
立 政 治 大 學
‧
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 的方
資料類型 unstructured data structured data structured data
優點
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
30
第五章 系統實作
5.1 系統架構
本研究的目標有三部分,首先利用Hadoop/MapReduce 架構,從巨量的 RDF 資料中 作簡單的FOAF 資料統計分析;第二部分是 R 使用 MySQL 測試資料庫分析與儲存 FOAF 資料的能力與效能;第三部分是R 藉由 Hive,使用 HiveQL 操作處理進階的 FOAF 資料,
最後將結果回傳給R,透過 igraph 程式庫作社群網路分析,如圖 9。
圖 9:本研究系統實作架構圖
本研究的實驗流程如圖 10,淺綠色虛線方框為 R+Hadoop Streaming 分析(RHS Analytics) 程序,黑色數字是R+MySQL 分析(RMS Analytics)流程,最後的紅色數字為 R+Hive 分 析(RH Analytics)流程。
‧
本研究使用兩部PC建置Hadoop cluster 架構,PC分別命名為namenode與datanode1,
其中namenode 在 Hadoop 的腳色為為 Namenode 與 Datanode,另外一部則為單純的 Datanode,Hadoop 資料複製數量為 2,其餘參數使用 Hadoop 系統預定值,實驗環境的 硬體規格與軟體版本參數如表 5。
表 5:本研究系統實作規格
namenode datanode1 Hadoop cluster Hadoop 角色 Namenode
Datanode Datanode CPU AMD Athlon II
system ubuntu 13.04
64 bits ubuntu 13.04
RStudio Server 0.98.493 Rhive 2.0
RMySQL 0.9-3 igraph 0.71
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
32
從Namenode 觀察 Hadoop cluster 的運作狀態如圖 11。中間紅色方框表示 HDFS 容量為 1.78TB,使用的空間有 14.75GB,下紅色方框 Live Nodes:2,表示服務中的節點(Nodes) 有2 個,即為我們的 namenode 與 datanode1。
圖 11:Hadoop cluster 狀態
5.2 資料來源
本研究使用的資料來自於 Billion Triples Challenge 2012 Dataset[2]中 Timbl 的一部分,
為方便進行研究我們僅取其中約7.8 ~ 30GB 的資料集進行實驗,該資料集是以 Tim Berners-Lee 的 FOAF 檔案為源頭,使用網路機器人蒐集的 RDF 資料整理而來。資料集 資料格式為N-Quads,格式為:<subject> <predicate> <object> <context> .,當整合來自 不同來源的資料時,<context>通常指定為資料的來源。
圖 12:N-Quads Example
首先我們將資料集上傳至Hadoop HDFS 目錄的/hdfs/btc2012,共分為 data-1.nq ~ data-5.nq。使用指令 hadoop fs –ls /hdfs/btc2012 檢查檔案目錄,結果如下圖
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
33
圖 13:本研究系統資料容量
5.3 FOAF資料分析
為了驗證本研究假設的正確性,我們使用了系統實作的方式來驗證我們假設的可靠 度。
5.3.1 R+Hadoop Streaming分析(RHS Analytics)
我們以Hadoop Streaming 架構分析作為工具,使用 R 分別撰寫 MapReduce 架構中 的 mapper 與 reducer 功能程式,依據於前一章節所建構的分析方式來統計 FOAF 使用 的字彙頻率, 程式語法如下:
$HADOOP_HOME/bin/hadoop jar
$HADOOP_HOME/contrib/streaming/hadoop-streaming-1.2.1.jar \ -input /hdfs/umbc/umbc_foaf.csv \
-output output \
-mapper /home/hduser/umbc/foaf-mapper.R \ -reducer /home/hduser/umbc/foaf-reducer.R
‧
#!/usr/bin/env Rscript
# foaf-mapper.R - FOAFcount program in R
# script for Mapper (R-Hadoop integration)
# load the necessary libraries library(stringr)
#FOAF Pattern like "http://xmlns.com/foaf/0.1/nick"
foaf_pattern <- "http://xmlns.com/foaf/+[a-zA-Z0-9\\./_]+"
getFoafKey <- function(line) unlist(str_extract_all( line,foaf_pattern)) con <- file("stdin", open = "r")
while (length(line <- readLines(con, n = 1, warn = FALSE)) > 0) { words <- getFoafKey(line)
for (w in words)
cat(w, "\t1\n", sep="") } close(con)
foaf-mapper.R
#!/usr/bin/env Rscript
# foaf-reducer.R - FOAFcount program in R
# script for Reducer (R-Hadoop integration) splitLine <- function(line) {
val <- unlist(strsplit(line, "\t"))
list(word = val[1], count = as.integer(val[2])) } env <- new.env(hash = TRUE)
con <- file("stdin", open = "r")
while (length(line <- readLines(con, n = 1, warn = FALSE)) > 0) { split <- splitLine(line)
為驗證Hadoop Streaming 執行結果的正確性,我們先使用小量資料測試,再使用 Linux 文字搜尋處理工具程式,比較兩者的分析統計結果是否相同。我們執行 hadoop fs -cat 與 Linux 的 grep 與 wc 指令,並用 pipe 串連多個指令進行驗證。驗證方式如下:
hadoop fs -cat filename | #顯示 hadoop filename 的內容
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
35
grep "pattern" | #搜尋符合字串的資料 wc -l #統計字數
實際驗證方式如下:
hadoop fs -cat /hdfs/btc2012/data-1.nq | grep "<http://xmlns.com/foaf/0.1/name>" | wc -l
hadoop fs -cat /hdfs/btc2012/data-1.nq | grep "<http://xmlns.com/foaf/0.1/Person>" | wc -l
hadoop fs -cat /hdfs/btc2012/data-1.nq | grep "<http://xmlns.com/foaf/0.1/skypeID>" | wc -l
首先列印出hadoop streaming 的執行結果,如圖[8]的上半部,我們挑出 foaf:name、
foaf:Person、與 foaf:skypeID 等字彙統計次數,結果如紅色方框所示,分別為 192、154 與18;藍色方框則是使用 Hadoop 與 Linux 相關指令的驗證結果,兩者統計的 FOAF 字 彙結果相同,足以驗證hadoop streaming 程式的正確性,之後可以進行大量資料的分析 統計。
圖 14:使用小量資料驗證 Hadoop Streaming 分析的正確性
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
36
圖 15:R+MySQL 分析(RMS Analytics)使用時間與讀取資料量
‧
Order FOAF Vocabulary Frequency Percentage
1 http://xmlns.com/foaf/0.1/knows 2,611,386 13.196%
2 http://xmlns.com/foaf/0.1/Person 2,428,062 12.270%
3 http://xmlns.com/foaf/0.1/nick 2,288,336 11.564%
4 http://xmlns.com/foaf/0.1/name 1,370,057 6.923%
5 http://xmlns.com/foaf/0.1/homepage 1,323,942 6.690%
6 http://xmlns.com/foaf/0.1/mbox_sha1sum 1,316,500 6.653%
7 http://xmlns.com/foaf/0.1/weblog 971,758 4.911%
8 http://xmlns.com/foaf/0.1/member_name 935,970 4.730%
9 http://xmlns.com/foaf/0.1/tagLine 935,970 4.730%
10 http://xmlns.com/foaf/0.1/image 897,181 4.534%
11 http://xmlns.com/foaf/0.1/primaryTopic 473,701 2.394%
12 http://xmlns.com/foaf/0.1/maker 463,215 2.341%
13 http://xmlns.com/foaf/0.1/PersonalProfileDocument 450,798 2.278%
14 http://xmlns.com/foaf/0.1/Agent 442,420 2.236%
15 http://xmlns.com/foaf/0.1/OnlineAccount 440,741 2.227%
16 http://xmlns.com/foaf/0.1/accountName 440,741 2.223%
17 http://xmlns.com/foaf/0.1/accountProfilePage 439,863 2.215%
18 http://xmlns.com/foaf/0.1/account 438,385 2.215%
19 http://xmlns.com/foaf/0.1/accountServiceHomepage 438,366 2.152%
20 http://xmlns.com/foaf/0.1/interest 425,927 0.994%
21 http://xmlns.com/foaf/0.1/mbox_sha1 196,722 0.656%
22 http://xmlns.com/foaf/0.1/Document 129,878 0.179%
23 http://xmlns.com/foaf/0.1/familyName 35,481 0.143%
24 http://xmlns.com/foaf/0.1/givenName 28,329 0.142%
25 http://xmlns.com/foaf/0.1/topic 28,141 0.128%
26 http://xmlns.com/foaf/0.1/gender 25,310 0.090%
27 http://xmlns.com/foaf/0.1/img 17,727 0.077%
28 http://xmlns.com/foaf/0.1/Image 15,296 0.073%
29 http://xmlns.com/foaf/0.1/page 14,455 0.069%
30 http://xmlns.com/foaf/0.1/made 13,728 0.060%
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
38
分析效能部分,表 5 列出 namenode 與 datanode1 的設備等級並不相同,第一次使 用namenode 以 singlenode cluster 的方式進行分析,總運算時間為 129 分鐘,第二次使 用cluster(namenode + datanod1)架構,分析時間降低至 78 分鐘,分散式運算有效降低運 算時間。
對照表1 的 FOAF 字彙表中,代表 email 的意義有 mbox 與 mbox_sha1sum,代表人 名的有name、familyName(givenName)、firstName 與 lastName。mbox_sha1sum 使用 SHA1
方式代表個人的email,代表唯一性與隱私性,並可避免遭受垃圾郵件。我們從表格 5(共
19,788,786 筆資料)發現使用 mbox_sha1sum (第 6 名,1,316,500 次,占 6.653%),相同意 義的還有mbox_sha1(第 21 名,129,878 次,占 0.656%),email(693 次)、mailbox(654 次)、
mailbox_sha1sum(646 次),但是 mbox 並無出現任何次數。
關於個人的名字除name(第 4 名,占 6.923%)之外,還有 familyName(第 23 名,占 0.143%)、givenName(第 24 名,占 0.142%),其他還有 firstName(6,398 次)、lastName(5,610 次)、family_name(3,285 次)、givenname(2,237 次)、surname(1,384 次)、firstname(698 次)、
middleName(646 次)、given_name(645 次)、surename(7 次)、fistName(1 次)、maiden_name(1 次)。
從 mail 與 name 發現,除了 FOAF 字彙之外,部分字彙出現大小寫或是加上"-",拼 音錯誤(surename,正確為 surname)等與 FOAF 字彙不同的 predicate,甚至,可能是使用 人工編寫錯誤,若是使用foaf 編寫編輯介面或程式(如 FOAF-a-Matic),應該不會出現非 正規字彙。藉由分析統計FOAF 字彙的使用狀況,R+Hive 分析(RH Analytics)可以讀取 HDFS 的資料,使用 R 繪製 FOAF 字彙使用頻率相關圖型,也可提供 FOAF 有關單位日 後字彙的發展與改革。
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
39
5.3.2 R+MySQL分析(RMS Analytics)
我們利用R 提供的 RMySQL 與 igraph 程式庫處理分析 FOAF 資料,首先使用 RMySQL 連結 MySQL,RMySQL 連接 MySQL 執行 SQL 查詢工作,並將資料轉換成 R 的dataframe 格式,呼叫 igraph 的社會網路分析功能,找出 degree 最高者(黃色),並畫 出social network 圖形。之後增加 MySQL 的資料量,評估與測試系統的極限。
本研究查詢的SQL 語法:
SELECT subject,object FROM btc2012
WHERE `predicate` = '<http://xmlns.com/foaf/0.1/knows>' AND subject LIKE '%edu%'
執行最大的IN-degree 是 V(g)[max(V(g)$degree)]$name
[1] "_:httpx3Ax2Fx2Fsatiredunx2Elivejournalx2Ecomx2Fdatax2Ffoafxxbnode3"
圖 16:Degree(最大為黃色圓圈)關係圖
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
40
5.3.3 R+Hive分析(RH Analytics)
我們利用R 提供的 rhive 與 igraph 程式庫處理分析 FOAF 資料,首先使用 rhive 連 結Hive,Hive 執行 HQL 轉換成 Hadoop 的 MapReduce 工作,並將資料轉換成 R 的 dataframe 格式,呼叫 igraph 的社會網路分析功能,包括 Betweenness (中介中心性)、
Closeness (接近中心性)與 Eigenvector centrality (特徵性)等分析。從 degree distribution 圖 17 與 Cluster size 圖 18 中都發現 Zipf’s distributions[15]的現象。
圖17:Degree distribution 圖
圖18:Culster size 圖
‧
Degree Centrality
http://www.w3.org/People/djweitzner/public/foaf.rdf 該作者 Daniel J. Weitzner[5],是 MIT CSAIL Decentralized Information Group 主席,作者認識 38 個人(out-degree),計算結果 degree(undirected)為 336,共有 296 人的 foaf 檔案敘述認識作者,但是作者不一定認識 對方。這現象與實際狀況相同,名人認識部分的人,但是有更多的人都認識該名人,如 圖 19。
R Command:
> V(g)[max(V(g)$degree)]
[1] "<http://www.w3.org/People/djweitzner/public/foaf.rdf#djw>"
> max(V(g)$degree ) [1] 336
Between Centrality
Between Centrality 的定義是:兩個非相鄰接的端點間的互動依賴於網絡中的其他端點,
特別是位於兩端點之間路徑上的那些端點。http://my.opera.com/Misseducation 位於所有 教育單位之間最短路徑的比例最高,對於教育界的影響力最大,符合現實狀況,如圖 20。 R Command::
V(g)[bte>=1100000]$name
[1] "<http://my.opera.com/Misseducation/xml/foaf#me>"
Closeness Centrality
結果與Between Centrality 相同,http://my.opera.com/Misseducation 與其他節點的距離比
結果與Between Centrality 相同,http://my.opera.com/Misseducation 與其他節點的距離比