關(guān)于我們
書(shū)單推薦
新書(shū)推薦
|
數(shù)據(jù)算法:Hadoop/Spark大數(shù)據(jù)處理技巧 本書(shū)介紹了很多基本設(shè)計(jì)模式、優(yōu)化技術(shù)和數(shù)據(jù)挖掘及機(jī)器學(xué)習(xí)解決方案,以解決生物信息學(xué)、基因組學(xué)、統(tǒng)計(jì)和社交網(wǎng)絡(luò)分析等領(lǐng)域的很多問(wèn)題。這本書(shū)還概要介紹了MapReduce、Hadoop和Spark。 本書(shū)主要內(nèi)容包括: ■完成超大量交易的購(gòu)物籃分析。 ■數(shù)據(jù)挖掘算法(K-均值、KNN和樸素貝葉斯)。 ■使用超大基因組數(shù)據(jù)完成DNA和RNA測(cè)序。 ■樸素貝葉斯定理和馬爾可夫鏈實(shí)現(xiàn)數(shù)據(jù)和市場(chǎng)預(yù)測(cè)。 ■ 推薦算法和成對(duì)文檔相似性。 ■線(xiàn)性回歸、Cox回歸和皮爾遜(Pearson)相關(guān)分析。 ■等位基因頻率和DNA挖掘。 ■社交網(wǎng)絡(luò)分析(推薦系統(tǒng)、三角形計(jì)數(shù)和情感分析)。 如果你準(zhǔn)備深入研究MapReduce框架來(lái)處理大數(shù)據(jù)集,本書(shū)非常實(shí)用,通過(guò)提供豐富的算法和工具,它會(huì)循序漸進(jìn)地帶你探索MapReduce世界,用Apache Hadoop或Apache Spark構(gòu)建分布式MapReduce應(yīng)用時(shí)通常都需要用到這些算法和工具。每一章分別提供一個(gè)實(shí)例來(lái)解決一個(gè)大規(guī)模計(jì)算問(wèn)題,如構(gòu)建推薦系統(tǒng)。你會(huì)了解如何用代碼實(shí)現(xiàn)適當(dāng)?shù)腗apReduce解決方案,而且可以在你的項(xiàng)目中具體應(yīng)用這些解決方案。這
隨著大規(guī)模搜索引擎(如Google和Yahoo! )、基因組分析(DNA測(cè)序、RNA測(cè)序和生物標(biāo)志物分析)以及社交網(wǎng)絡(luò)(如Facebook 和Twitter) 的不斷發(fā)展,需要生成和處理的數(shù)據(jù)量已經(jīng)超過(guò)了千萬(wàn)億字節(jié)。為了滿(mǎn)足如此龐大的計(jì)算需求,我們需高效、可伸縮的并行算法。MapReduce范式就是解決這些問(wèn)題的一個(gè)框架。
MapReduce是一個(gè)軟件框架,可以采用并行、分布式方式處理GB、TB,甚至PB級(jí)的大數(shù)據(jù)集,同時(shí)它也是一個(gè)在商用服務(wù)器集群之上完成大規(guī)模數(shù)據(jù)處理的執(zhí)行框架。實(shí)現(xiàn)MapReduce 的方法有很多,不過(guò)這本書(shū)中我們主要關(guān)注Apache Spark 和MapReduce/ Hadoop。你將通過(guò)簡(jiǎn)單而具體的示例來(lái)了解如何用Spark和Hadoop實(shí)現(xiàn)MapReduce。 這本書(shū)將為以下領(lǐng)域提供了基本分布式算法(分別用MapReduce、Hadoop和Spark實(shí)現(xiàn)),并按照這些領(lǐng)域組織本書(shū)的章節(jié): . 基本設(shè)計(jì)模式。 . 數(shù)據(jù)挖掘和機(jī)器學(xué)習(xí)。 . 生物信息、基因組和統(tǒng)計(jì)。 . 優(yōu)化技術(shù)。 MapReduce是什么? MapReduce 是一種編程范式,可以利用集群環(huán)境的成百上千臺(tái)服務(wù)器實(shí)現(xiàn)強(qiáng)大的可伸縮性。MapReduce一詞最早源于函數(shù)式編程,由Google在一篇名為MapReduce: Simplified Data Processing on Large Clusters 的文章中率先提出。Google的MapReduce[8]實(shí)現(xiàn)是一個(gè)專(zhuān)用解決方案,還沒(méi)有向公眾發(fā)布。 reduce():.(Key2,.[Value2])..[(Key3,.Value3)] 這本書(shū)中會(huì)使用map() 函數(shù)和reduce() 函數(shù)的非形式化表示,我會(huì)用中括號(hào)([])表示列表。 MapReduce 的核心概念是將輸入數(shù)據(jù)集映射到一個(gè)鍵-值對(duì)集合,然后對(duì)所有包含相同鍵的鍵-值對(duì)完成歸約。盡管基本概念很簡(jiǎn)單,不過(guò)如果考慮以下方面,可以看到這個(gè)概念確實(shí)很強(qiáng)大、很有效:幾乎所有數(shù)據(jù)都可以映射到鍵-值對(duì)。 鍵和值可以是任意類(lèi)型:String、Integer、FASTQ (用于DNA測(cè)序)、用戶(hù)自定義的定制類(lèi)型,當(dāng)然,也可以是鍵-值對(duì)本身。 MapReduce如何在一組服務(wù)器上擴(kuò)展?MapReduce是如何工作的?關(guān)鍵在于,從概念上講,MapReduce 的輸入是一個(gè)記錄列表(每個(gè)記錄可以是一行或多行數(shù)據(jù))。這些輸入記錄會(huì)劃分并傳遞到集群中的多臺(tái)服務(wù)器,由map() 函數(shù)使用。map() 計(jì)算的結(jié)果是一個(gè)鍵-值對(duì)列表。然后reduce() 函數(shù)取各個(gè)包含相同鍵的值集,將它們分別組合為一個(gè)值(或一個(gè)值集)。換句話(huà)說(shuō),map() 函數(shù)是由一組數(shù)據(jù)塊生成鍵-值對(duì),reduce() 則是組合map()生成的數(shù)據(jù)輸出,從而能得到所需要的結(jié)果,而不是一組鍵-值對(duì)。 MapReduce 的主要優(yōu)點(diǎn)之一是它的不共享(shared-nothing )數(shù)據(jù)處理平臺(tái)。這意味著所有映射器可以獨(dú)立地工作,而且映射器完成它們的任務(wù)時(shí),歸約器也能獨(dú)立地開(kāi)始工作(映射器或歸約器之間不共享任何數(shù)據(jù)或臨界區(qū)。如果有臨界區(qū),這會(huì)減慢分布式計(jì)算的速度);谶@種不共享范式,我們可以很容易地編寫(xiě)map() 函數(shù)和reduce() 函數(shù),而且能輕松、有效地提高并行性。 為什么使用MapReduce? 前面我們討論過(guò),MapReduce 的目標(biāo)是通過(guò)增加更多的商用服務(wù)器來(lái)實(shí)現(xiàn)橫向擴(kuò)容。這與縱向擴(kuò)容是不同的(縱向擴(kuò)容是為系統(tǒng)中的單個(gè)節(jié)點(diǎn)增加更多資源,如內(nèi)存和CPU)。縱向擴(kuò)容可能成本很高,有時(shí)由于成本以及軟件或硬件限制等原因,可能根本無(wú)法增加更多的資源。有時(shí)人們會(huì)提出一些基于主存的新興算法來(lái)解決數(shù)據(jù)問(wèn)題,但是由于主存是一個(gè)瓶頸,所以這些算法缺乏可伸縮性。例如,在DNA測(cè)序分析中,可能需要超過(guò)512GB的RAM,這非常昂貴,而且不具有可伸縮性。 如果要提高計(jì)算能力,可能需要把計(jì)算分布到多個(gè)機(jī)器上完成。例如,要完成500GB 樣本數(shù)據(jù)的DNA測(cè)序,可能需要一個(gè)服務(wù)器計(jì)算4天才能完成比對(duì)階段。利用MapReduce,60 臺(tái)服務(wù)器可以把計(jì)算時(shí)間銳減到2小時(shí)以?xún)?nèi)。要處理大量的數(shù)據(jù),必須能夠?qū)⑦@些數(shù)據(jù)劃分為小塊來(lái)進(jìn)行處理,再組合得到最終的結(jié)果。MapReduce/Hadoop 和Spark/Hadoop 可以幫助你提高計(jì)算能力,你只需要寫(xiě)兩個(gè)函數(shù): map() 和reduce() 。顯然,MapReduce 范式為數(shù)據(jù)分析領(lǐng)域提供了一個(gè)強(qiáng)大的新工具,近來(lái),歸功于Hadoop 等開(kāi)源解決方案,這個(gè)新工具得到了越來(lái)越多的關(guān)注。 基本說(shuō)來(lái),MapReduce提供了以下優(yōu)點(diǎn): .編程模型 基礎(chǔ)架構(gòu)。 . 能夠編寫(xiě)在數(shù)百甚至上千臺(tái)機(jī)器上運(yùn)行的程序。 . 自動(dòng)并行化和分布 . 容錯(cuò)(如果一臺(tái)服務(wù)器宕機(jī),作業(yè)可以由其他服務(wù)器完成)。 .程序/作業(yè)調(diào)度、狀態(tài)檢查和監(jiān)控。 Hadoop和Spark Hadoop(http://hadoop.apache.org/ )是MapReduce應(yīng)用實(shí)現(xiàn)的事實(shí)標(biāo)準(zhǔn)。它由一個(gè)或多個(gè)主節(jié)點(diǎn)和任意多個(gè)從節(jié)點(diǎn)組成。Hadoop提出數(shù)據(jù)中心就是計(jì)算機(jī),通過(guò)提供map() 函數(shù)和reduce() 函數(shù)(由程序員定義),允許應(yīng)用開(kāi)發(fā)人員或程序員利用這些數(shù)據(jù)中心,從而簡(jiǎn)化分布式應(yīng)用。Hadoop 高效地實(shí)現(xiàn)了MapReduce 范式,很容易學(xué)習(xí),這是一個(gè)可以處理TB甚至PB級(jí)大數(shù)據(jù)的強(qiáng)大工具。 在這本書(shū)中,大部分MapReduce 算法都采用實(shí)例的形式給出(已編譯的完整實(shí)用解決方案),并且在Java/MapReduce/Hadoop 和/或Java/Spark/Hadoop 中得到實(shí)現(xiàn)。Hadoop和Spark(http://spark.apache.org/ )框架是開(kāi)源的,允許我們?cè)诜植际江h(huán)境中完成大數(shù)據(jù)量的計(jì)算和數(shù)據(jù)處理。 這些框架通過(guò)提供橫向擴(kuò)容方法來(lái)支持可伸縮性,可以采用MapReduce 范式在數(shù)千臺(tái)服務(wù)器上運(yùn)行密集型計(jì)算。與Hadoop的API相比,Spark的API提供了更高層的抽象。由于這個(gè)原因,只用一個(gè)Java驅(qū)動(dòng)器類(lèi)就可以描述Spark解決方案。 Hadoop和Spark是兩個(gè)不同的分布式軟件框架。Hadoop是一個(gè)MapReduce框架,在這個(gè)框架上可以運(yùn)行支持map() 、combine() 和reduce() 函數(shù)的作業(yè)。MapReduce范式很適合單趟計(jì)算[先map() ,再reduce() ],不過(guò)對(duì)于多趟算法效率則很低。Spark 不是一個(gè)MapReduce框架,不過(guò)很容易用來(lái)支持MapReduce框架的功能,它提供了一個(gè)適當(dāng)?shù)腁PI 可以處理map() 和reduce() 功能。Spark并不限于先完成映射階段再完成歸約階段。Spark 作業(yè)可以是由映射和/或歸約/洗牌階段構(gòu)成的一個(gè)任意DAG(有向無(wú)環(huán)圖)。Spark程序可以使用Hadoop運(yùn)行,也可以不使用Hadoop,另外Spark可以使用Hadoop分布式文件系統(tǒng)(Hadoop Distributed File System,HDFS)或者其他持久存儲(chǔ)來(lái)實(shí)現(xiàn)輸入/輸出;旧希瑢(duì)于一個(gè)給定的Spark程序或作業(yè),Spark引擎會(huì)創(chuàng)建將在集群上完成的任務(wù)階段所構(gòu)成的一個(gè)有向無(wú)環(huán)圖,Hadoop/MapReduce 則不同,它會(huì)創(chuàng)建由兩個(gè)預(yù)定義階段(映射和歸約)構(gòu)成的有向無(wú)環(huán)圖。注意,Spark創(chuàng)建的DAG可以包含任意多個(gè)階段。與Hadoop/ MapReduce相比,這使得大多數(shù)Spark作業(yè)都能更快地完成,因?yàn)楹?jiǎn)單的作業(yè)只需要一個(gè)階段就可以完成,更復(fù)雜的任務(wù)也可以一起完成(包括多個(gè)階段),而不需要?jiǎng)澐譃槎鄠(gè)作業(yè)。前面已經(jīng)提到,相比于MapReduce/Hadoop,Spark的API提供了更高層的抽象。例如,Spark的幾行代碼可能等價(jià)于MapReduce/Hadoop的30~40行代碼。 盡管Hadoop和Spark等框架建立一個(gè)不共享范式基礎(chǔ)之上,不過(guò)它們確實(shí)也支持在所有集群節(jié)點(diǎn)上共享不可變的數(shù)據(jù)結(jié)構(gòu)。在Hadoop中,可以通過(guò)Hadoop的Configuration對(duì)象將這些值傳遞給映射器和歸約器。除了Broadcast只讀對(duì)象,Spark還支持只寫(xiě)累加器。Hadoop和Spark為大數(shù)據(jù)處理提供了以下好處: 可讀性 Hadoop和Spark支持容錯(cuò)(任何節(jié)點(diǎn)宕機(jī)不會(huì)丟失所需的計(jì)算結(jié)果)。 可伸縮性 Hadoop和Spark支持龐大的服務(wù)器集群。 分布式處理 在Spark和Hadoop中,輸入數(shù)據(jù)和處理是分布式的(可以全面支持大數(shù)據(jù))。并行化 可以在節(jié)點(diǎn)集群上并行地執(zhí)行計(jì)算。 Hadoop 主要設(shè)計(jì)用于批處理,不過(guò)如果有足夠的內(nèi)存/RAM,Spark 可以用于近實(shí)時(shí)處理。要了解Spark RDDs(resilient distributed data sets,彈性分布式數(shù)據(jù)集)的基本用法,可以參考附錄B。 那么MapReduce/Hadoop的核心組件有哪些? .輸入/輸出數(shù)據(jù)包括鍵-值對(duì)。一般地,鍵是整型、長(zhǎng)整型和字符串,而值可以是幾乎任何數(shù)據(jù)類(lèi)型(字符串、整型、長(zhǎng)整型、句子、特殊格式的數(shù)據(jù)等)。 . 數(shù)據(jù)劃分到商用節(jié)點(diǎn)上,填充到數(shù)據(jù)中心。 .這個(gè)軟件會(huì)處理故障、重啟和其他意外中斷。這稱(chēng)為容錯(cuò)(fault tolerance),這也是Hadoop的一個(gè)重要特性。 Hadoop和Spark不只是提供了map() 和reduce() 功能,還提供了插件模型來(lái)實(shí)現(xiàn)定制記錄讀取、二次數(shù)據(jù)排序及更多其他功能。 圖P-2展示了Spark、YARN 和Hadoop HDFS之間關(guān)系的一個(gè)高層視圖。 圖P-2:MapReduce、Spark和HDFS之間的關(guān)系 從這個(gè)關(guān)系可以看到,使用HDFS (和非HDFS文件系統(tǒng))運(yùn)行MapReduce和Spark有很多方法。在這本書(shū)中,我會(huì)用到以下關(guān)鍵詞和術(shù)語(yǔ): .MapReduce表示一般的MapReduce框架范式。 .MapReduce/Hadoop表示使用Hadoop的一個(gè)特定的MapReduce框架實(shí)現(xiàn)。 .Spark 表示一個(gè)特定的Spark實(shí)現(xiàn),它使用HDFS 作為持久存儲(chǔ)或計(jì)算引擎(注意,Spark可以在任何數(shù)據(jù)存儲(chǔ)庫(kù)上運(yùn)行,不過(guò)這里我們主要強(qiáng)調(diào)Hadoop的HDFS): ─Spark 可以脫離Hadoop 使用獨(dú)立的集群節(jié)點(diǎn)運(yùn)行(可以使用HDFS、NFS或其他媒介作為持久數(shù)據(jù)存儲(chǔ)庫(kù))。 ─Spark也可以結(jié)合Hadoop,使用Hadoop的YARN 或MapReduce框架運(yùn)行。 通過(guò)這本書(shū),你會(huì)循序漸進(jìn)地學(xué)習(xí)使用Hadoop 構(gòu)建MapReduce 應(yīng)用所需的算法和工具。MapReduce/Hadoop 已經(jīng)成為處理大數(shù)據(jù)集(如日志數(shù)據(jù)、基因組序列、統(tǒng)計(jì)應(yīng)用和社交圖譜)的理想編程模型。MapReduce 可以用于任何不需要緊耦合并行處理的應(yīng)用。要記住,Hadoop主要設(shè)計(jì)用于MapReduce批處理,它并不是一個(gè)理想的實(shí)時(shí)處理解決方案。不要期望在2~5s時(shí)間內(nèi)從Hadoop得到答案,最小的作業(yè)也可能需要超過(guò)20s的時(shí)間。Spark是一個(gè)頂級(jí)Apache項(xiàng)目,非常適合近實(shí)時(shí)處理,如果有更多的RAM,它的表現(xiàn)將會(huì)更出色。利用Spark ,如果使用一個(gè)包括100個(gè)節(jié)點(diǎn)的集群運(yùn)行一個(gè)大數(shù)據(jù)處理作業(yè)(如生物標(biāo)志物分析或Cox回歸),完全有可能在25~35s內(nèi)處理2億條記錄。一般地,Hadoop作業(yè)會(huì)有15~20s的延遲,不過(guò)這取決于Hadoop集群的大小和配置。 MapReduce 實(shí)現(xiàn)(如Hadoop )可以在一個(gè)龐大的商用計(jì)算機(jī)集群上運(yùn)行,具有很好的可伸縮性。例如,一個(gè)典型的MapReduce計(jì)算過(guò)程可以在數(shù)百或數(shù)千臺(tái)機(jī)器上處理PB或TB 級(jí)的數(shù)據(jù)。程序員會(huì)發(fā)現(xiàn) ,MapReduce 很容易使用,因?yàn)樗[藏了并行化、容錯(cuò)、數(shù)據(jù)分布和負(fù)載平衡等繁雜的細(xì)節(jié),使程序員可以集中精力編寫(xiě)兩個(gè)關(guān)鍵函數(shù)map() 和reduce()。 下面是MapReduce/Hadoop/Spark的一些主要應(yīng)用: . 查詢(xún)?nèi)罩咎幚怼?br /> . 抓取、索引和搜索。 . 分析、文本處理情感分析。 . 機(jī)器學(xué)習(xí)(如馬爾可夫鏈和樸素貝葉斯分類(lèi)器)。 . 推薦系統(tǒng)。 . 文檔聚類(lèi)和分類(lèi)。 . 生物信息學(xué)(比對(duì)、重新校準(zhǔn)、生殖細(xì)胞采集和DNA/RNA測(cè)序)。 . 基因組分析(生物標(biāo)志物分析以及回歸算法,如線(xiàn)性回歸和Cox回歸)。 本書(shū)內(nèi)容 這本書(shū)中每一章分別提出一個(gè)問(wèn)題,然后通過(guò)一組MapReduce算法加以解決。MapReduce 算法/解決方案相當(dāng)完整(包括MapReduce驅(qū)動(dòng)器、映射器、組合器和歸約器程序)?梢栽陧(xiàng)目中直接使用這些代碼(不過(guò),有時(shí)可能需要剪切粘貼你需要的部分)。這本書(shū)沒(méi)有涉及MapReduce 框架的底層理論,而是著重于提供使用MapReduce/Hadoop 和Spark 解決大數(shù)據(jù)難題的實(shí)用算法和示例。這本書(shū)的主要內(nèi)容包括: . 完成超大量交易的購(gòu)物籃分析。 .數(shù)據(jù)挖掘算法[K-均值、K-近鄰(kNN)和樸素貝葉斯]。 .使用超大量基因組數(shù)據(jù)完成DNA測(cè)序和RNA測(cè)序。 . 樸素貝葉斯分類(lèi)和馬爾可夫鏈實(shí)現(xiàn)數(shù)據(jù)和市場(chǎng)預(yù)測(cè)。 . 推薦算法和成對(duì)文檔相似性。 .線(xiàn)性回歸、Cox回歸和皮爾遜(Pearson)相關(guān)系數(shù)。 .等位基因頻率和DNA挖掘。 . 社交網(wǎng)絡(luò)分析(推薦系統(tǒng)、三角形計(jì)數(shù),情感分析)。 你可以復(fù)制粘貼這本書(shū)中提供的解決方案,使用Hadoop 和Spark 構(gòu)建你自己的MapReduce 應(yīng)用和解決方案。所有這些解決方案都經(jīng)過(guò)編譯和測(cè)試。如果你對(duì)Java 有一些了解(也就是說(shuō),可以讀寫(xiě)基本的Java程序),想使用Java/Hadoop/Spark 編寫(xiě)和部署MapReduce 算法,那么這本書(shū)是最適合不過(guò)的了。Jimmy Lin和Chris Dyer寫(xiě)過(guò)一本好書(shū)[16],其中對(duì)MapReduce 的一般內(nèi)容做了詳細(xì)討論。重申一次,這本書(shū)的目標(biāo)是使用Hadoop 和Spark 提供具體的MapReduce 算法和解決方案。同樣地,這本書(shū)也不會(huì)詳細(xì)討論Hadoop 本身。這個(gè)內(nèi)容在Tom White 的書(shū)[31]中有詳細(xì)介紹,這也是一本絕妙的好書(shū)。 這本書(shū)不會(huì)介紹如何安裝Hadoop或Spark,這里假設(shè)你已經(jīng)安裝了這些框架。另外,所有Hadoop 命令都相對(duì)于Hadoop 的安裝目錄($HADOOP_HOME 環(huán)境變量)執(zhí)行。這本書(shū)只展示使用MapReduce/Hadoop 和Spark的分布式算法。例如,我會(huì)討論API,介紹運(yùn)行作業(yè)的命令行調(diào)用,另外會(huì)提供完整的實(shí)用程序(包括驅(qū)動(dòng)器、映射器、組合器和歸約器)。 本書(shū)重點(diǎn) 這本書(shū)的重點(diǎn)是掌握MapReduce范式,并提出一些可以使用MapReduce/Hadoop 算法解決的具體問(wèn)題。對(duì)于這里提出的每一個(gè)問(wèn)題,我們會(huì)詳細(xì)介紹map() 、combine() 和reduce()函數(shù),并提供完整的解決方案,包括: . 客戶(hù)端,可以用適當(dāng)?shù)妮斎牒洼敵鰠?shù)調(diào)用驅(qū)動(dòng)器。 .驅(qū)動(dòng)器,明確map()和reduce()函數(shù),并明確輸入和輸出。 .映射器類(lèi),實(shí)現(xiàn)map()函數(shù)。 .組合器類(lèi)(如果需要),實(shí)現(xiàn)combine() 函數(shù)。我們會(huì)討論什么情況下有可能使用組合器。 .歸約器類(lèi),實(shí)現(xiàn)reduce()函數(shù)。 這本書(shū)的一個(gè)目標(biāo)是提供一個(gè)循序漸進(jìn)的指南,介紹如何使用Spark和Hadoop作為MapReduce算法的解決方案。另一個(gè)目標(biāo)是展示如何將一個(gè)MapReduce作業(yè)的輸出作為另一個(gè)作業(yè)的輸入(這稱(chēng)為MapReduce作業(yè)鏈或流水線(xiàn))。 本書(shū)面向的讀者 這本書(shū)面向了解Java基礎(chǔ)知識(shí)并且想使用Hadoop和Spark 開(kāi)發(fā)MapReduce 算法(數(shù)據(jù)挖掘、機(jī)器學(xué)習(xí)、生物信息技術(shù)、基因組和統(tǒng)計(jì)領(lǐng)域)和解決方案的軟件工程師、軟件架構(gòu)師、數(shù)據(jù)科學(xué)家和應(yīng)用開(kāi)發(fā)人員。前面已經(jīng)提到,這里假設(shè)你已經(jīng)了解Java 編程語(yǔ)言的基礎(chǔ)知識(shí)(例如,知道如何編寫(xiě)類(lèi)、由一個(gè)現(xiàn)有的類(lèi)定義一個(gè)新類(lèi),以及使用while循環(huán)和if-then-else等基本控制結(jié)構(gòu))。更具體地,這本書(shū)主要面向以下讀者: .希望完成大數(shù)據(jù)分析(分類(lèi)、回歸算法)的數(shù)據(jù)科學(xué)工程師和專(zhuān)業(yè)人員。這本書(shū)會(huì)采用一種實(shí)例的形式給出使用大數(shù)據(jù)應(yīng)用分類(lèi)和回歸算法的基本步驟。書(shū)中會(huì)詳細(xì)介紹map() 和reduce() 函數(shù),展示如何將它們應(yīng)用到實(shí)際數(shù)據(jù),并說(shuō)明在哪里應(yīng)用基本設(shè)計(jì)模式來(lái)解決MapReduce 問(wèn)題。對(duì)這些MapReduce 算法稍做修改就可以很容易地應(yīng)用于其他行業(yè)(例如,修改輸入格式)。所有解決方案都已經(jīng)在Apache Hadoop/Spark 中實(shí)現(xiàn),可以根據(jù)實(shí)際情況調(diào)整這些示例。 .希望設(shè)計(jì)機(jī)器學(xué)習(xí)算法(如樸素貝葉斯和馬爾可夫鏈算法)的軟件工程師和軟件架構(gòu)師。這本書(shū)會(huì)展示如何構(gòu)建模型,然后使用MapReduce 設(shè)計(jì)模式將模型應(yīng)用到新的數(shù)據(jù)集。 .希望利用MapReduce使用數(shù)據(jù)挖掘算法(如K-均值聚類(lèi)和k-近鄰算法)的軟件工程師和軟件架構(gòu)師。這里會(huì)給出詳細(xì)的示例,可以指導(dǎo)專(zhuān)業(yè)人員實(shí)現(xiàn)類(lèi)似的算法。 .希望對(duì)生物醫(yī)療數(shù)據(jù)應(yīng)用MapReduce算法(如DNA測(cè)序和RNA測(cè)序)的數(shù)據(jù)科學(xué)工程師。這本書(shū)會(huì)清楚地解釋生物信息學(xué)家和醫(yī)療人員可以采用的實(shí)用算法。這里提供了適用不同生物數(shù)據(jù)類(lèi)型的主要回歸/分析算法。這些算法大多都已經(jīng)部署在實(shí)際的生產(chǎn)系統(tǒng)中。 .希望在MapReduce/分布式環(huán)境中應(yīng)用最重要優(yōu)化的軟件架構(gòu)師。 在線(xiàn)資源 這本書(shū)有兩個(gè)配套網(wǎng)站: https://github.com/mahmoudparsian/data-algorithms-book/ 在這個(gè)GitHub 網(wǎng)站上,可以找到源代碼(按章節(jié)組織)、shell 腳本(用于運(yùn)行MapReduce/Hadoop 和Spark程序)、用于測(cè)試的示例輸入文件以及書(shū)中未涵蓋的一些額外內(nèi)容(包括附加的兩章)的相應(yīng)鏈接。 http://mapreduce4hackers.com 在這個(gè)網(wǎng)站上可以找到額外的源文件(書(shū)中未提到)以及書(shū)中未涉及的另外一些內(nèi)容的鏈接。將來(lái)還會(huì)更全面地介紹MapReduce/Hadoop/Spark主題。 本書(shū)中使用的軟件 開(kāi)發(fā)這本書(shū)中介紹的解決方案和示例時(shí),我使用了表P-3列出的軟件和編程環(huán)境。表P-3:本書(shū)中使用的軟件/編程環(huán)境Java 編程語(yǔ)言 (JDK7) 1.7.0_67 操作系統(tǒng):Linux CentOS 6.3 操作系統(tǒng):Mac OS X 10.9 Apache Hadoop 2.5.0, 2.6.0 Apache Spark 1.1.0, 1.3.0, 1.4.0 Eclipse IDE Luna 這本書(shū)中的所有程序都使用Java/JDK7 、Hadoop 2.5.0 和Spark (1.1.0,1.3.0, 1.4.0)完成了測(cè)試。我們給出了不同操作系統(tǒng)環(huán)境(Linux和OS X)下的例子。對(duì)于所有示例和解決方案,我都使用了基本的文本編輯器(如vi、vim 和TextWrangler ),然后使用Java 命令行編譯器(javac)來(lái)完成編譯。 這本書(shū)中,我使用shell腳本(如bash腳本)來(lái)運(yùn)行示例MapReduce/Hadoop 和Spark程序。以$或#字符開(kāi)頭的代碼行表示必須在終端提示窗口(如bash)輸入這些命令。 Mahmoud Parsian,計(jì)算機(jī)科學(xué)博士,是一位熱衷于實(shí)踐的軟件專(zhuān)家,作為開(kāi)發(fā)人員、設(shè)計(jì)人員、架構(gòu)師和作者,他有30多年的軟件開(kāi)發(fā)經(jīng)驗(yàn)。目前領(lǐng)導(dǎo)著Illumina的大數(shù)據(jù)團(tuán)隊(duì),在過(guò)去15年間,他主要從事Java (服務(wù)器端)、數(shù)據(jù)庫(kù)、MapReduce和分布式計(jì)算的有關(guān)工作。Mahmoud還著有《JDBC Recipes》和《JDBC Metadata, MySQL,and Oracle Recipes》等書(shū)(均由Apress出版)。
序 1
前言 3 第1章二次排序:簡(jiǎn)介 19 二次排序問(wèn)題解決方案 21 MapReduce/Hadoop的二次排序解決方案 25 Spark的二次排序解決方案 29 第2章二次排序:詳細(xì)示例 42 二次排序技術(shù) 43 二次排序的完整示例 46 運(yùn)行示例老版本Hadoop API 50 運(yùn)行示例新版本Hadoop API 52 第3章 Top 10 列表 54 Top N 設(shè)計(jì)模式的形式化描述 55 MapReduce/Hadoop實(shí)現(xiàn):唯一鍵 56 Spark實(shí)現(xiàn):唯一鍵 62 Spark實(shí)現(xiàn):非唯一鍵 73 使用takeOrdered()的Spark Top 10 解決方案 84 MapReduce/Hadoop Top 10 解決方案:非唯一鍵 91 第4章左外連接 96 左外連接示例 96 MapReduce左外連接實(shí)現(xiàn) 99 Spark左外連接實(shí)現(xiàn) 105 使用leftOuterJoin()的Spark實(shí)現(xiàn) 117 第5章反轉(zhuǎn)排序 127 反轉(zhuǎn)排序模式示例 128 反轉(zhuǎn)排序模式的MapReduce/Hadoop實(shí)現(xiàn) 129 運(yùn)行示例 134 第6章移動(dòng)平均 137 示例1:時(shí)間序列數(shù)據(jù)(股票價(jià)格) 137 示例2:時(shí)間序列數(shù)據(jù)(URL訪(fǎng)問(wèn)數(shù)) 138 形式定義 139 POJO移動(dòng)平均解決方案 140 MapReduce/Hadoop移動(dòng)平均解決方案 143 第7章購(gòu)物籃分析 155 MBA目標(biāo) 155 MBA的應(yīng)用領(lǐng)域 157 使用MapReduce的購(gòu)物籃分析 157 Spark解決方案 166 運(yùn)行Spark實(shí)現(xiàn)的YARN 腳本 179 第8章共同好友 182 輸入 183 POJO共同好友解決方案 183 MapReduce算法 184 解決方案1: 使用文本的Hadoop實(shí)現(xiàn) 187 解決方案2: 使用ArrayListOfLongsWritable 的Hadoop實(shí)現(xiàn) 189 Spark解決方案 191 第9章使用MapReduce實(shí)現(xiàn)推薦引擎 201 購(gòu)買(mǎi)過(guò)該商品的顧客還購(gòu)買(mǎi)了哪些商品 202 經(jīng)常一起購(gòu)買(mǎi)的商品 206 推薦連接 210 第10章基于內(nèi)容的電影推薦 225 輸入 226 MapReduce階段1 226 MapReduce階段2和階段3 227 Spark電影推薦實(shí)現(xiàn) 234 第11章使用馬爾可夫模型的智能郵件營(yíng)銷(xiāo) .253 馬爾可夫鏈基本原理 254 使用MapReduce的馬爾可夫模型 256 Spark解決方案 269 第12章 K-均值聚類(lèi) 282 什么是K-均值聚類(lèi)? 285 聚類(lèi)的應(yīng)用領(lǐng)域 285 K-均值聚類(lèi)方法非形式化描述:分區(qū)方法 286 K-均值距離函數(shù) 286 K-均值聚類(lèi)形式化描述 287 K-均值聚類(lèi)的MapReduce解決方案 288 K-均值算法Spark實(shí)現(xiàn) 292 第13章 k-近鄰 296 kNN分類(lèi) 297 距離函數(shù) 297 kNN示例 298 kNN算法非形式化描述 299 kNN算法形式化描述 299 kNN的類(lèi)Java非MapReduce 解決方案 299 Spark的kNN算法實(shí)現(xiàn) 301 第14章樸素貝葉斯 315 訓(xùn)練和學(xué)習(xí)示例 316 條件概率 319 深入分析樸素貝葉斯分類(lèi)器 319 樸素貝葉斯分類(lèi)器:符號(hào)數(shù)據(jù)的MapReduce解決方案 322 樸素貝葉斯分類(lèi)器Spark實(shí)現(xiàn) 332 使用Spark和Mahout 347 第15章情感分析 349 情感示例 350 情感分?jǐn)?shù):正面或負(fù)面 350 一個(gè)簡(jiǎn)單的MapReduce情感分析示例 351 真實(shí)世界的情感分析 353 第16章查找、統(tǒng)計(jì)和列出大圖中的所有三角形 354 基本的圖概念 355 三角形計(jì)數(shù)的重要性 356 MapReduce/Hadoop解決方案 357 Spark解決方案 364 第17章 K-mer計(jì)數(shù) 375 K-mer計(jì)數(shù)的輸入數(shù)據(jù) 376 K-mer計(jì)數(shù)應(yīng)用 376 K-mer計(jì)數(shù)MapReduce/Hadoop解決方案 377 K-mer計(jì)數(shù)Spark解決方案 378 第18章 DNA測(cè)序 390 DNA測(cè)序的輸入數(shù)據(jù) 392 輸入數(shù)據(jù)驗(yàn)證 393 DNA序列比對(duì) 393 DNA測(cè)試的MapReduce算法 394 第19章 Cox回歸 413 Cox模型剖析 414 使用R的Cox回歸 415 Cox回歸應(yīng)用 416 Cox回歸 POJO解決方案 417 MapReduce輸入 418 使用MapReduce的Cox回歸 419 第20章 Cochran-Armitage趨勢(shì)檢驗(yàn) 426 Cochran-Armitage算法 427 Cochran-Armitage應(yīng)用 432 MapReduce解決方案 435 第21章等位基因頻率 443 基本定義 444 形式化問(wèn)題描述 448 等位基因頻率分析的MapReduce解決方案 449 MapReduce解決方案, 階段1 449 MapReduce解決方案,階段2 459 MapReduce解決方案, 階段3 463 染色體X 和Y的特殊處理 466 第22章 T檢驗(yàn) 468 對(duì)bioset完成T檢驗(yàn) 469 MapReduce問(wèn)題描述 472 輸入 472 期望輸出 473 MapReduce解決方案 473 Spark實(shí)現(xiàn) 476 第23章皮爾遜相關(guān)系數(shù) 488 皮爾遜相關(guān)系數(shù)公式 489 皮爾遜相關(guān)系數(shù)示例 491 皮爾遜相關(guān)系數(shù)數(shù)據(jù)集 492 皮爾遜相關(guān)系數(shù)POJO 解決方案 492 皮爾遜相關(guān)系數(shù)MapReduce解決方案 493 皮爾遜相關(guān)系數(shù)的Spark 解決方案 496 運(yùn)行Spark程序的YARN 腳本 516 使用Spark計(jì)算斯皮爾曼相關(guān)系數(shù) 517 第24章 DNA堿基計(jì)數(shù) 520 FASTA 格式 521 FASTQ 格式 522 MapReduce解決方案:FASTA 格式 522 運(yùn)行示例 524 MapReduce解決方案: FASTQ 格式 528 Spark 解決方案: FASTA 格式 533 Spark解決方案: FASTQ 格式 537 第25章 RNA測(cè)序 543 數(shù)據(jù)大小和格式 543 MapReduce工作流 544 RNA測(cè)序分析概述 544 RNA測(cè)序MapReduce算法 548 第26章基因聚合 553 輸入 554 輸出 554 MapReduce解決方案(按單個(gè)值過(guò)濾和按平均值過(guò)濾) 555 基因聚合的Spark解決方案 567 Spark解決方案:按單個(gè)值過(guò)濾 567 Spark解決方案:按平均值過(guò)濾 576 第27章線(xiàn)性回歸 586 基本定義 587 簡(jiǎn)單示例 587 問(wèn)題描述 588 輸入數(shù)據(jù) 589 期望輸出 590 使用SimpleRegression的MapReduce解決方案 590 Hadoop實(shí)現(xiàn)類(lèi) 593 使用R線(xiàn)性模型的MapReduce解決方案 593 第28章 MapReduce和幺半群 600 概述 600 幺半群的定義 602 幺半群和非幺半群示例 603 MapReduce示例:非幺半群 606 MapReduce示例:幺半群 608 使用幺半群的Spark示例 612 使用幺半群的結(jié)論 618 函子和幺半群 619 第29章小文件問(wèn)題 622 解決方案1:在客戶(hù)端合并小文件 623 解決方案2:用CombineFileInputFormat解決小文件問(wèn)題 629 其他解決方案 634 第30章 MapReduce的大容量緩存 635 實(shí)現(xiàn)方案 636 緩存問(wèn)題形式化描述 637 一個(gè)精巧、可伸縮的解決方案 637 實(shí)現(xiàn)LRUMap緩存 640 使用LRUMap的MapReduce解決方案 646 第31章 Bloom過(guò)濾器 651Bloom 過(guò)濾器性質(zhì) 651 一個(gè)簡(jiǎn)單的Bloom過(guò)濾器示例 653
你還可能感興趣
我要評(píng)論
|