金刀客html
對於數據預處理須要使用天然語言處理理論、方法和工具。java
天然語言處理(簡稱NLP)是計算機科學領域與人工智能領域中的一個重要方向。它研究能實現人與計算機之間用天然語言進行有效通訊的各類理論和方法。天然語言處理是一門融語言學、計算機科學、數學於一體的科學。所以,這一領域的研究將涉及天然語言,即人們平常使用的語言,因此它與語言學的研究有着密切的聯繫,但又有重要的區別。天然語言處理並非通常地研究天然語言,而在於研製能有效地實現天然語言通訊的計算機系統,特別是其中的軟件系統。於是它是計算機科學的一部分。天然語言處理總體技術體系以下圖所示:python
最先的天然語言理解方面的研究工做是機器翻譯。1949年,美國人威弗首先提出了機器翻譯設計方案。20世紀60年代,國外對機器翻譯曾有大規模的研究工做,耗費了鉅額費用,但人們當時顯然是低估了天然語言的複雜性,語言處理的理論和技術均不成熱,因此進展不大。主要的作法是存儲兩種語言的單詞、短語對應譯法的大辭典,翻譯時一一對應,技術上只是調整語言的同條順序。但平常生活中語言的翻譯遠不是如此簡單,不少時候還要參考某句話先後的意思。
大約90年代開始,天然語言處理領域發生了巨大的變化。這種變化的兩個明顯的特徵是:
(1)對系統輸入,要求研製的天然語言處理系統能處理大規模的真實文本,而不是如之前的研究性系統那樣,只能處理不多的詞條和典型句子。只有這樣,研製的系統纔有真正的實用價值。
(2)對系統的輸出,鑑於真實地理解天然語言是十分困難的,對系統並不要求能對天然語言文本進行深層的理解,但要能從中抽取有用的信息。例如,對天然語言文本進行自動地提取索引詞,過濾,檢索,自動提取重要信息,進行自動摘要等等。mysql
同時,因爲強調了「大規模」,強調了「真實文本」,下面兩方面的基礎性工做也獲得了重視和增強。
(1)大規模真實語料庫的研製。大規模的通過不一樣深度加工的真實文本的語料庫,是研究天然語言統計性質的基礎。沒有它們,統計方法只能是無源之水。
(2)大規模、信息豐富的詞典的編制工做。規模爲幾萬,十幾萬,甚至幾十萬詞,含有豐富的信息(如包含詞的搭配信息)的計算機可用詞典對天然語言處理的重要性是很明顯的。
經常使用的天然語言處理框架有:git
名稱 | 模塊 | 語言 |
---|---|---|
Stanford NLP | 最著名的NLP框架。包括多種語言的各方面NLP模塊:英文詞根化、中文分詞、詞性標註、名詞識別、語法分析等等 | Java、Python |
NLTP | 使用普遍的開源NLP框架。包括衆多NLP模塊、多種語料庫:英文詞根化、詞性標註、名詞識別和語法分析等對於中文分詞須要調用Standford NLP實現 | Python |
哈工大Ltp3 | 中文領域最著名對的NLP框架,包括全面的NLP模塊:中文分詞、詞性標註、名詞識別、句法分析、語義角色標註等等 | C++ |
Fudan NLP | 復旦大學的NLP處理框架中文分詞和句法分析等 | Java |
HanLP | 開源NLP處理框架中文分詞、句法分析等 | Java |
數據預處理主要包括中文和英文預處理兩部分。github
數據預處理具體使用的天然語言處理中的包括中文分詞、英文詞根化、去停用詞和特殊字符等方法。其中最難處理的是中文分詞,下面對其進行簡介。
漢語天然語言處理有別於英文天然語言處理的重要部分就是中文分詞(Chinese Word Segmentation)。中文分詞經常使用的方法分爲兩大類:web
分詞方法 | 規模 | 編程語言 |
---|---|---|
ICTCLAS分詞系統 | 大規模中文分詞系統 | C++ |
結巴分詞 | 小規模 | Python |
Ltp | 中等規模 | C++、python |
Stanford NLP | 大規模 | Java |
本書使用Spark調用Stanford NLP中的分詞方法,進行中文分詞。安裝JDK開發環境,下載Stanford NLP工具包 Stanford CoreNLP 3.6版,及下載包括中文在內的所有語言包,就能夠在spark項目中添加stanfoud-chinese-corenlp-model.jar,使用Stanford NLP工具包進行分詞。
下面使用HanLP說明一下分詞原理,它和ICTCLAS分詞原理基本相似。
ICTCLAS分詞算法源於隱馬爾科夫模型(HMM)。其中核心代碼爲NShortSegment類的segSentence方法:算法
@override public List<Term> segSentence(char[] sentence){ WordNet wordNetOptimum = new WordNet(sentence); WordNet wordNetAll = new WordNet(sentence); //1.粗分 List<List<Vertex>> coarseResult = BigSegment(sentence, 2, wordNetOptimum, wordNetAll); boolean NERexists = false; for(List<Vertex> vertexList : coarseResult){ if(HanLP.Config.DEBUG){ System.out.println("粗分結果" + convert(vertexList, false)); } //2. 實體名識別 if(config.ner){ wordNetOptimum.addAll(vertexList); int preSize = wordNetOptimum.size(); if(config.nameRecognize){ PersonRecognition.Recognition(vertexList, wordNetOptimum, wordNetAll); } if(config.translatedNameRecongnize){ translatedPersonRecogniztion.Recognition(vertexList, wordNetOptimum, wordNetAll); } if(config.japaneseNameRecognize){ JapanesePersonRecognition.Recognition(vertexList, wordNetOptimum, wordNetAll); } if(config.placeRecognize){ PlaceRecongnition.Recognition(vertexList, wordNetOptimum, wordNetAll); } if(config.organizationRecognize){ vertexList = Dijkstra.compute(GenerateBiGraph(wordNetOptimum)); wordNetOptimum.addAll(vertexList); organizationRecognition.Recognition(vertexList, wordNetOptimum, wordNetOptimum); } if(!NERexists && preSize != wordNetOptimum.size()){ NERexists = true; } } } //3.細分階段 List<Vertex> vertexList = coarseResult.get(0); if(NERexists){ Graph graph = GenerateBiGraph(wordNetOptimum); vertexList = Dijkstra.compute(graph); if(HanLP.Config.DEBUG){ System.out.printf("細分詞網:\n%s\n", wordNetOptimum); System.out.printf("細分詞圖: %s\n", graph.printByTo()); } } //識別數字 if(config.numberQunantifierRecognize){ mergeNumberQuantifier(vertexList, wordNetAll, config); } //若是是索引模式則所有切分 if(config.indexMode){ return decorateResultForIndexMode(vertexList, wordNetAll); } //4. 詞性標準階段 if(config.speechTagging){ speechTagging(vertexList); } return convert(vertexList, config.offset); }
英文數據預處理主要包括:提取詞元(token)、詞根化(stemming),保留表情、標籤等特殊符號,去停用詞,咱們是NLTK來完成這一過程。完整的英文數據預處理過程如圖4.5所示。sql
圖4.5 英文數據預處理過程shell
JSON是一種在網絡上特別是JavaScript常用的一種數據存儲格式,屬於輕量級數據交換格式。
JSON與XML對好比下圖所示:
使用Python的pymysql模塊對Scrapy爬蟲爬取的數據保存到MySQL數據庫中,病進行數據庫操做。將Scrapy爬取的數據存入MySQL中須要修改pipelines.py,修改代碼以下所示:
import pymysql class MysqlPipeline(object): def __init__(self): # 連接MySQL數據庫 self.conn = pymysql.connect( host="127.0.0.1", user="root", passwd="pass", db="mysqldb") def process_item(self, item, spider): # 獲取到的name和keywd分別賦給變量name和變量key name = item["name"][0] key = item["keywd"][0] # 構造對應的SQL語句 sql = "insert into mytb(title, keywd) VALUES ('" + name + "', '" + key + "')" # 經過query實現執行對應的sql語句 self.conn.query(sql) return item def close_spider(self, spider): self.conn.close() ITEM_PIPELINES = { 'mysqlpjt.pipelines.MysqlpjtPipeline': 300, }
修改亂碼問題,在c:\Python3.5\Lib\site-packages\pymysql目錄下找到名爲connections.py。而後將文件中「charset=」,改成對應的編碼「utf8」,即:Charset=’utf8’。
本書項目獲得的數據是海量的沒法用傳統的方式進行存取,所以須要對大數據的有效的存儲方法。對於大非結構化數據能夠存儲在Hadoop的HDFS系統中;如使用如HBase的分佈式數據庫來存儲。既提升了存儲效率,也爲後期使用Hadoop平臺進行大數據計算作好了準備。
HBase是一個分佈式、面向列的開源數據庫,利用HBase技術能夠在廉價的PC服務器上搭建大規模結構化存儲集羣。HBase思想來源於Google的BigTable思想HBase利用Hadoop_MapReduce來處理海量數據,利用Zookeeper做爲其系統服務。
HBase具備如下特色:
(10) 支持監控信息經過Hadoop子系統導出達到文件
此外,Pig和Hive爲HBase提供了高層的語言支持,使得HBase上進行數據統計處理變得很是簡單。Sqoop則爲Hbase提供了方便的RDBMS數據導入功能,使得傳統數據庫數據向HBase遷移很是方便。
HBase設計的初衷是針對大數據進行隨機地、實時讀寫操做。隨着互聯網的發展,不少企業的數據也
Hive本質上是一種關係型抽象,是將SQL查詢轉換爲MapRedcue做業。Spark_SQL使用來代替之前的Shark的,其中支持Hive的部分封裝爲一個稱謂HiveContext的新包中。
Spark_SQL支持標準的SQL和HiveQL來讀寫數據。HiveContext提供更好的HiveQL解析能力、UDF藉口和從Hive表中讀取數據的能力。
要啓動Hive的所有功能,首先要確保每一個worker節點上都要啓動集成Hive的jar包(Phive)並將hive-site.xml複製到spark安裝目錄下的conf文件夾下。默認狀況下,Spark_SQL建立的全部表格都是由Hive管理。也就是說,Hive擁有該表的整個生命週期的控制權,包括刪除權。注意Spark1.6支持Hive0.13。
具體實現步驟:
本書項目中,是在Hive中建立了包括論文(papers)、做者(authors)、出版社(publisher)和關鍵詞(keywords)在內的四張大表,並將Scrapy抓取的結果經過Spark SQL寫入Hive的表中。其中論文表包括:題目、做者、關鍵字、摘要、參考文獻和出版社六個字段。
向量空間模型(VSM:Vector_Space_Model)由Salton等人於20世紀70年代提出,併成功地應用於著名的SMART文本檢索系統。VSM概念簡單,把對文本內容的處理簡化爲向量空間中的向量運算,而且它以空間上的類似度表達語義的類似度,直觀易懂。當文檔被表示爲文檔空間的向量,就能夠經過計算向量之間的類似性來度量文檔間的類似性。文本處理中最經常使用的類似性度量方式是餘弦距離。
向量空間模型 (或詞組向量模型)是一個應用於信息過濾,信息擷取,索引以及評估相關性的代數模型。SMART是首個使用這個模型的信息檢索系統。文件(語料)被視爲索引詞(關鍵詞)造成的屢次元向量空間,索引詞的集合一般爲文件中至少出現過一次的詞組。搜尋時,輸入的檢索詞也被轉換成相似於文件的向量,這個模型假設,文件和搜尋詞的相關程度,能夠經由比較每一個文件(向量)和檢索詞(向量)的夾角誤差程度而得知。
實際上,計算夾角向量之間的餘弦比直接計算夾角容易:餘弦爲零表示檢索詞向量垂直於文件向量,即沒有符合,也就是說該文件不含此檢索詞。經過上述的向量空間模型,文本數據就轉換成了計算機能夠處理的結構化數據,兩個文檔之間的類似性問題轉變成了兩個向量之間的類似性問題。
詞頻逆文本頻率(簡稱TF-IDF)是一種從文本文檔中生成特徵向量的方法。它爲文檔中每個詞計算兩個統計值:詞頻(TF)即每一個詞語在文檔中出現的次數,另外一個逆文本頻率(IDF)用來衡量一個詞語在整個文檔語料庫中出現的逆頻繁程度。二者的積即TF*IDF表示一個詞語特定文檔的相關程度。
MLlib中有兩種算法能夠計算TF-IDF:HashingTF和IDF,它們都在mllib.feature包內。HashingTF從一個文檔中計算給定大小的詞頻向量,爲了將詞與向量順序對應起來,它使用Hash方法。但在相似英語這種語言裏,有數十萬的單詞,所以對於單詞映射到向量中的一個獨立維度上須要付出很大代價。而HashTF使用每一個單詞對所需向量長度S取模得出的哈希值,把全部單詞映射到一個0到S-1的數字上。由此咱們保證生成一個S維的向量。在實踐中推薦獎S設置爲218到220之間。
HashingTF能夠一次只運行一個文檔中,也能夠運行於整個RDD中。它要求每一個文檔都是用響亮的可迭代序列來表示如python中的list。在進行TF計算以前先要進行數據預處理如單詞小寫、去標點、詞根化。實踐中,咱們在map()中調用NLTK進行英文處理調用Stanford NLP進行中文處理。
當構建好詞頻向量後,就可使用IDF來計算逆文檔頻率,而後當它們乘以詞頻來計算TF-IDF。首先,對IDF對象調用fit()方法獲取一個IDFmodel,它表明語料庫中的逆文本頻率。接下來,對模型調用transform()方法來把TF向量轉換爲IDF向量。計算代碼以下:
#!/usr/bin/python from pyspark.mllib.feature import HashingFT, IDF rdd = sc.wholeTextFiles(「data」).map(lambda(name,text): text.split()) tf = HashingTF() tfVectors = tf.transform(rdd).cache() idf=IDF() idfModel=idf.fit(tfVectors) tfIdfVectors = idfModel.transform(tfVectors)
代碼中咱們調用cache()方法,由於它被兩次調用(一次訓練IDF模型,一次用IDF乘以TF向量)
Word2Vec是google提出的一種基於神經網絡的文本特徵化計算方法。Spark在mllib.feature.Word2Vec引入了該方法的實現。
要訓練Word2Vec須要給它一個String類(每一個單詞用一個)的Iterable表示的語料庫。當模型訓練好後(經過Word2Vec.fit(rdd)),會獲得Word2VecModel,它能夠用來將每一個單詞經過transform()轉化爲一個向量。注意,Word2Vec算法規模大小等於你的詞庫中單詞數乘以向量大小(默認爲100),通常比較合適的詞庫大小爲100000個單詞。
構建好特徵向量後,須要使用MLlib中的StandardScaler類進行縮放,同時控制均值和標準差。你須要建立一個StandardScalar類,對數據集調用fit()函數來獲取一個StandardScalerModel,也就是爲每一列計算平均值和標準差。而後使用模型對象的transform()方法來伸縮特徵向量集,示例代碼以下:
#!/usr/bin/python from pysparkmllib.feature import StandardScaler vector = [Vectors.dense(-2.0, 5.0, 1.0), Vectors.dense(2.0, 0.0, 1.0)] dataset = sc.parallelize(vectors) scaler = StandardScaler(withMean=true, withStd=True) model = scaler.fit(dataset) result = model.transform(dataset)
在某些狀況下,在準備輸入數據時,把向量正規化爲長度1也是有用的,可使用Normalizer類來實現,只要使用Normalizer.transform(rdd)就能夠了。默認狀況下,Normalizer使用歐氏距離,也能夠經過P值傳遞其餘距離計算方法。
聚類分析是無監督學習任務。是在沒有給定劃分類別的狀況下,根據數據類似度進行樣本分組的數據挖掘方法。與分類模型須要使用有類標記樣本構成的訓練數據不一樣,聚類模型能夠創建在無類標記的數據上,是一種非監督學習算法。聚類根據數據自身的距離和類似度將它們劃分爲若干組,劃分的原則是組內樣本距離最小化而組間距離最大化。該算法主要用於數據探索或者異常點檢測(識別與任意聚類都比較遠的點)
聚類方法如表1所示,基於劃分的聚類方法如表2所示
類別 | 主要算法 |
---|---|
基於劃分的方法 | K-Means(K均值)、K-Medoids(K中心)、CLARANS(基於選擇) |
基於密度的方法 | BIRCH、CURE、CHAMELEON |
基於密度的方法 | DBSCAN、DENCLUE、OPTICS |
基於網格的方法 | STING、CLIOUE、WAVE-CLUSTER |
基於模型的方法 | 統計學方法、神經網絡方法 |
算法 | 算法描述 |
---|---|
K-Means | K均值聚類又稱爲快速聚類,在最下化偏差函數的基礎上,將數據劃分爲預約的類數K。該算法原理簡單,並且便於處理大量數據。 |
K-Medoids | K均值算法對孤立點有較強的敏感性。而K中心點算法不用簇中對象的平均值做爲簇中心,而選擇簇中心平均值最近的對象做爲簇中心。 |
系統聚類 | 系統聚類又稱爲多層次聚類,分類的單位由高到低呈樹形結構,且所處的位置越低,其包含的對象就越少,但這些對象間的共同特徵越多。該聚類方法只適用於小數據量,大數據量速度會很是慢 |
MLlib中包含經典的聚類算法K-Means,該方法如圖所示。以及一個叫作K-meansII(使用Bahmani的scalable K-means++的初始化過程)的變種,能夠爲並行環境提供更好的初始化策略。
K-means方法中最重要的參數是生成的聚類中心的目標數量K。事實上,你幾乎不可能提早知道聚類的真是數量,因此最佳實踐是嘗試幾個不一樣的K值,知道聚類內部平均距離不在顯著降低爲止。MLlib的K-means方法還接受方法:
咱們使用MLlib的聚類分析方法分析學科流派,具體就是經過聚類,將文獻聚成幾個大的類別,每一個大類別中在劃分出小的類別。這樣就將各個類別看作是該學科的各類流派,大的類別爲大流派,小的爲小流派。文獻對應的核心做者爲該流派的核心做者,該流派的關鍵字做爲該流派的核心觀點。
隨着萬維網、Facebook和twitter等社交網絡的興起。這些數據描述了真實世界中的網絡結構和形態,而不是科學家和圖論中的理性網絡模型。最先論文真是網絡屬性的是Duncan_Watts發表的*Collective_dynamics_of_‘small_world’_network*論文。該論文第一次爲具備」小世界」屬性的圖提出了數學生成模型,其特性:
數據可視化是數據挖掘的一個重要的部分。數據可視化藉助圖形化手段,清晰有效的傳達與溝通訊息。數據可視化與信息圖形、信息可視化、科學可視化以及統計圖形等有密切關係。數據可視化爲人類洞察數據的內涵、理解數據蘊藏的規律提供了重要的手段。
R是用於統計分析、繪圖的語言和操做環境。R是屬於GNU系統的一個自由、免費、源代碼開放的軟件,它是一個用於統計計算和統計製圖的優秀工具。R做爲一種統計分析軟件,是集統計分析與圖形顯示於一體的。它能夠運行於UNIX,Windows和Macintosh的操做系統上,並且嵌入了一個很是方便實用的幫助系統,相比於其餘統計分析軟件,R還有如下特色:
R是基於S語言的一個GNU項目,因此也能夠看成S語言的一種實現,一般用S語言編寫的代碼均可以不做修改的在R環境下運行。 R的語法是來自Scheme。R的使用與S-PLUS有不少相似之處,這兩種語言有必定的兼容性。S-PLUS的使用手冊,只要稍加修改就可做爲R的使用手冊。因此有人說:R,是S-PLUS的一個「克隆」。
Spark自己並無可視化工具,但咱們能夠經過HDFS數據導出到R中,使用R進行可視化。R能夠繪製二維或三維空間中的點,但經過Spark計算獲取的結果一般維度很高,這就須要咱們將數據集投影到不超過三維空間上。另外一方面R不大適合處理大型數據集,所以須要對數據進行採樣,這樣才能使用R進行可視化。
下面代碼咱們從HDFS上讀取CSV數據,用sample方法來抽樣造成比較小的子集使其能夠放到R中進行計算。咱們用主成分分析或奇異值分解方法(這兩種方法的spark實如今前面已經介紹)將高緯度數據將維到二維或三維空間中,咱們使用直接的投影方式。代碼以下:
Val sample = data.map(datum => Model.predict(datum) + 「,」 + datum.toArray.mkString(「,」)) .sample(false, 0.05) Sample.saveAsTextFile(「/user/ds/sample」)
3D交互可視化R代碼以下所示:
Install.package(「rgl」) Library(rgl) Clusters_data<-read.csv(pipe(「hadoop fs –cat /user/ds/sample/*」)) clusters<-clusters_data[1] data<-data.mtrix(clusters_data[-c(1)]) rm(clusters_data) random_projection<-matrix(data=rnorm(3*ncol(data)), ncol=3) random_projection_normal<- random_project / sqrt(rowSums(random_projection*random_projection)) projected_data<-data.frame(data%*%random_projection_norm) num_clusters<-nrow(unique(clusters)) palette<-rainbow(num_clusters) colors = sapply(clusters, functions(c), palette[c]) plot3d(projected_data, col = colors, size=10)
使用Flask將分析結果可視化。分爲如下兩步:
Flask是一個使用 Python 編寫的輕量級 Web 應用框架。其 WSGI 工具箱採用 Werkzeug ,模板引擎則使用 Jinja2 。Flask使用 BSD 受權。
Flask也被稱爲 「microframework」 ,由於它使用簡單的核心,用 extension 增長其餘功能。Flask沒有默認使用的數據庫、窗體驗證工具。
Flask簡單易學,下面是Flask版的hello world(hello.py)代碼:
from flask import Flask app = Flask(__name__) @app.route("/") def hello(): return "Hello World!" if __name__ == "__main__": app.run()
安裝Flask:
> pip install Flask
運行hello world程序
> python hello.py hello.py* Running on http://localhost:5000/
在Flask項目中定義Result_template.html用於顯示R可視化結果
# result_template.html @app.route(‘/make/a/map’) def make_map: #讀取mySQL數據庫中的結果 Data = get_data() C = Counter For each in data: C[「AGE」] = 1 Return render_template(‘result_tempate.html’, json=R_json)
在result_template.html中嵌入JS代碼,將可視化結果展現出來。
生產環境列表
Hadoop生產環境 | Cloudera 5.12 |
---|---|
OS | CentOS 7 |
Hadoop | 2.6.3 |
Hive | 1.2 |
Spark | 1.6 |
Scala | 2.11 |
Java | 1.8 |
Python | 3.6 |
R | 1.4.8 |
Flask | 0.12.2 |
Scrapy | 1.5 |
本項目推薦部署環境爲兩種:一種是讀者的Hadoop大數據集羣可使用基於Yarn的部署方式,若是還要提升性能能夠考慮加入Tachyon內存管理存儲層;另外一種是讀者但願在公有云上部署,咱們爲您介紹基於Amazon的EC2解決方案,基於阿里雲的解決方案其步驟也差不準多。
Yarn是基於HDFS的一種分佈式資源協調框架,是Hadoop的主要組成部分。Yarn聽從主從架構。主守護進程被稱爲資源管理器(ResourceManager),從守護進程被稱爲節點管理器(NodeManager)。除此以外,生命週期由ApplicationMaser負責,它能夠被派生到任何從節點上並能夠生存一個應用的生命週期時長。Spark若是運行在yarn上,資源管理器充當Spark Master,節點管理器充當執行節點。若是使用Yarn運行Spark,每一個Spark執行程序以Yarn容器的形式運行。
部署在Yarn上的Spark應用有兩種模式:
(1) yarn-client:Spark驅動運行在Yarn集羣以外的客戶端進程上,而且ApplicationMaster僅用於協調安排資源管理器的資源。架構圖如圖所示。
(2) yarn-cluster:Spark驅動運行於由從節點的節點管理器派生的ApplicationMaster上。架構圖如圖所示。
前一種方式適用於開發和調試,後一種方式適用於生產環境部署。不須要特別指定哪一個模式,由於它油Hadoop的配置決定,master的參數是yarn-client爲前一種方式,而yarn-cluster爲後一種方式。
Yarn模式下,可配置的參數包括:
export HADOOP_CONF_DIR=/opt/hadoop/etc/Hadoop expprt YARN_CONF_DIR=/opt/hadoop/etc/Hadoop
$ spark-submit --class path-to-your-class --master yarn-client [option] <app jar> [app options]
如:
$ spark-submit --class com.bigdata --master yarn-client --num-executors 3 --driver-memory 4g --executor-memory 2g --executor-cores 1 target/sparkio.jar 10
$ spark-shell --master yarn-client
$ spark-submit --class path-to-your-class --master yarn-cluster [options] <app jar> [app options]
如:
$ spark-submit --class com.bigdata class --master yarn-cluster --num-executors 3 --driver-memory 4g --executor-memory 2g --executor-cores target/sparkio.jar 10
Tachyon是一個高性能、高容錯、基於內存的開源分佈式存儲系統[1],並具備類Java的文件API、插件式的底層文件系統、兼容Hadoop_MapReduce和Apache_Spark等特徵。Tachyon可以爲集羣框架(如Spark、MapReduce等)提供內存級速度的跨集羣文件共享服務。Tachyon充分使用內存和文件對象之間的世代(Lineage)信息,所以速度很快,官方號稱最高比HDFS吞吐量高300倍。目前,不少公司(如Pivotal、EMC、紅帽等)已經在使用Tachyon,而且來自20個組織或公司(如雅虎、英特、紅帽等)的60多個貢獻者都在爲其貢獻代碼。Tachyon是於UC_Berkeley數據分析棧(BDAS)的存儲層,它仍是Fedroa操做系統自帶應用。
Spark平臺以分佈式內存計算的模式達到更高的計算性能,在最近引發了業界的普遍關注,其開源社區也十分活躍。以百度爲例,在百度內部計算平臺已經搭建並運行了千臺規模的Spark計算集羣,百度也經過其BMR的開放雲平臺對外提供Spark計算平臺服務。然而,分佈式內存計算的模式也是一柄雙刃劍,在提升性能的同時不得不面對分佈式數據存儲所產生的問題,具體問題主要有如下幾個:
圖1: Tachyon的部署
圖1顯示了Tachyon的部署結構。Tachyon被部署在計算平臺(Spark,MR)之下以及存儲平臺(HDFS, S3)之上,經過全局地隔離計算平臺與存儲平臺, Tachyon能夠有效地解決上文列
舉的幾個問題,:
• 當兩個Spark做業須要共享數據時,無需再經過寫磁盤,而是藉助Tachyon進行內存讀寫,從而提升計算效率。
• 在使用Tachyon對數據進行緩存後,即使在Spark程序崩潰JVM進程退出後,所緩存數據也不會丟失。這樣,Spark工做重啓時能夠直接從Tachyon內存讀取數據了。
• 當兩個Spark做業須要操做相同的數據時,它們能夠直接從Tachyon獲取,並不須要各自緩存一份數據,從而下降JVM內存壓力,減小垃圾收集發生的頻率。
Amazon彈性計算雲(EC2)是一個可以提供可變大小的雲計算實例的網絡服務,已經有不少機構經過使用它節省了大量的人力和物力資源。EC2包括如下特性:
Spark有綁定的Spark-ec2腳本使得在Amazon EC2上安裝、管理和關閉Spark集羣變得十分容易。
開始前須要完成如下工做:
> echo 「export AWS_ACCESS_KEY_ID=\」AAJFJAOFJAOFAJ\」」 >> /home/hduser/.bashrc > echo 「export AWS_ACCESS_KEY=\」+XrsagsgasgagaeeerCfsf\」」 >> /home/hduser/.bashrc > echo 「export PATH=$PATH:/opt/spark/ec2」 >> /home/hduser/.bashrc
$ cd /home/hduser $ spark-ec2 –k <key-pair> -i <key-file> -s <num-slaves> launch <cluser-name>
$ spark-ec2 –k kp-spark –i /home/hduser/keypairs/kp-spark.pem –hadoop-major-version 2 –s 3 launch spark-cluster
$ spark-ec2 –k kp-spark –i /home/hduser/keypairs/kp-spark.pem –z us-east-1b –hadoop-major-version 2 –s 3 launch spark-cluster
$ spark-ec2 –k kp-spark –i /home/hduser/keypairs/kp-spark.pem –z us-east-1b –hadoop-major-version 2 –ebs-vol-size –s 3 launch spark-cluster
$ spark-ec2 –k kp-spark –i /home/hduser/keypairs/kp-spark.pem –z us-east-1b –spot-price=0.15 hadoop-major-version 2 –s 3 launch spark-cluster
一切部署完畢後,打開網頁或命令行查看集羣狀態
在EC2上使用Spark集羣,使用SSH登陸到主節點
$ spark-ec2 –k kp-spark –i /home/hduser/kp/kp-spark.pem login spark-cluster
目錄 | 用途 |
---|---|
Ephemeral-hdfs | 存儲臨時數據,當重啓或關閉機器會被刪掉 |
Persisten-hdfs | 每一個節點都有一個很小量的永久空間(約3G)。若是使用的話,數據會被保存在這個目錄下 |
Hadoop-native | 用於支持Hadoop的原生庫如Snappy壓縮庫 |
Scala | Scala安裝目錄 |
Shark | Shark安裝目錄 |
Spark | Spark安裝目錄 |
Spark-ec2 | 支持該集羣部署的文件 |
Tachyon | Tachyon安裝目錄 |
$ ephemermral-hdfs/bin/hadoop version
> cd spark/conf > mv log4j.properties.template log4j.properties > vi log4j.properties Log4j.rootCategory=INFO, console 改成:log4j.rootCategory=ERROR, console
$ spark-ec2/copydir spark/conf
$ spark-ec2 destroy spark-cluster
本書主要介紹和分析了基於大數據分析的學科知識圖譜的繪製方法。相比較傳統的科學知識圖譜的繪製方法,它有很明顯的優點,但也存在了一些不足。將兩種方法比較以下圖所示:
學科知識圖譜 | 傳統繪製方法 | 大數據處理繪製方法 |
---|---|---|
典型軟件 | CiteSpace或VOSviewer | Hadoop、Spark、Scripy |
方式 | 單機 | 分佈式 |
數據量 | 少許 | 海量 |
數據採集 | 手工採集期刊數據庫(如CNKI和WOS)的論文題錄 | 使用Scrapy自動爬取期刊數據庫(如CNKI)題錄信息 |
存儲方式 | 文本或MySQL數據庫 | HDFS和Hive分佈式數據庫 |
計算方式 | 單機天然語言處理或機器學習工具包NLTK或sciki-learn | 分佈式機器學習工具包如spark和深度學習工具TansorFlow |
應用使用方式 | 單機應用Java GUI | Web應用 Flask |
可視化方法 | 基於Java的可視化Process | R工具包 |
成熟度 | 十分紅熟 | 不十分紅熟 |