新興學科科學知識圖譜繪制的大數據挖掘方法和實現 -1
金刀客
0. 科學知識圖譜
0.1 科學知識圖譜概念
學知識圖譜(下簡稱知識圖譜)是以科學文獻知識為對象,以文獻計量學、信息計量學、網絡計量學、知識計量學和科學計量學的理論方法為基礎,顯示學科或領域發展進程與結構關系的一種圖形,具有“圖”和“譜”的雙重性質與特征,是一種復雜網絡結構圖。知識圖譜作為一種有效的、綜合性的可視化分析方法和工具,被廣泛應用並取得了較可靠的結論,被越來越多的學者所重視。通過知識圖譜較形象、定量、客觀、真實地顯示一個學科的結構、熱點、演化與趨勢,無疑為學科的基礎研究提供了一種新的視角。
與一般計算機圖的結構相比,復雜網絡的復雜性最主要表現在節點數目龐大,通常達到幾千甚至幾萬個。因此,復雜網絡的結構比一般的計算機圖的結構要復雜得多。復雜網絡可以用來描述人與人之間的社會關系、物種之間的捕食關系、計算機之間的網絡聯接、詞與詞之間的語義聯系、科學家之間的合作關系、科研文章之間的引用關系,以及網頁的鏈接結構等等。
科學知識圖譜主要用於對研究熱點、研究前沿、研究趨勢、知識結構和科學領域結構進行探索。研究前沿是正在興起的理論趨勢和新主題的涌現,共引網絡則組成了知識基礎。在分析中可以利用從文獻題目、摘要等部分提取的突發性術語與共引網絡的混合網絡來進行分析。
研究熱點可以認為是在某個領域中學者共同關注的一個或者多個話題,從“研究熱點”的字面理解,它具有很強的時間特征。一個專業領域的研究熱點保持的時間可能有長有短,在分析時要加以注意。
關於學科領域結構的研究視角,筆者認為最直接的方法是是使用科學領域的貢獻網絡進行分析,但這些結果是宏觀的,還可以結合期刊的共被引聚類進行分析。
目前應用領域主要集中在圖書館與檔案管理、管理科學與工程、安全科學以及教育學等領域。
0.2 知識圖譜主要工具
圍繞科學知識圖譜的繪制,學者和工程師們開發了很多有用的繪制工具,如Citespcae、Bibexcel、Pajek、Ucinet、HistCite和Sci2等
軟件名稱 | 開發者 | 功能描述 | 推薦指數 |
---|---|---|---|
CiteSpace | Chaomei Chen | 科學計量與可視化分析 | ★★★★★ |
VOSViewer | Van Eck, N.J | 科學計量與可視化分析 | ★★★★★ |
SCI2 | Katy Borner團隊 | 科學計量與可視化分析 | ★★★★★ |
SciMat | M.J.Cobo,A.G | 科學計量與可視化分析 | ★★★★ |
Loet_Tools | Leydesdorff | 科學計量與可視化分析 | ★★★★ |
BibExcel | Olle Persson | 科學計量與可視化分析 | ★★★★ |
HistCite | Eugene Garfield | 科學計量與引證網絡 | ★★★★ |
CiteNetExplore | Van Eck, N.J等 | 引證網絡及可視化 | ★★★★★ |
Publish or Perish | Anne Wil Harzing | 谷歌學術數據采集及分析 | ★★★ |
Mapequation | Daniel Edler等 | 網絡及演化的可視化 | ★★★ |
Gephi | 網絡可視化分析 | ★★★★★ | |
Pajek | V Batagelj等 | 網絡可視化分析 | ★★★★★ |
NetDraw | Borgatti, S.P | 網絡可視化分析 | ★★★ |
Cyoscape | 網絡可視化分析 | ★★★ | |
Ucinet | Borgatti, S.P | 網絡文件的統計分析 | ★★★ |
BICOMB | 崔雷等 | 矩陣的提取和統計 | ★★★ |
SATI | 劉啟元 | 矩陣的提取和統計 | ★★★ |
Carrot2 | Audilio Gonzales | 輔助文本可視化 | ★★★ |
Jigsaw | John Stasko團隊 | 輔助文本可視化 | ★★★ |
GPS Visualizer | 輔助地理可視化 | ★★★ |
0.3 CiteSpace
CiteSpace 是國際著名信息可視化專家、美國德雷塞爾大學(Drexel_University)信息科學與技術學院陳超美教授和團隊研發的一款用於分析和可視共現網絡的Java應用程序。CiteSpace近年來在中國廣泛使用,大連理工大學等多所中國院校使用CiteSpace展開了不同程度的研究,並將國內的CNKI、CSSCI等數據源成功應用到了CiteSpace中。
有學者認為,根據引文半衰期的明顯不同,科學文獻可分為持續高被引的經典文獻和在短暫時間內達到被引峰值的過渡文獻。研究前沿可以被理解為過渡文獻,知識基礎則是這些過渡文獻的引文。CiteSpace就是利用“研究前沿術語的貢獻網絡”、“知識基礎文章的同被引網絡”、“研究前沿術語引用知識基礎論文網絡”這三個網絡隨着時間演變來尋找研究熱點和趨勢,並用可視化方式展示出來。
CiteSpace最初以Webof Science導出的題錄數據為主要數據源,探討科學文獻可視化的模式和發展趨勢。使用的題錄字段主要有:Author(作者)、Title(標題)、Abstract(摘要)、Keyword(關鍵字)、Country(國家)、Institution(機構)、Reference_Cited(參考文獻)、Journal(期刊)、Category(分類)等。
CiteSpace不僅適用於自然科學領域還適用於社會科學領域,但自然科學的新理論、新發現要比社會科學相對頻繁,研究內容變化幅度要比社會科學相對較大,變化趨勢較容易捕捉。
0.4 Bibexcel
Bibexcel軟件是瑞典於默奧大學(Umeå_University)Olle_Persson教授設計開發的一款軟件,主要用於輔助用戶分析書目數據或者格式相近的自然語言文本,生成的數據文件可導出到Excel或其他可以處理Tab鍵隔開數據的程序中。Bibexcel是免費軟件,包括一系列工具,這些工具一些可以在程序窗口中看到,一些被設置在菜單中。
Bibexcel軟件與其幫助文檔均可從於默奧大學官方網站進行下載,http://www.soc.umu.se/english/research/bibexcel/。早期在Windows系統中安裝Bibexcel軟件需要將Bibexcel程序放在C:\bibexcel目錄下,但現在可以將其放在任何磁盤和目錄下。Bibexcel還可以在Linux系統利用“wine”命令進行運行。如果運行中需要附加文件,可以根據提示在互聯網中進行下載。
Bibexcel利用湯森路透旗下Web_of_Science平台中的SCI、SSCI和A&HCI3個引文庫中的數據進行分析,也可以轉換其他格式的數據。利用Bibexcel可以進行文獻計量分析(bibliometric)、書目計量分析(bibliometry)、引文分析(citation_analysis)、共引分析(co-citation)、文獻共享(shared_references)、書目耦合(bibliographic_coupling)、聚類分析(cluster_analysis)、繪制文獻圖譜(prepare_bibliometric_maps)等。
Bibexcel軟件可視化功能不夠強大,但是研究人員可以將輸出數據應用到Pajek、Ucinet、NetDraw或者SPSS中。Bibexcel軟件只能得到共現矩陣,可以生成作者合作、文獻共引的共現文件,可以將這些文件轉換成Pajek(免費軟件)可用的文件,以便利用其進行分析和可視化。Bibexcel還可以為Pajek生成clu-files和vec-files。
0.5 Pajek
Pajek在斯洛文尼亞語中是“蜘蛛”的意思。Pajek軟件是有斯洛文尼亞盧布爾雅納大學的Vladimir Batagelj和Andrej Mrvar兩位教授共同編寫的免費軟件。
下載地址:http://mrvar.fdv.uni-lj.si/pajek/
wos2pajek(以下簡稱w2p)是pajek 的作者Vladimir_Batagelj為了更加有效的處理wos上的記錄數據而開發出的一款小程序,用它可以對從wos上下載的全紀錄進行預處理,生成若干直接用pajek進行分析的文件,如果沒有這款軟件,用pajek對大型引文網絡的分析將是幾乎不可能的(不排除還有其他軟件,但我目前還不知道)。目前w2p目前最新的版本是0.8版wos2pajek8.zip,下載地址:http://vlado.fmf.uni-lj.si/pub/networks/pajek./WoS2Pajek/default.htm
費弗爾(Jurgen Pfeffer)編寫了兩個Windows應用程序,用於幫助創建Pajek網絡文件。Txt2pajek 下載地址:http://www.pfeffer.at/txt2pajek/
Pajek軟件的結構基於六大數據類型:
- (1)Networks(網絡)Networks主要對象是結點和邊,數據文件的默認擴展名是.net。
- (2)Partitions(分區)Partition指明了每個結點分別屬於哪個區,數據文件的默認擴展名是.clu。
- (3)Permutations(排序)Permutations將結點重新排列,數據文件的默認擴展名是.per。
- (4)Cluster(類)Cluster是指結點的子集,數據文件的默認擴展名是.cls。
- (5)Hierarchy(層次)Hierarchy是指按層次關系排列的結點,數據文件的默認擴展名是.hie。
- (6)Vectors(向量)Vectors是指每個結點具有的數字屬性(實數),數據文件的默認擴展名是.vec。
Pajek可以讀取多種純文本格式的網絡數據或含有未格式化文本(ASCII)的文件,Pajek2.0以上版本還支持Unicode UTF-8編碼格式的標簽,這可以讓用戶用任何語言文字系統來編輯標簽。
創建Pajek數據輸入文件有多種方法,用戶可以在Pajek軟件中手動創建,可以利用輔助軟件創建,還可以利用關系型數據庫創建。
Pajek軟件操作基本流程:
- (1)在Pajek軟件中選擇Network—Create Random Network—Total No. of Arcs命令生成一個含指定數量頂點但不含連線的網絡文件,然后在字處理軟件中編輯頂點標簽和增加連線即可;
- (2)Jurgen Pfeffer編寫了兩個Pajek輔助軟件createPajek.exe和txt2Pajek.exe,前者可以從Microsoft Excel工作表中讀取數據,后者可以從純文本文件中讀取數據,比前者提供了更靈活的設置和選項,運算速度也比前者快;
- (3)Pajek官網提供了一個Microsoft Acess空白數據庫模板(network.mdb),用戶可以構建1-Mode和2-Mode網絡所需的“表”、“查詢”、“報表”三種內容。
Pajek可處理結點數高達百萬的大型網絡,同時具有網絡分析和可視化功能,還可以將一個大型網絡分解為多個、可以獨立顯示的子網絡,有助於進行進一步的精確分析;它還為使用者提供了有效的分析算法和強大的可視化工具,提供給了一個可視化的界面,幫助用戶更加直觀地了解各種復雜網絡的結構。
與其他社會網絡可視化軟件相比較,Pajek具有以下特點:
- (1)快速有效
一個算法的復雜度主要表現時間復雜度和存儲空間復雜度兩個方面。Pajek為用戶提供了一整套快速有效的、分析復雜網絡的算法,用以計算和分析數以萬計結點數的大型復雜網絡。 - (2)可視化
Pajek為用戶提供了一個界面友好的可視化平台。用戶不僅可以快速繪制出一張網絡圖,還可以根據自己的需要對網絡圖進行精細調整,從而允許用戶從視覺的角度更加直觀的分析復雜網絡特性。 - (3)抽象化
Pajek可以將復雜網絡的全局結構進行抽象,將聯系緊密的結點歸為一類。每個類看成一個整體,將它作為新的結點得到一個新的網絡圖。新的網絡圖中各個類之間通過少數幾條邊相連接,可以很容易看出整個網絡的整體結構。
0.6 Ucinet
Ucinet(University_of_California_at_Irvine_NETwork)是目前流行一種功能強大的社會網絡分析軟件,它最初由加州大學歐文(Irvine)分校的社會網絡研究學者Linton_Freeman編寫,后來主要由美國波士頓大學的Steve_Borgatti和英國威斯敏斯特大學(Westminister_University)的Martin Everett 維護更新。下載地址:http://www.analytictech.com/downloaduc6.htm。
該軟件集成了一維和二維數據分析工具NetDraw、三維數據分析工具Mage,同時集成了用於大型網絡分析的Pajek。利用UCINET可以讀取文本文件、數據語言數據(DL)、初始數據(RAW)、KrackPlot、Pajek、Negopy、VNA等格式的文件,還能讀取Excel數據,但Ucinet處理的Excel數據最多只能有255列。利用Ucinet可以輸出數據語言數據(DL)、初始數據(RAW)、Excel數據和圖形。
Ucinet包括大量的網絡分析指標(如中心度,二方關系凝聚力測度,位置分析算法,派系的探查等),隨機二方關系模型(stochastic_dyad_models),對網絡假設進行檢驗的程序(包括QAP 矩陣相關和回歸,定類數據和連續數據的自相關檢驗等),還包括一般的統計和多元統計分析工具,如多維量表multidimensional_scaling),對應分析(correspondence_analysis)、因子分析(factor_analysis)、聚類分析(cluster_analysis)、多元回歸(multiple_regression)等。除此之外,UCINET 還提供大量數據管理和轉換的工具,可以從圖論程序轉換為矩陣代數語言。
Ucinet可以處理32767個網絡節點,但從實際操作來看,當節點數在5000~10000之間時,一些程序的運行就會很慢。在Ucinet6.0中,全部數據都用矩陣形式存儲、展示和描述。
Ucinet提供大量的數據管理和轉換工具,如選擇子集、合並數據集、序化、轉化或者記錄數據。Ucinet不包含可視化的過程,但是它與軟件Mage、NetDraw和Pajek集成在一起,從而能夠實現可視化。NetDraw是簡單的繪制網絡圖的工具,它可以讀取Ucinet系統文件、Ucinet文本文件、Pajek文本文件等。它可以同時處理多種關系,並可以根據結點的特性設置結點的顏色、形狀和大小,並可做數據分析,如中心性分析、子圖分析、角色分析等,也具有很強的矩陣運算能力,是一個非常靈活的可視化軟件。
Ucinet在進行任何分析之前,必須創建一個Ucinet數據集。Ucinet有三種常用數據結構:初始數據文件(Raw Data File)、Excel文件數據、數據語言文件(DL File):
- (1)初始數據文件(Raw_Data_File),僅僅包含數字,不包含數據的行數、列數、標簽、標題等信息,因而只能以矩陣的形式輸入。
- (2)Excel文件數據,可以通過Excel數據進行編輯,但最多能支持65536行和255列。
- (3)數據語言文件(DL_File),包含一系列數字(數據)、描述數據的很多關鍵詞和語句等,都是關於數據的基本信息。數據文件正文的內容一定要用DL表明該文件是數據文件。DL數據文件的格式還有全矩陣格式、長方形矩陣、多個矩陣、對角線缺失值矩陣、左半矩陣或者右半矩陣、塊矩陣、關聯列格式等。各個形式的矩陣都有表示矩陣類型的關鍵字和輸入模式。
1. 大數據分析和挖掘簡介
1.1 數據挖掘
大數據分析的基礎是數據挖掘。數據挖掘的基本任務包括分類與預測、聚類分析、關聯規則、時序模式、偏差檢測和智能推薦等。本過程為:定義目標、數據采集、數據整理、構建模型、模型評價和模型發布。數據挖掘建模過程如圖所示:
定義數據挖掘目標
針對具體的挖掘應用需求,首先明確本次挖掘目標,要達到的挖掘效果。
- 數據抽樣
對數據進行抽樣需要注意相關性、可靠性和有效性。衡量采樣數據質量的標准包括:資料完整無缺、數據准確無誤、隨機抽樣、等距抽樣、分成抽樣、順序抽樣和分析類抽樣
- 數據探索
數據探索分為:數據質量分析和數據特征分析
數據質量分析包括:缺失值分析、異常值分析、數據一致性分析
數據特征分析包括:分布分析、對比分析、統計量分析、周期分析、貢獻度分析和相關性分析
- 數據預處理
數據預處理主要包括:數據清洗、數據集成、數據變換、數據規約
數據清洗主要是刪除原始數據集中的無關數據、重復數據,平滑噪聲數據,篩選數據,處理缺失和異常值等。
數據集成是將多個數據源合並放在一個一致的數據存儲(如數據倉庫)中的過程。
數據變換主要是對數據進行規范化處理,將數據轉換為“適當的”形式,以適用於數據挖掘任務及算法的需要。常用的數據變換方法有:簡單函數變換、規范化、連續屬性離散化、屬性構造和小波變換等。
數據規約可以降低無效、錯誤數據對模型的影響,提高建模的准確性;縮減數據挖掘所需時間;降低存儲數據成本。其方法主要有:屬性規約和數值規約。
- 構建模型
經過數據探索和數據預處理,得到可以直接建模的數據。根據挖掘目標和數據形式可以建立分類與預測、聚類分析、關聯規則、智能推薦等模型。
這四種模型在學科知識圖譜繪制的過程中都有涉及。
- 模型評價
模型評價的目的就是從建立的各種模型中找出最好的模型,並根據業務要求對模型進行解釋和應用。分類與預測模型的評測方法是:用沒有參與建模的評測數據集評價預測的准確率。模型預測效果評價通常用相對絕對誤差、平均絕對誤差、根均方差、相對平方根誤差等指標來衡量。聚類分析根據樣本數據本身將樣本分組。其目標是,組內的對象相互之間是相似的(相關的),而不同組的對象是不同的(不相關的)。組內相似性越大,組間差別越大,聚類效果越好。
- 可視化展示
1.2 大數據挖掘
大數據指無法在一定時間內用常規軟件工具對其內容進行處理的數據集。大數據主要特點是4V,即數據量大(Volumn)、數據類型復雜(Variety)、數據處理數據塊(Velocity)、數據真實性高(Veracity)。大數據分析是指不用隨機分析法(抽樣調查),而采用所有數據進行分析處理。(《大數據時代》)。大數據技術包括大規模並行處理數據庫、大數據挖掘、分布式文件系統、分布數據庫、雲計算平台等等。
在大數據處理上,Hadoop已經成為事實上的標准。幾乎所有的大型軟件提供商都采用Hadoop作為其架構基礎。Spark作為用來替代Map_Reduce的大數據內出計算框架,也是目前流行的框架。后面我們會對這兩種技術分別作以介紹。
2 大數據處理技術
2.1 Hadoop大數據平台
Hadoop是Apache基金會旗下的一個開源分布式計算平台。Hadoop以分布式文件系統HDFS和Map_Reduce為核心,為用戶提供系統底層細節透明的分布式基礎架構。分布式文件系統HDFS的高容錯性、高伸縮性等優點允許用戶將Hadoop部署在低廉的硬件上,形成分布式文件系統;MapReduce分布式編程模型允許用戶在不了解分布式系統底層細節的情況下開發並行應用程序。所以用戶可以利用Hadoop輕松地組織計算機資源,簡便、快速地搭建分布式計算平台,並且可以充分利用集群的計算和存儲能力,完成海量數據的處理。
Hadoop2.x版本包含以下模塊:Hadoop通用模塊,支持其他Hadoop模塊的通用工具集;Hadoop分布式文件系統Hadoop_HDFS,支持對應用數據高吞吐量訪問的分布式文件系統;Hadoop_YARN,用於作業調度和集群資源管理的框架;Hadoop_MapReduce,基於YARN的大數據平行處理系統。
Hadoop生態系統主要包括:Hive、HBase、Pig、Sqoop、Flume、Zookeeper、Mahout、Spark、Storm、Shark、Phoenix、Tez、Ambari等。下圖為Hadoop的整個生態系統。
- Hive:用於Hadoop的一個數據倉庫系統,提供類似於SQL的查詢語言,通過使用該語言,可以方便地進行數據匯總,特定查詢以及分析存放在Hadoop兼容文件系統中的大數據。
- HBase:一種分布的、可伸縮的、大數據存儲庫,支持隨機、實時讀寫訪問
- Pig:分析大數據集的一個平台,該平台由一種表達數據分析程序的高級語言和對這些程序進行評估的基礎設施一起組成。
- Sqoop:為高效傳輸批量數據而設計的一種工具,其用於Hadoop和結構化數據存儲數據庫如關系數據庫之間的數據傳輸。
- Flume:一種分布式的、可靠的、可用的服務,其用於高效搜集、匯總、移動大量日志數據
- Zookeeper:一種集中服務,其用於維護配置信息,命名,提供分布式同步,以及提供分組服務。
- Mahout:一種基於Hadoop的機器學習和數據挖掘的分布式計算框架算法集,實現了多種MapReduce模式的數據挖掘算法。
- Spark:一個開源的數據分析集群計算框架,最初由加州大學伯克利分校AMPLab實驗室開發。Spark與Hadoop一樣,用於構建大規模、低延時的數據分析應用。Spark采用Scala語言實現,使用Scala最為應用框架。
- Shark:即Hive on Spark, 一個專門為Spark打造的大規模數據倉庫系統,兼容Apache Hive。無需修改現有的數據,就可以實現相對於Hive SQL100倍的提升。Shark支持 Hive查詢語言、元存儲、序列化格式以及自定義函數、與現有Hive部署無縫集成,是一個更快、更強大的替代方案。
- Phoenix:一個構建在HBase之上的SQL中間層,完全使用Java編寫,提供一個客戶端可嵌入的JDBC驅動。
- Tez:一個基於Hadoop YARN之上的DAG(有向無環圖)計算框架。它把Map/Reduce過程拆分成若干個子過程,同時可以把多個Map/Reduce任務組合成一個較大的DAG任務,減少MapReduce之間的文件存儲。同時合理組合其子過程,減少任務的運行時間。
- Ambari:一個供應、管理和監視Hadoop集群的開源框架,它提供一個直觀的操作工具和一個健壯的Hadoop API, 可以隱藏復雜的Hadoop操作,使集群操作大大簡化。
2.1.1 HDFS分布式文件系統
Hadoop分布式文件系統(HDFS)被設計成適合運行在通用硬件上的分布式文件系統。它和現有的分布式文件系統有很多共同點,但也有很明顯的區別。HDFS是一個高容錯的系統,適合部署在廉價的機器上。HDFS能提供高吞吐量的數據訪問,非常適合大規模數據集上的應用。HDFS放寬了一部分POSIX約束,來實現流式讀取文件系統數據的目的。HDFS開始是作為Apache Nutch搜索引擎項目的基礎架構而開發的,目前HDFS是Hadoop Core的一個重要部分。
HDFS采用master/slave架構。一個HDFS集群是由一個Name_Node和一定數量的Data_Node組成的。Name Node是中心服務器,負責管理文件系統的名字空間(name_space)以及客戶端對文件的訪問。集群中的Data Node一本是一個節點,負責管理它所在的存儲。HDFS暴露文件系統的名字空間,用戶能夠以文件的形式在上面存儲數據。從內部看,一個文件其實被分為一個或多個數據塊,這些數據塊存儲在一組Data_Node上。Name_Node執行文件系統的名字空間操作,例如打開、關閉、重命名文件或目錄。它也負責確定數據塊到具體Data_Node節點映射。Data_Node負責處理文件系統客戶端的讀寫請求。在Name_Node的統一調度下進行數據塊的創建、刪除和復制。HDFS架構如下圖所示:
HDFS數據上傳過程如下:
-
- Client端發送一個添加文件到HDFS請求給Name_Node
-
- Name Node告訴Client端如何來分發數據塊以及分發的位置
-
- Client端把數據分為塊(block),然后把這些塊分發到Data_Node中
-
- Data_Node在Name Node的指導復制這些塊,保持冗余
2.1.2 MapReduce工作原理
Hadoop_MapReduce是一個快速、高效、簡單用於編寫並行處理大數據程序並應用在大集群上的編程框架。其前身Google公司MapReduce,MapReduce是Google公司的核心計算模型,它將復雜、運行於大規模集群上的並行計算過程高度地抽象到兩個函數:Map和Reduce。適合用MapReduce來處理的數據集,需要滿足一個基本要求:待處理數據可以分解成許多小的數據集,並且每個小數據集都可以完全並行地進行處理。概念“Map”(映射)和“Reduce”(規約),都是從函數式編程中借用的,同時也包含從矢量編程中借來的特性。Map_Reduce極大方便了編程人員在不會分布式並行編程的情況下,將自己的程序運行在分布式系統上。
一個Map_Reduce作業通常會把輸入的數據集且分為若干獨立的數據塊,由map任務以完全並行的方式處理它們。框架會對map的輸出先進行排序,然后把結果輸入給reduce任務。通常,作業的輸入和輸出都會被存儲在文件系統中。整個框架負責任務的調度和監控,以及重新執行已經失敗的任務。
通常,MapReduce框架的計算節點和存儲節點是運行在一組相同的節點上的,也就是說,運行MapReduce框架和運行HDFS文件系統的節點通常是一起的。這種配置允許框架在那些已經存好數據節點上高效地調度任務,這可以使整個集群的網絡帶寬被非常高效的利用。
MapReduce框架包括一個主節點(Resource_Manager)、MRAppMaster(每個任務一個)和多個子節點(Node_Manager)共同組成。應用程序至少應該指明輸入/輸出的位置(路徑),並通過實現合適的接口或抽象類提供map和reduce函數,再加上其他作業的參數,就構成了作業配置。Hadoop的job client提交作業和配置信息給Resource_Manager,后者負責分發這些軟件和配置信息給slave、調度任務且監控它們的執行,同時提供狀態和診斷信息給job_client。
雖然Hadoop框架是用Java實現,但MapReduce應用程序則不一定用Java,可以使用Ruby、Python和C++來編寫。MapReduce框架流程圖如圖所示。
Map階段
:
- InputFormat根據輸入文件產生鍵值對,並傳送到
Mapper類
的map函數
中; - Map輸出鍵值對到一個沒有排序的緩存內存中;
- 當緩沖內存到達給定值或map任務完成,在緩沖內存中的鍵值對就會被排序,然后輸出到磁盤中的溢出文件;
- 如果有多個溢出文件,那么就會整合這些文件到一個文件,並排序;
- 這些排序過的、在溢出文件中的鍵值對會等待Reducer的獲取。
Reduce階段
:
- Reducer獲取Mapper的記錄,然后產生另外的鍵值對,最后輸出到HDFS中;
- shuffle:相同的key被傳送到同一個Reducer中
- 當有一個Mapper完成后,Reducer就開始獲取相關數據,所有的溢出文件會被排序到一個內存緩沖區中
- 當內存緩沖區滿了后,就會產生溢出文件到本地磁盤
- 當Reducer所有相關的數據都傳輸完成后,所有溢出文件就會被整合和排序-+
- Reducer中的reduce方法針對每個key調用一次
- Reducer的輸出到HDFS
2.1.3 YARN工作原理
經典的Map_Reduce的最嚴重的限制主要關系到可伸縮性、資源利用和對與MapReduce不同的工作負載的支持。在Map_Reduce框架中,作業執行受到兩種類型的進程控制:一個稱為Job_Tracker的主要進程,它協調在集群上運行的所有作業,分配要在Task_Tracker上運行的map和reduce任務。另一個就是許多Task_Tracker的下級進程,它們運行分配的任務並定期向Job_Tracker報告進出。
為了解決該瓶頸,Yahoo工程師提出了一種新的架構YARN(MPv2).YARN是下一代Hadoop計算平台,主要包括Resource_Manager、Application_Master、Node_Manager,其中Resource_Manager用來代替集群管理器,Application_Master代替一個專用且短暫的Job_Tracker, Node_Tracker代替Task_Tracker。
YARN最核心的思想就是將Job_Tracker兩個主要的功能分離成單獨的組件,這兩個功能是資源管理和任務監控和調度。新的資源管理器全局管理所有應用程序計算資源的分配,每個應用的Application_Master負責響應的調度和協調。一個應用程序要么是一個單獨的傳統的Map_Reduce任務或者是一個DAG(有向無環圖圖)任務。Resource_Manager和每一台機器的節點管理服務器(Node_Manager)能夠管理用戶再那台機器的進程並能對計算進行組織。事實上,每個應用的Application_Master是一個特定的框架庫,它和Resource_Manager來協調資源,和Node_Manager的協同工作以運行和監控任務。
Resource_Manager有兩個重要的組件:Scheduler和Application_Manager。
-
Scheduler負責分配資源給每個正在運行的應用,同時需要注意Scheduler是一個單一的分配資源的組件,不負責監控或者跟蹤任務狀態的任務,而且它不保證重啟失敗任務。
-
Application_Manager注意負責接受任務的提交和執行應用的第一個容器Application_Master協調,同時提供當任務失敗時重啟的服務。
客戶端提交任務到Resource_Manager的Application_Manager,然后Scheduler在獲得集群各個節點的資源后,為每個應用啟動一個Application_Master,用於執行任務。每個Application_Master啟動一個或多個Container用於實際執行任務。
2.1.4 HBase
HBase是一個分布式的、面向列的開源數據庫,該技術來源於Fay_Chang所撰寫的Google論文“Bigtable:一個結構化數據的分布式存儲系統”。就像Bigtable利用了Google文件系統(File_System)所提供的分布式數據存儲一樣,HBase在Hadoop之上提供了類似於Bigtable的能力。HBase是Apache的Hadoop項目的子項目。HBase不同於一般的關系數據庫,它是一個適合於非結構化數據存儲的數據庫。另一個不同的是HBase基於列的而不是基於行的模式。
HBase是Google_Bigtable的開源實現,類似Google_Bigtable利用GFS作為其文件存儲系統,HBase利用Hadoop_HDFS作為其文件存儲系統;Google運行Map_Reduce來處理Bigtable中的海量數據,HBase同樣利用Hadoop_MapReduce來處理HBase中的海量數據;Google_Bigtable利用 Chubby作為協同服務,HBase利用Zookeeper作為對應。
上圖描述Hadoop_EcoSystem中的各層系統。其中,HBase位於結構化存儲層,Hadoop_HDFS為HBase提供了高可靠性的底層存儲支持,Hadoop_MapReduce為HBase提供了高性能的計算能力,Zookeeper為HBase提供了穩定服務和failover故障恢復機制。
此外,Pig和Hive還為HBase提供了高層語言支持,使得在HBase上進行數據統計處理變的非常簡單。 Sqoop則為HBase提供了方便的RDBMS數據導入功能,使得傳統數據庫數據向HBase中遷移變的非常方便。
2.1.5 Impala
Impala是Cloudera公司主導開發的新型查詢系統,它提供SQL語義,能查詢存儲在Hadoop的HDFS和HBase中的PB級大數據。已有的Hive系統雖然也提供了SQL語義,但由於Hive底層執行使用的是MapReduce引擎,仍然是一個批處理過程,難以滿足查詢的交互性。相比之下,Impala的最大特點也是最大賣點就是它的快速。Impala架構如下所示:
其優點:
-
- Impala不需要把中間結果寫入磁盤,省掉了大量的I/O開銷。
-
- 省掉了MapReduce作業啟動的開銷。MapReduce啟動task的速度很慢(默認每個心跳間隔是3秒鍾),Impala直接通過相應的服務進程來進行作業調度,速度快了很多。
-
- Impala完全拋棄了Map_Reduce這個不太適合做SQL查詢的范式,而是像Dremel一樣借鑒了MPP並行數據庫的思想另起爐灶,因此可做更多的查詢優化,從而省掉不必要的shuffle、sort等開銷。
-
- 通過使用LLVM來統一編譯運行時代碼,避免了為支持通用編譯而帶來的不必要開銷。
-
- 用C++實現,做了很多有針對性的硬件優化,例如使用SSE指令。
-
- 使用了支持Data_locality的I/O調度機制,盡可能地將數據和計算分配在同一台機器上進行,減少了網絡開銷。
2.2 Spark大數據計算引擎
Apache_Spark是專為大規模數據處理而設計的快速通用的計算引擎。它也是本書使用的核心計算框架,幾乎所有的流程都在該框架完成。
Spark是UC_Berkeley_AMP_lab(加州大學伯克利分校的AMP實驗室)所開源的類Hadoop_MapReduce的通用並行框架,Spark擁有Hadoop_MapReduce所具有的優點;但不同於MapReduce的是——Job中間輸出結果可以保存在內存中,從而不再需要讀寫HDFS,因此Spark能更好地適用於數據挖掘與機器學習等需要迭代的Map_Reduce的算法。Spark主要特點是進行內存計算,但即使必須在磁盤上進行復雜計算,Spark也比Map_Reduce更加高效。
Spark適用於各種各樣的分布式應用場景,如批處理、迭代計算、交互式查詢、流處理。通過在一個統一的框架支持這些不同的計算,Spark使我們可以簡單而低耗的把各種流程整合在一起。
Spark提供豐富的借口。Spark除提供基於Pyton、Java、Scala、R和SQL等語言的簡單易用的API還內建了豐富的函數庫,還可以和其他大數據工具密切配合使用。如spark可以運行在Hadoop集群上,本書就是用這種模式。
Spark 主要有三個特點:
- 高級 API 剝離了對集群本身的關注,Spark 應用開發者可以專注於應用所要做的計算本身。
- Spark 很快,支持交互式計算和復雜算法。
- Spark 是一個通用引擎,可用它來完成各種各樣的運算。
Spark的基本架構如下圖所示:
Spark可以分為Spark_Core、Spark_SQL、Spark_Streaming、Spark_GraphX、Spark_MLlib和集群管理器組成。
2.2.1 Spark Core
Spark_Core實現了Spark的基本功能,包括任務調度、內存管理、錯誤恢復和與存儲系統交互等模塊。Spark Core中還包括對彈性分布式數據集(RDD)API定義。RDD表示分布在多個計算節點上可以並行操作的元素集合,是Spark主要的編程抽象。它提供了創建和操作這些集合的多個API。
2.2.2 Spark SQL
Spark_SQL是Spark用來操作結構化數據的程序包。通過它我們可以使用SQL或Hive版本的HQL來查詢數據。Spark SQL提供多種數據源,比如Hive表和JSON等。除了為Spark提供一個SQL接口,它還支持開發者將SQL和傳統的RDD編程數據操作方式相結合,無論Scala、Pyton還是JAVA,開發者都可以在單個應用中同事使用SQL和復雜的數據分析。
2.2.3 Spark Streaming
Spark_Streaming提供了對實時數據進行流式計算的組件,如日志或隊列消息等。Spark_Streaming提供了用來操作數據流的API,並且與RDD_API高度對應。
2.2.4 Spark MLlib
Spark_MLlib是Spark提供的機器學習功能庫。MLlib提供了多種機器學習算法,包括分類、回歸、聚類和協同過濾等,還提供了模型評估、數據導入等額外的功能支持。MLlib還提供了一些更底層的機器學習原語,包括一個通用的梯度下降優化算法。所有這些方法都被設計為可以在集群上輕松伸縮的架構。
2.2.5 Spark GraphX
Spark_GraphX是用來操作圖(如社交關系圖)的程序庫,可以進行並行的圖計算。GraphX也擴展了RDD_API,能用來創建一個頂點和邊都包括任意屬性的有向圖。GraphX還支持針對圖的各種操作,比如進行圖分割subgraph和操作所有與頂點map_Vertices,以及PageRank和三角計數等。
2.2.6 集群管理器
對於底層而言,Spark被設計成可以高效在一個到數千個計算節點之間進行伸縮計算。為了實現這樣的要求,同時獲得最大的靈活性,Spark支持在各種集群管理器上運行,如Hadoop_Yarn、Apache_Mesos、以及Spark自有的簡單調度器。本書采用的就是Yarn集群管理器,它也是目前主流的集群管理器。
3 大數據挖掘方法
大數據挖掘基本可繼續使用數據挖掘中成熟的方法,但要在實現中體現大數據海量存儲和分布式、並行化處理的特點。常用的方法是有:統計學分析、分類和回歸分析、聚類分析、圖分析和關聯規則分析等。
3.1 大數據分析統計學方法
Spark中的mllib.stat.Statistcs類中提供了幾個常用的統計學函數包括:統計綜述、平均值、求和、相關矩陣、皮爾森獨立性測試。
- Statistics.colStats(rdd) 計算由向量組成的RDD的統計性綜述,包括:每列的最小值、最大值、平均值和方差,信息十分豐富。
- Statistics.corr(rdd, method) 計算由向量組成的RDD中的列間的相關矩陣,可以使用皮爾森或斯皮爾斯曼相關中的一種
- Statistics.corr(rdd1, rdd2, method) 計算兩個由浮點組成的RDD的相關矩陣,可以使用皮爾森或斯皮爾斯曼相關中的一種
- Statistics.chiSqTest(rdd)計算由LabeledPoint對象組成的RDD中每個特征與標簽的皮爾森獨立性測試結果。返回一個ChiSqTestRest對象,其中有p值、測試統計以及每個特征的自由度。
另外還有mean(), stdev(), sum(), sample(), sample_By_Key等統計函數
3.2 大數據分類和回歸分析
分類與回歸是監督學習的兩種主要形式。監督學習指算法嘗試使用有標簽的訓練數據根據對象的特征預測結果。分類是預測分類編號(離散屬性),回歸主要是建立連續值函數模型,預測給定自變量對應的因變量的值。常用的分類和回歸算法有:回歸分析、決策樹、隨機森林、貝葉斯網絡和支持向量機。
分類和回歸都會使用MLlib中的labelPoint類。這個類在mllib.regression包中。一個LabelPoint其實就是一個label(label總是一個Double值,但也可以為分類算法設為離散整數如二元分類中MLlib標簽為0或1;多元分類中,MLlib預測標簽范圍從0到C-1, C為分類數)
MLlib中包含多個分類和回歸方法,其中常用的是簡單的線性方法、決策樹方法和決策森林方法。
3.2.1 線性回歸
線性回歸是回歸中的一種常用方法,指用特征的線性組合來預測輸出值。MLlib支持L1和L2的正則回歸,通稱為Lasso和ridge回歸。
線性回歸算法可以使用的類包括:
- mllib.regression.LinearRegressionWithSGD
- LassoWithSGD
- RidgeRegressionWithSGD(SGD稱為梯度下降算法)
可以優化的參數有
- numIterations:迭代次數(默認:100)
- stepSize:梯度下降的步長(默認:1.0)
- intercept:是否給數據加上一個干擾特征或偏差特征(默認:false)
- regParam:Lasso和Ridge的正則化參數(默認:1.0)
調用算法的方式在Scala中為:
import org.apache.spark.mllib.regression.LableedPoint
import org.apache.spark.mllib.regression.LinearRegressionWithSGD
val points: RDD[LabeledPoint] =
val lr = new LinearRegressionWithSGD().setNumIterations(200).setIntercept(True)
val model = lr.run(points)
println("weight: %s, intercept: %s".format(model.weights, model.intercept))
一旦訓練完成,將返回LinearRegressionModel都會包含一個predict函數,可以用來對單個特征向量預測一個值。RidgeRegressionWithSGD和LassoWithSGD相類似,並且會返回一個類似的模型。事實上這種通過setter方法調節算法參數,然后返回一個帶有predict方法的Model對象的模式在MLlib中十分常見。
3.2.2 邏輯回歸
邏輯回歸是一種二分類方法,用來尋找一個分隔陽性和陰性的線性分隔平面。在MLlib
中,它接受組標簽為0和1的LabeledPoint
,返回可以預測新點的分類的LogisticsRegressionModel
對象。
邏輯回歸算法API和線性回歸API十分相似,卻別在於兩種用來解決邏輯回歸的算法:SGD
和LBFGS
。LBFGS
一般是最好的,這個算法通過mllib.classification.LogisticRegressionWithLBFGS
和mllib.classification.LogisticRegressionWithSGD
類提供給用戶,接口和LinearRegressionWithSGD
相似,接受的參數這完全一樣。這個算法得出的LogisticRegressionModel
可以為每個點求出一個在0-1之間的得分,之后會基於一個閾值返回0或1的類別。默認閾值為0.5。可以通過setThreshold
設置閾值,可以通過clearThreshold
清除閾值。
3.2.3 支持向量機
支持向量機是一種常用的分類方法,使用SVMWithSGD
類參數與前面相似,返回SVMModel
和LogisticRegressionModel
一樣使用閾值進行預測。支持向量機被認為是最好的現成分類器,但在大數據計算中卻很少使用,因為運算量太大。
3.2.4 朴素貝葉斯
朴素貝葉斯是一種多元分類算法,它使用基於特征的線性函數計算講一個點分到各類中的得分。MLlib中實現了多項貝葉斯算法,需要非負頻次作為輸入特征。使用mllib.classification.NaiveBaye
類進行分類。它支持一個參數lambda用來進行平滑。可以使用一個LabeledPoint
組成的RDD調用朴素貝葉斯算法,對於C個分類。返回的NaiveBayesModel
讓我們可以使用predict()
預測對某個點最合適的分類,也可以訪問訓練好的模型的兩個參數:各特征與各分類的可能性矩陣theta以及表示先驗概率的C維向量pi
3.2.5 決策樹和決策森林
決策樹是一個靈活的模型,可以用來進行分類,也可以用來進行回歸。決策樹以節點樹的形式表示,每個節點基於數據的特征作出一個二元決策,而每個樹的葉子節點包含一個預測結果。
在MLlib中使用mllib.tree.DecisionTree
類中的靜態方法trainClassifier()
和trainRegressor()
來訓練決策樹。和其他有些算法不同的是,不適用setter方法定制DecisionTree
對象。可調整參數包括:
- data :LabeledPoint組成的RDD
- numClasses:使用類別數量
- impurity:節點不純凈度測量分類為gini或entrogy,回歸為variance
- maxDepth:樹最大深度(默認為5)
- maxBins:構建各節點將數據分到多少個箱子(推薦:32)
- categoricalFeaturesInfo:一個映射表,用來指定哪些特征是分類的,以及每個多少各類。
- numTree:構建樹的數量,提高可以降低過度擬合可能性
- featureSubsetStrategy:每個節點上作決定需要考慮的特征數量,auto、all、sqrt、log2以及onethird中選擇,數字越大話費計算越大。
3.3 大數據降維
3.3.1 主成分分析
主成分分析(PCA)會將特征映射到低維空間,讓數據在低維空間表示的方差最大化,從而忽略一些無用的維度。要計算出映射,我們要構建出正則化的相關矩陣,並使用這個矩陣的奇異向量和奇異值。與最大部分奇異值和對應的奇異向量可以用來重建原始數據的主要成分。使用mllib.linalg.distributed.RowMatrix類表示矩陣,然后存儲為一個Vector組成的RDD,每行一個。下面例子投影RDD包含原始RDD中的points的二維版本,可以用於作圖或進行其他MLlib算法如進行聚類。
import org.apache.spark.mllib.linalg.Matrix
import org.apache.spark.mllin.linalg.distributed.RowMatrix
val points: RDD[Vector] = //….
val mat: RowMatrix = new RowMatrix(points)
val pc:Matrx = mat.computePricipalComponents(2)
//投影到低維
val projected = mat.multiply(pc).rows
//在低維進行聚類運算
val model = Kmeans.train(projected, 10)
3.3.2 奇異值分解
奇異值分解也是一種行之有效的降維方法。MLlib提供奇異值分解(SVD)方法。
對於大型矩陣,通常不需要進行完全分解,只需要分解出靠前的奇異值與對應的奇異向量即可。這樣可以節省存儲空間、降噪,並有利於恢復低秩矩陣。
在MLlib中調用RowMatrix類的computeSVD方法
//計算前二十個奇異值
val svd: SingularValueDecomposition[RowMatrix, Matrix] =
mat.computSVD(20, compute=true)
val U:RowMatrix = svd.U
val s: Vector = svd.s
val V: Matrix =svd.V
3.4 基於大數據挖掘的科學知識圖譜繪制系統架構
基於大數據挖掘的科學知識圖譜繪制系統架構如下圖所示:
該系統包括期刊論文元數據抓取、數據預處理、數據存儲、大數據分析和大數據可視化等幾個模塊。后面會對幾個模塊進行詳細介紹。