第二章 研究背景
2.3 R
備整合資料處理及統計功能,包括線性與非線性模型(linear and nonlinear modelling)、統 計檢定方法( statistical tests)、時間序列分析(time-series)、分類(classification)與集群分析 (clustering)等分析方法,以及陣列、矩陣的算與繪圖工具,同時也是一種語法簡單的程 方式,主要可以分為平行處理、網格運算(Grid Computing)、Hadoop/MapReduce 等解決 方法。
常見的平行處理方式包括MPI(Message Passing Interface),是一種電腦或節點(Node)
在叢集(cluster)環境的管理通訊標準,使用者的程式可以同時在許多電腦上執行,啟動
平行分散式運算,有效提升執行效率。另一個是SNOW(Simple Network of Workstations),
採用Master / Slave cluster 架構,提供高階的溝通介面給 Master 來管理 Slave 工作站。
平行處理可以有效提升R 的運算效率,但是 cluster 繁雜的設定與管理,通常是 R 使用
者進入平行處理的障礙,使用者本身必須對於cluster 有深度的了解,才能有效的使用 R
的平行處理機制
另一個方式是 Hadoop/MapReduce 架構,主要的概念是把一件工作拆解成許多小工作,
最後再將小工作的輸出合併成為單一結果,有效的使用平行化技術處理大量的資料,主 流的技術有Hadoop Streaming、RHIPE 與 RHadoop 等方式,待章節 3.3 再作詳細說明。
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
7
圖 3:R 使用介面圖:Console(上)與 RStudio(下)
‧
FOAF(Friend of A Friend)是一種以 RDF 為基礎架構,描述個人和他們的社會網絡關 係,包括自己的名字、電子郵件信箱、個人喜好與認識的朋友等資訊。我們可以利用 FOAF-a-Matic [20]製作 FOAF 資料,命名為 foaf.rdf,放到適當的網站讓所有人可以公開 下載,網路上的搜尋機器人可以發現這個檔案,並且利用檔案內容中的rdfs:seeAslo 發 現其他的FOAF 檔案,藉以串成整個社群網路。底下為 foaf.rdf 的範例。
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
xmlns:foaf="http://xmlns.com/foaf/0.1/">
<foaf:Person>
<foaf:name>Leigh Dodds</foaf:name>
<foaf:firstName>Leigh</foaf:firstName>
<foaf:surname>Dodds</foaf:surname>
<foaf:mbox_sha1sum>71b88e951cb5f07518d69e5bb49a45100fbc3ca5</foaf:mbox_sha1sum
>
<foaf:knows>
<foaf:Person>
<foaf:name>Dan Brickley</foaf:name>
<foaf:mbox_sha1sum>241021fb0e6289f92815fc210f9e9137262c252e</foaf:mbox_sha1sum
> <rdfs:seeAlso
rdf:resource="http://rdfweb.org/people/danbri/foaf.rdf"/>
</foaf:Person>
</foaf:knows>
</foaf:Person>
</rdf:RDF>
FOAF 從 OWL(Web Ontology Language)借用反函數屬性 Inverse Functional Property (IFP) [13]的概念,一個反函數屬性是一個簡單的概念,它的數值標識唯一個資源。如果 一個屬性P 被標記爲反函數(InverseFunctional),那 麽對於所有的x、 y 和 z,P(y,x) and P(z,x) implies y = z。舉例來說,若 y、z 代表不同的實例,x 為身分證號碼。如果 y、z
兩人具有相同的身分證號碼(x),那麼可以推斷這兩個實例指的是同一個人。
‧
複的foaf:name,卻不可能會有相同的 email 或是社群網路帳號,FOAF 定義代表個人的 唯一識別符號(unique identifiers)如下:
foaf:aimChatID foaf:homepage foaf:icqChatID foaf:jabberID foaf:mbox
foaf:mbox sha1sum foaf:msnChatID foaf:weblog foaf:yahooChatID
文獻[18]利用唯一識別符號(unique identifiers)特性,從多個社群網站蒐集 FOAF 檔 案,使用OWL 推理引擎並使用與 foaf:knows 與 FOAF inverse property,進而從不同的 FOAF 檔案,推論得到同一個使用者。研究主要分析:
(1) Network Statistics:平均最短路徑(average shortest path length)
(2) Account Statistics:多個社群網路的使用者帳號數量分析,如長尾理論結果。
(3) Friendship Statistics:少數擁有多個帳號的使用者,具有良好的連結能力,位居各社 群網路的核心與溝通橋梁。
另外文獻[10]從網路蒐集的 FOAF 檔案分成 blog 與非 blog 兩類,主要分析:
(1) FOAF 文件中所使用的 foaf:mbox/ foaf:dateOfBirth 與
foaf:mboxsha1sum/foaf:homepage,後者比較沒有隱私的疑慮,因此出現的頻率較高。
(2) FOAF 文件使用 foaf:knows / rdfs:seeAlso 與其他 FOAF 文件相連接,blog 網站使用 的頻率比非blog 網站較為頻繁。
(3) 結合網路上不同的 FOAF 檔案,拼湊完整的個人資料。
(4) Social network analysis,網路由多少人(foaf:name)所組成,分析統計入/出分支度 (in/out-degree)、Patterns of Connected Components 等。
‧
Agent age nick publications
Person made (maker) mbox currentProject name primaryTopic
(primaryTopicOf) homepage pastProject
title Project weblog account
img Organization openid OnlineAccount depiction
(depicts) Group jabberID accountName
familyName member mbox_sha1sum accountServiceHomepage givenName Document interest PersonalProfileDocument knows Image topic_interest tipjar
based_near topic (page) sha1
workplaceHomepage thumbnail workInfoHomepage logo schoolHomepage
資料來源:http://xmlns.com/foaf/spec/
3.2 社會網路分析(Social Network Analysis,SNA)
社會網絡分析是依據數學方法與圖論等理論為基礎,分析與計算個人與團體組織之 間的關係,藉以找出網路中重要的個體與特性。常見的分析測量指標[14]有 Degree centrality(分支度)、Betweenness centrality(中介中心性)、Closeness centrality(接近中心性) 與Eigenvector centrality(特徵性)等。
Degree centrality (分支度):
(1) 定義:在圖上與頂點相連的邊數為分支度,是圖形中最簡單的測量指標。
(2) 意義:若為有向圖(directed graph)則分入/出分支度(in/out-degree),in-degree 是 incoming edges 的數量,out-degree 則是 out-going edges 的數量;若為無向圖(undirected graphs),total degree = in-degree + out-degree。degree 主要是評估團體組織中的核心人物,
degree 比較高的節點(vertex)表示與其他個體的往來較為頻繁,擁有較高的影響力。
‧
Betweenness centrality (中介中心性):
(1) 定義:是指所有節點之間的最短距離通過該節點的次數。
(2) 意義:因為該點對於網路上的其他節點而言,等於是兩者之間的最短路徑。具有 Betweenness 較高的節點,代表在網路上資訊流通影響力比較大。
∑
< Closeness centrality(接近中心性):
(1) 定義:是指該節點與圖中其它所有點的路徑之距離總和。
Eigenvector centrality(特徵性):
(1) 定義:該節點的評估指標由所有連接的節點決定。
(2) 意義:是 Degree Centrality 的改良方法,也稱作 Bonacich Power Centrality[3],對於 一樣擁有相同的degree Centrality 的兩個節點來說,不同的相鄰的節點可能有不同的影 響力。舉例來說,認識十個普通人與認識十個企業家的影響力可能不一樣。分析這種通 過與具有高度值的相鄰節點所獲得的間接影響力。
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
12
1 ) (
) ,
(
I R
1R
C α β
=α
−β
− 公式(4)α is a scaling vector, which is set to normalize the score.
β reflects the extent to which you weight the centrality of people ego is tied to.
R is the adjacency matrix (can be valued) I is the identity matrix (1s down the diagonal) 1 is a matrix of all ones.
另外小世界網路(small world networks / small world phenomenon),也稱作六度分隔理論
(Six Degrees of Separation),原始理論是 Milgram 1967 準備數百封的相同收件人的信件,
隨機交給陌生人傳遞,平均需要經過6 次轉寄過程。之後引申的意義是世界上原先不認
識的兩個人,只要中間經過少數人就能建立聯繫關係。
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
13
3.3 R與Hadoop的整合
在R 尚未導入與 Hadoop/MapReduce 技術之前,R 的平行處理架構扮演分析大量資 料的重要角色,相關的package 如 rmpi、 nws、snow、sprint、foreach、multicor 等,但 是即使使用多核心cpu 與叢集(cluster)的平行處理技術,仍然無法提供複雜分析巨量資料 的能力。Hadoop/MapReduce 是一個功能強大的程式架構,可以有效處理儲存在 HDFS 系統的大量資料,但是對於慣用R 的使用者來說,需要另外熟悉 Hadoop/MapReduce 的 語法與操作,解決方式是可以在R 的環境直接使用 Hadoop/MapReduce。R 與 Hadoop 的結合有許多方式,主要包括RHadoop[26]、RHIPE[8]與 Hadoop Streaming。
3.3.1 RHadoop
RHadoop 是 Revolution Analytics 研發的一個開放原始碼計畫,提供 R 程式開發人 員強大的工具來分析儲存在Hadoop 的資料。RHadoop 提供了一個的 R 程式程式庫 rmr,
其主要的目標是提供的map-reduce 開發人員簡單、效率、優雅的方式撰寫 Map Reduce
作業。使用rmr 程式庫撰寫的程式碼可能只需要使用 Java 語言的一半,同時維持程式碼
的可讀性,具備可重用和可擴展等特色。提供開發人員於原有熟悉的R 環境下,使用
MapReduce 架構處理大量的資料。
除了rmr 提供 MapReduce 程式框架之外,另外還有 rhdfs 和 rhbase 等程式庫。rhdfs 提供基本的連接到Hadoop HDFS,開發人員可以瀏覽、讀取、寫入和修改存儲在 HDFS 中的文件;rhbase 使用 Thrift server 提供 HBASE 基本連接,開發人員可以瀏覽,讀取,
寫入和修改存儲在HBASE 表。 rmr 程式庫程式提供 Hadoop 的抽象層概念,開發人員 只需要專注於大量資料的分析,不用注意分散式處理程序、系統容錯與平行處理等事 務。
‧
words = unlist(words.list)return( keyval(words, 1) ) //回傳字元,數值為 1 }
#定義 reduce 函數
wc.reduce = function(word, counts) {
keyval(word, sum(counts)) //計算字元總和 }
#wordcount 主程式
# mapreduce(input, output, input.format, map,reduce,combine)
#指定參數 input, output, map, reduce and input.format wordcount = function (input, output = NULL) {
mapreduce(input = input , output = output,
input.format = "text", map = wc.map, reduce = wc.reduce)}
RHadoop WordCount 程式範例
‧
RHIPE 代表 "R and Hadoop Integrated Programming Environment",提供 Hadoop 與 R 緊密結合的介面,實現直接使用 R 來分析巨量資料。RHIPE 是一個 R 的程式庫(Library),
允許使用R 執行 MapReduce 的工作。
RHIPE 是以 Hadoop Streaming 為基礎,並加強檔案處理能力部分功能,如提供二進 制檔案。R 程式開發人員可以在 R 的環境,直接存取 HDFS 的檔案並在 Hadoop cluster 執行MapReduce 的工作。RHIPE 使用 Google protocol buffers 作為資料的輸出介面,支
援多數的R 資料型態,除增加效率外並容易整合其他程式語言。
RHIPE 運作時,每個 DataNode 都必須安裝 R、Protocol Buffers 與 RHIPE。以 RHIPE 運作過程為例,首先由rhcp、rhdel、rhls 等功能與 HDFS 進行檔案複製、刪除與列表,
使用rhmr 和 rhex 指令執行 MapReduce 工作,最後使用 rhstatus 觀察 R 運作的狀態,或
rhget Copying from the HDFS Moves files from the HDFS to a local directory.
rhgetkey Get Value Associated With a Key In A Map File rhinit Initialize RHIPE
rhjoin Wait For A MapReduce Job rhkill Kill A MapReduce Job
rhload Load an RData from the HDFS.
rhls List Files On HDFS
rhmr Prepares a MapReduce Job For Execution rhoptions Get or Set RHIPE Options
rhput Put a file unto the HDFS
rhread Read Key/Value Pairs From The HDFS rhsave Save .RData to HDFS
rhsave.image save.image to HDFS
rhstatus Report Status Of A MapReduce Job
‧
rhsz Serialize and Unserialize See Details.
rhuz Serialize and Unserialize See Details.
rhwatch Start and Monitor Status of a MapReduce Job
rhwrap Macro to Wrap Boilerplate Around RHIPE Map code rhwrite Write R data to the HDFS
#RHIPE WordCount 程式範例
#載入 RHIPE library
words_vector<-unlist(strsplit(unlist(map.values)," ")) lapply(words_vector,function(i) rhcollect(i,1))
}) #定義 Reduce function
‧
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 的