• 沒有找到結果。

第四章 方法架構設計

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 與其他節點的距離比

相關文件