版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
Linux系統(tǒng)與大數(shù)據(jù)應(yīng)用8大數(shù)據(jù)開發(fā)平臺第章本章內(nèi)容8.1大數(shù)據(jù)開發(fā)平臺簡介8.2
Hadoop框架介紹8.3Hadoop安裝與配置8.4Spark簡介8.5Spark安裝與配置8.1大數(shù)據(jù)開發(fā)平臺簡介
大數(shù)據(jù)開發(fā)主要是由分布式文件系統(tǒng)HDFS,分布式計算框架Mapreduce,數(shù)據(jù)倉庫工具Hive,開源數(shù)據(jù)庫HBase等等構(gòu)成的hadoop生態(tài)圈。本節(jié)介紹hadoop的主要應(yīng)用及前景。隨著信息產(chǎn)業(yè)的飛速發(fā)展,大數(shù)據(jù)技術(shù)的應(yīng)用已經(jīng)潛移默化的走進人們的生活。首先,大數(shù)據(jù)應(yīng)用于方便人們?nèi)粘I畹男」ぞ?。例如,近年來輸入法的改良。無論是手寫輸入還是拼音輸入,利用大數(shù)據(jù)為基礎(chǔ),許多輸入法都開發(fā)了提前預(yù)測和拼寫糾錯的功能。其次,大數(shù)據(jù)應(yīng)用于網(wǎng)絡(luò)消費者的購買預(yù)測與商品比較。網(wǎng)絡(luò)用戶瀏覽網(wǎng)頁時產(chǎn)生的數(shù)據(jù)會被網(wǎng)站記錄下來,網(wǎng)站將這些海量數(shù)據(jù)進行分析整理,針對不同人群的喜好,在屏幕上彈出與之喜好相符的小廣告,盡可能地節(jié)省廣告空間,挖掘用戶的購買欲望,提高銷售額。同樣,從消費者的角度來看,大數(shù)據(jù)可以幫助消費者快速找出來不同廠家的類似商品,方便消費者貨比三家,挑選到自己滿意的商品。8.1.1大數(shù)據(jù)的應(yīng)用與前景從以上觸手可及的應(yīng)用,可以看出,在當今人們的生活中,大數(shù)據(jù)發(fā)揮著重要的作用。雖然大數(shù)據(jù)才剛開始應(yīng)用于很多領(lǐng)域,但是從大數(shù)據(jù)的原理和發(fā)展現(xiàn)狀來看,大數(shù)據(jù)應(yīng)用具有廣闊的發(fā)展前景。在信息產(chǎn)業(yè)高速發(fā)展的時代,大數(shù)據(jù)逐步深入人們的生活,大數(shù)據(jù)的應(yīng)用給人類的發(fā)展產(chǎn)生深遠影響。隨著時代的進步,大數(shù)據(jù)將更好地為人類服務(wù),給人們的日常生活提供方便。通過運用過去無法獲取的數(shù)據(jù)來催生新的服務(wù),是一條人們對未來大數(shù)據(jù)應(yīng)用發(fā)展的新思路。8.1.1大數(shù)據(jù)的應(yīng)用與前景Hadoop是一個由Apache基金會所開發(fā)的分布式系統(tǒng)基礎(chǔ)架構(gòu),一個開源分布式計算平臺。以Hadoop分布式文件系統(tǒng)(HadoopDistributedFileSystem,HDFS)和MapReduce(GoogleMapReduce的開源實現(xiàn))為核心的Hadoop為用戶提供了系統(tǒng)底層細節(jié)透明的分布式基礎(chǔ)架構(gòu)。HDFS的高容錯性、高伸縮性等優(yōu)點允許用戶將Hadoop部署在低廉的硬件上,形成分布式系統(tǒng);MapReduce分布式編程模型允許用戶在不了解分布式系統(tǒng)底層細節(jié)的情況下開發(fā)并行應(yīng)用程序。所以用戶可以利用Hadoop輕松地組織計算機資源,從而搭建自己的分布式計算平臺,并且可以充分利用集群的計算和存儲能力,完成海量數(shù)據(jù)的處理。簡單地來說,Hadoop是一個可以更容易開發(fā)和運行處理大規(guī)模數(shù)據(jù)的軟件平臺。8.1.2Hadoop簡介Hadoop的源頭是ApacheNutch,該項目始于2002年,是ApacheLucene的子項目之一。2004年,Google在“操作系統(tǒng)設(shè)計與實現(xiàn)”(會議上公開發(fā)表了題為MapReduce:SimplifedDataProcessingonLargeClusters(《MapReduce:簡化大規(guī)模集群上的數(shù)據(jù)處理》)的論文之后,受到啟發(fā)的DougCutting等人開始嘗試實現(xiàn)MapReduce計算框架,并將它與NDFS(NutchDistributedFileSystem)結(jié)合,用以支持Nutch引擎的主要算法。由于NDFS和MapReduce在Nutch引擎中有著良好的應(yīng)用,所以它們于2006年2月被分離出來,成為一套完整而獨立的軟件,并命名為Hadoop。到了2008年年初,Hadoop已成為Apache的頂級項目,包含眾多子項目。它被應(yīng)用到包括Yahoo!在內(nèi)的很多互聯(lián)網(wǎng)公司。8.1.2Hadoop簡介8.2Hadoop框架介紹Hadoop的核心就是Hadoop的基礎(chǔ)框架,本節(jié)主要介紹Hadoop框架組件。8.2.1Hadoop框架及組件介紹Hadoop由許多元素構(gòu)成。其最底部是HadoopDistributedFileSystem(HDFS),它存儲Hadoop集群中所有存儲節(jié)點上的文件。HDFS(對于本文)的上一層是MapReduce
引擎,該引擎由JobTrackers和TaskTrackers組成。通過對Hadoop分布式計算平臺最核心的分布式文件系統(tǒng)HDFS、MapReduce處理過程,以及數(shù)據(jù)倉庫工具Hive和分布式數(shù)據(jù)庫Hbase的介紹,基本涵蓋了Hadoop分布式平臺的所有技術(shù)核心。Hadoop的框架最核心的設(shè)計就是:HDFS和MapReduce。HDFS為海量的數(shù)據(jù)提供了存儲,則MapReduce為海量的數(shù)據(jù)提供了計算。HDFS的工作機制如圖8-1所示。8.2.1Hadoop框架及組件介紹8.2.1Hadoop框架及組件介紹(1)HDFSHDFS,(hadoop
DistributedFileSystem)hadoop分布式文件系統(tǒng)。在Google開源有關(guān)DFS的論文后,由一位大牛開發(fā)而成。HDFS的建立在集群之上,適合PB級大量數(shù)據(jù)的存儲,擴展性強,容錯性高。它也是Hadoop集群的基礎(chǔ),大部分內(nèi)容都存在了HDFS上。HDFS內(nèi)部的所有通信都基于標準的
TCP/IP
協(xié)議。8.2.1Hadoop框架及組件介紹管理:NameNode、DataNode和Client。NameNode可以看做是分布式文件系統(tǒng)中的管理者,主要負責管理文件系統(tǒng)的命名空間、集群配置信息和存儲塊的復(fù)制等。NameNode會將文件系統(tǒng)的Metadata存儲在內(nèi)存中,這些信息主要包括文件信息、每一個文件對應(yīng)的文件塊的信息和每一個文件塊在DataNode中的信息等。DataNode是文件存儲的基本單元,它將文件塊(Block)存儲在本地文件系統(tǒng)中,保存了所有Block的Metadata,同時周期性地將所有存在的Block信息發(fā)送給NameNode。Client就是需要獲取分布式文件系統(tǒng)文件的應(yīng)用程序。接下來通過三個具體的操作來說明HDFS對數(shù)據(jù)的管理。8.2.1Hadoop框架及組件介紹(2)MapReduceMapReduce,是Hadoop中的計算框架,由兩部分構(gòu)成。Map操作以及Reduce操作。MapReduce,會生成計算的任務(wù),分配到各個節(jié)點上,執(zhí)行計算。這樣就避免了移動集群上面的數(shù)據(jù)。而且其內(nèi)部,也有容錯的功能。在計算過程中,某個節(jié)點宕掉之后,會有策略進行應(yīng)對。Hadoop集群,上層的一些工具,比如Hive或者Pig等,都會轉(zhuǎn)換為基本的MapReduce任務(wù)來執(zhí)行。8.2.1Hadoop框架及組件介紹(3)HBaseHbase源自谷歌的BigTable。hbase是面向列存儲的數(shù)據(jù)庫,性能高,擴展性強,可靠性高。HBase的內(nèi)容,存儲在HDFS上,當然它也可以使用其他的文件系統(tǒng),如S3等。HBase作為一個頂級項目,使用頻率很高。如:我們可以用來存儲,爬蟲爬來的網(wǎng)頁的信息等。具體的HBase的概念請見后續(xù)詳細說明。延遲較低。HBase是建立在Hadoop文件系統(tǒng)之上的分布式面向列的數(shù)據(jù)庫。它是一個開源項目,是橫向擴展的。HBase是一個數(shù)據(jù)模型,類似于谷歌的大表設(shè)計,可以提供快速隨機訪問海量結(jié)構(gòu)化數(shù)據(jù)。它利用了Hadoop的文件系統(tǒng)(HDFS)提供的容錯能力。它是Hadoop的生態(tài)系統(tǒng),提供對數(shù)據(jù)的隨機實時讀/寫訪問,是Hadoop文件系統(tǒng)的一部分。人們可以直接或通過HBase的存儲HDFS數(shù)據(jù)。使用HBase在HDFS讀取消費/隨機訪問數(shù)據(jù)。HBase在Hadoop的文件系統(tǒng)之上,并提供了讀寫訪問。8.2.1Hadoop框架及組件介紹Base有三個主要組成部分:客戶端庫,主服務(wù)器和區(qū)域服務(wù)器。區(qū)域服務(wù)器可以按要求添加或刪除。主服務(wù)器是
分配區(qū)域給區(qū)域服務(wù)器并在ApacheZooKeeper的幫助下完成這個任務(wù)。處理跨區(qū)域的服務(wù)器區(qū)域的負載均衡。它卸載繁忙的服務(wù)器和轉(zhuǎn)移區(qū)域較少占用的服務(wù)器。通過判定負載均衡以維護集群的狀態(tài)。負責模式變化和其他元數(shù)據(jù)操作,如創(chuàng)建表和列。區(qū)域只不過是表被拆分,并分布在區(qū)域服務(wù)器。區(qū)域服務(wù)器擁有區(qū)域如下,與客戶端進行通信并處理數(shù)據(jù)相關(guān)的操作,讀寫的所有地區(qū)的請求。8.2.1Hadoop框架及組件介紹(4)HiveHive是基于Hadoop的一個數(shù)據(jù)倉庫工具,可以將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫表,并提供簡單的sql查詢功能,可以將sql語句轉(zhuǎn)換為MapReduce任務(wù)進行運行。其優(yōu)點是學(xué)習(xí)成本低,可以通過類SQL語句快速實現(xiàn)簡單的MapReduce統(tǒng)計,不必開發(fā)專門的MapReduce應(yīng)用,十分適合數(shù)據(jù)倉庫的統(tǒng)計分析。Hive是建立在Hadoop上的數(shù)據(jù)倉庫基礎(chǔ)構(gòu)架。它提供了一系列的工具,可以用來進行數(shù)據(jù)提取轉(zhuǎn)化加載,這是一種可以存儲、查詢和分析存儲在Hadoop中的大規(guī)模數(shù)據(jù)的機制。Hive定義了簡單的類SQL查詢語言,稱為HQL,它允許熟悉SQL的用戶查詢數(shù)據(jù)。同時,這個語言也允許熟悉MapReduce開發(fā)者的開發(fā)自定義的mapper和reducer來處理內(nèi)建的mapper和reducer無法完成的復(fù)雜的分析工作。Hive的工作機制如圖8-2所示。8.2.1Hadoop框架及組件介紹8.2.1Hadoop框架及組件介紹(5)SqoopSqoop,也是一個很神奇的數(shù)據(jù)同步工具。在關(guān)系型數(shù)據(jù)庫中,我們會遇到一種情景,將Oracle數(shù)據(jù)導(dǎo)入到mysql,或者將Mysql數(shù)據(jù),導(dǎo)入到oracle。那其實Sqoop也是類似的功能。sqoop可以將Oracle,Mysql等關(guān)系型數(shù)據(jù)庫中的數(shù)據(jù),導(dǎo)入到HBase,HDFS上,當然也可以從HDFS或HBase導(dǎo)入到Mysql或Oracle上。8.2.1Hadoop框架及組件介紹(6)FlumeFlume,是日志收集工具,是分布式的,可靠的,容錯的,可以定制的。應(yīng)用場景如:100臺服務(wù)器,需要監(jiān)測各個服務(wù)器的運行情況,這時可以用flume將各個服務(wù)器的日志,收集過來。Flume也有兩個版本。FlumeOG和FlumeNG。現(xiàn)在基本都用NG了。Flume分布式系統(tǒng)中最核心的角色是agent,flume采集系統(tǒng)就是由一個個agent所連接起來形成每一個agent相當于一個數(shù)據(jù)傳遞員,內(nèi)部有三個組件:Source:采集源,用于跟數(shù)據(jù)源對接,以獲取數(shù)據(jù)Sink:下沉地,采集數(shù)據(jù)的傳送目的,用于往下一級agent傳遞數(shù)據(jù)或者往最終存儲系統(tǒng)傳遞數(shù)據(jù)Channel:angent內(nèi)部的數(shù)據(jù)傳輸通道,用于從source將數(shù)據(jù)傳遞到sink。8.2.1Hadoop框架及組件介紹Flume的具體配置如圖8-3所示。8.2.1Hadoop框架及組件介紹(7)ImpalaImpala是Cloudera公司主導(dǎo)開發(fā)的新型查詢系統(tǒng),它提供SQL語義,能查詢存儲在Hadoop的HDFS和HBase中的PB級大數(shù)據(jù)。已有的Hive系統(tǒng)雖然也提供了SQL語義,但由于Hive底層執(zhí)行使用的是MapReduce引擎,仍然是一個批處理過程,難以滿足查詢的交互性。相比之下,Impala的最大特點也是最大賣點就是它的快速。Imapa可以和Phoenix,Spark
Sql聯(lián)系起來了解一下。8.2.1Hadoop框架及組件介紹(8)SparkSpark是一種快速、通用、可擴展的大數(shù)據(jù)分析引擎,RDD叫做分布式數(shù)據(jù)集,是Spark中最基本的數(shù)據(jù)抽象,它代表一個不可變、可分區(qū)、里面的元素可并行計算的集合。SparkSQL是用于結(jié)構(gòu)化數(shù)據(jù)處理的Spark模塊。與基本的SparkRDDAPI不同,SparkSQL提供的接口為Spark提供了關(guān)于數(shù)據(jù)結(jié)構(gòu)和正在執(zhí)行的計算的更多信息。SparkStreaming是SparkAPI核心的擴展,支持可擴展,高吞吐量,實時數(shù)據(jù)流的容錯流處理。MLlib是Spark的機器學(xué)習(xí)(ML)庫。其目標是使實際的機器學(xué)習(xí)可擴展和容易。8.2.1Hadoop框架及組件介紹(9)ZookeeperZookeeper,動物管理員。Zookeeper叫分布式協(xié)作服務(wù)。作用主要是,統(tǒng)一命名,狀態(tài)同步,集群管理,配置同步。Zookeeper在HBase,以及Hadoop2.x中,都有用到。以一個簡單的例子來說明整個選舉的過程.假設(shè)有五臺服務(wù)器組成的zookeeper集群,它們的id從1-5,同時它們都是最新啟動的,也就是沒有歷史數(shù)據(jù),在存放數(shù)據(jù)量這一點上,都是一樣的.假設(shè)這些服務(wù)器依序啟動,來看看會發(fā)生什么.
8.2.1Hadoop框架及組件介紹1)服務(wù)器1啟動,此時只有它一臺服務(wù)器啟動了,它發(fā)出去的報沒有任何響應(yīng),所以它的選舉狀態(tài)一直是LOOKING狀態(tài)
2)服務(wù)器2啟動,它與最開始啟動的服務(wù)器1進行通信,互相交換自己的選舉結(jié)果,由于兩者都沒有歷史數(shù)據(jù),所以id值較大的服務(wù)器2勝出,但是由于沒有達到超過半數(shù)以上的服務(wù)器都同意選舉它(這個例子中的半數(shù)以上是3),所以服務(wù)器1,2還是繼續(xù)保持LOOKING狀態(tài).
3)服務(wù)器3啟動,根據(jù)前面的理論分析,服務(wù)器3成為服務(wù)器1,2,3中的老大,而與上面不同的是,此時有三臺服務(wù)器選舉了它,所以它成為了這次選舉的leader.
4)服務(wù)器4啟動,根據(jù)前面的分析,理論上服務(wù)器4應(yīng)該是服務(wù)器1,2,3,4中最大的,但是由于前面已經(jīng)有半數(shù)以上的服務(wù)器選舉了服務(wù)器3,所以它只能接收當小弟的命了.
5)服務(wù)器5啟動,同4一樣,當小弟.
8.2.1Hadoop框架及組件介紹MahoutMahout是ApacheSoftwareFoundation旗下的一個開源項目,是一個數(shù)據(jù)挖掘算法庫,里面內(nèi)置了大量的算法,提供一些可擴展的機器學(xué)習(xí)領(lǐng)域經(jīng)典算法的實現(xiàn),旨在幫助開發(fā)人員更加方便快捷地創(chuàng)建智能應(yīng)用程序。Mahout包含許多實現(xiàn),包括聚類、分類、推薦過濾、頻繁子項挖掘。此外,通過使用ApacheHadoop庫,Mahout可以有效地擴展到云中。mahout可以用來做預(yù)測、分類、回歸、聚類和協(xié)同過濾。
8.2.1Hadoop框架及組件介紹(11)PigPig開發(fā)是2006年在雅虎內(nèi)部進行開發(fā)的,2008年雅虎把Pig公開,這個是Pig拉丁語言的所有的系統(tǒng),整個語言都是根據(jù)這篇Paper開發(fā)的。第二是Hortonworks把源代碼提交給Apache,還做了第一個release。2008年P(guān)ig成為Hadoop的子項目。2010年又從Hadoop獨立出來,現(xiàn)在是Apache的一級子項目。2011年7月份Hortonworks發(fā)布了Pig
0.9.0,里面增加了Embedding。2012年4月份Hortonworks發(fā)表了Pig0.10,其中包括了新的數(shù)據(jù)類型Boolean,現(xiàn)在正在開發(fā)的是Pig0.1,這個版本馬上就可以發(fā)行了,在做最后的功能測試。增加的功能是兩個新的操作,一個是數(shù)據(jù)倉庫的操作和Rank的操作。還有新的數(shù)據(jù)類型Datatime。
8.2.1Hadoop框架及組件介紹YarnApacheHadoopYARN是一種Hadoop資源管理器,它是一個通用資源管理系統(tǒng),可為上層應(yīng)用提供統(tǒng)一的資源管理和調(diào)度,它的引入為集群在利用率、資源統(tǒng)一管理和數(shù)據(jù)共享等方面帶來了巨大好處。yarn并不清楚用戶提交的程序的運行機制只提供運算資源的調(diào)度(用戶程序向yarn申請資源,yarn就負責分配資源)yarn中的主管角色叫ResourceManager。
8.2.1Hadoop框架及組件介紹yarn中具體提供運算資源的角色叫NodeManager。這樣一來,yarn其實就與運行的用戶程序完全解耦,就意味著yarn上可以運行各種類型的分布式運算程序(mapreduce只是其中的一種),比如mapreduce、storm程序,spark程序。所以,spark、storm等運算框架都可以整合在yarn上運行,只要他們各自的框架中有符合yarn規(guī)范的資源請求機制即可。Yarn就成為一個通用的資源調(diào)度平臺,從此,企業(yè)中以前存在的各種運算集群都可以整合在一個物理集群上,提高資源利用率,方便數(shù)據(jù)共享。調(diào)度器調(diào)度器根據(jù)容量、隊列等限制條件(如每個隊列分配一定的資源,最多執(zhí)行一定數(shù)量的作業(yè)等),將系統(tǒng)中的資源分配給各個正在運行的應(yīng)用程序。需要注意的是,該調(diào)度器是一個“純調(diào)度器”,它不再從事任何與具體應(yīng)用程序相關(guān)的工作,比如不負責監(jiān)控或者跟蹤應(yīng)用的執(zhí)行狀態(tài)等,也不負責重新啟動因應(yīng)用執(zhí)行失敗或者硬件故障而產(chǎn)生的失敗任務(wù),這些均交由應(yīng)用程序相關(guān)的ApplicationMaster完成。調(diào)度器僅根據(jù)各個應(yīng)用程序的資源需求進行資源分配,而資源分配單位用一個抽象概念“資源容器”(ResourceContainer,簡稱Container)表示,Container是一個動態(tài)資源分配單位,它將內(nèi)存、CPU、磁盤、網(wǎng)絡(luò)等資源封裝在一起,從而限定每個任務(wù)使用的資源量。此外,該調(diào)度器是一個可插拔的組件,用戶可根據(jù)自己的需要設(shè)計新的調(diào)度器,YARN提供了多種直接可用的調(diào)度器,比如FairScheduler和CapacityScheduler等。應(yīng)用程序管理器應(yīng)用程序管理器負責管理整個系統(tǒng)中所有應(yīng)用程序,包括應(yīng)用程序提交、與調(diào)度器協(xié)商資源以啟動ApplicationMaster、監(jiān)控ApplicationMaster運行狀態(tài)并在失敗時重新啟動它等
8.2.1Hadoop框架及組件介紹yarnApplicationMaster(AM)用戶提交的每個應(yīng)用程序均包含一個AM,主要功能包括:與RM調(diào)度器協(xié)商以獲取資源(用Container表示),將得到的任務(wù)進一步分配給內(nèi)部的任務(wù)(資源的二次分配),與NM通信以啟動/停止任務(wù),監(jiān)控所有任務(wù)運行狀態(tài),并在任務(wù)運行失敗時重新為任務(wù)申請資源以重啟任務(wù)。當前YARN自帶了兩個AM實現(xiàn),一個是用于演示AM編寫方法的實例程序distributedshell,它可以申請一定數(shù)目的Container以并行運行一個Shell命令或者Shell腳本,另一個是運行MapReduce應(yīng)用程序的AM—MRAppMaster。注:RM只負責監(jiān)控AM,在AM運行失敗時候啟動它,RM并不負責AM內(nèi)部任務(wù)的容錯,這由AM來完成。yarnNodeManager(NM)NM是每個節(jié)點上的資源和任務(wù)管理器,一方面,它會定時地向RM匯報本節(jié)點上的資源使用情況和各個Container的運行狀態(tài),另一方面,它接收并處理來自AM的Container啟動/停止等各種請求。yarnContainerContainer是YARN中的資源抽象,它封裝了某個節(jié)點上的多維度資源,如內(nèi)存、CPU、磁盤、網(wǎng)絡(luò)等,當AM向RM申請資源時,RM為AM返回的資源便是用Container表示。YARN會為每個任務(wù)分配一個Container,且該任務(wù)只能使用該Container中描述的資源。注:1.Container不同于MRv1中的slot,它是一個動態(tài)資源劃分單位,是根據(jù)應(yīng)用程序的需求動態(tài)生成的。2.現(xiàn)在YARN僅支持CPU和內(nèi)存兩種資源,且使用了輕量級資源隔離機制Cgroups進行資源隔離。YARN的資源管理和執(zhí)行框架都是按主/從范例實現(xiàn)的——Slave---節(jié)點管理器(NM)運行、監(jiān)控每個節(jié)點,并向集群的Master---資源管理器(RM)報告資源的可用性狀態(tài),資源管理器最終為系統(tǒng)里所有應(yīng)用分配資源。特定應(yīng)用的執(zhí)行由ApplicationMaster控制,ApplicationMaster負責將一個應(yīng)用分割成多個任務(wù),并和資源管理器協(xié)調(diào)執(zhí)行所需的資源,資源一旦分配好,ApplicationMaster就和節(jié)點管理器一起安排、執(zhí)行、監(jiān)控獨立的應(yīng)用任務(wù)。需要說明的是,YARN不同服務(wù)組件的通信方式采用了事件驅(qū)動的異步并發(fā)機制,這樣可以簡化系統(tǒng)的設(shè)計。
8.2.1Hadoop框架及組件介紹Yarn的架構(gòu)如圖8-4所示。
8.2.2Hadoop的核心組件HDFS和mapreaduce是haddop的兩個核心組件(1)HDFS,hdfs集群分為兩大角色:NameNode,DataNode(SecondaryNameNode)。NameNode負責管理整個文件的元數(shù)據(jù)(命名空間信息,塊信息)相當于Master。DataNode負責管理用戶的文件數(shù)據(jù)塊相當于Salve。文件會按照固定的大小(block=128M)切成若干塊后分布式存儲在若干個datanode節(jié)點上。每一個文件塊有多個副本(默認8.2.2Hadoop的核心組件是三個),存在不同的datanode上。DataNode會定期向NameNode匯報自身所保存的文件block信息,而namenode則會負責保持文件副本數(shù)量。hdfs的內(nèi)部工作機制會對客戶的保持透明,客戶端請求方法hdfs都是通過向namenode申請來進行訪問。SecondaryNameNode有兩個作用,一是鏡像備份,二是日志與鏡像的定期合并??蛻舳艘騢dfs寫入數(shù)據(jù),首先要跟namenode通信以確認可以寫文件并獲得接收文件block的datanode,然后,客戶端按照順序?qū)⑽募lock逐個傳給相應(yīng)datanode,并由接收到block的datanode負責向其他datanode復(fù)制block副本。8.2.2Hadoop的核心組件(2)MapReduce的流程如下:一個mr程序啟動的時候,最先啟動的是MRAppMaster,MRAppMaster啟動后根據(jù)本次job的描述信息,計算出需要的maptask實例數(shù)量,然后向集群申請機器啟動相應(yīng)數(shù)量的maptask進程。maptask進程啟動之后,根據(jù)給定的數(shù)據(jù)切片范圍進行數(shù)據(jù)處理,主體流程為:利用客戶指定的inputformat來獲取RecordReader讀取數(shù)據(jù),形成輸入KV對將輸入KV對傳遞給客戶定義的map()方法,做邏輯運算,并將map()方法輸出的KV對收集到緩存,將緩存中的KV對按照K分區(qū)排序后不斷溢寫到磁盤文件,MRAppMaster監(jiān)控到所有maptask進程任務(wù)完成之后,會根據(jù)客戶指定的參數(shù)啟動相應(yīng)數(shù)量的reducetask進程,并告知reducetask進程要處理的數(shù)據(jù)范圍(數(shù)據(jù)分區(qū))。Reducetask進程啟動之后,根據(jù)MRAppMaster告知的待處理數(shù)據(jù)所在位置,從若干臺maptask運行所在機器上獲取到若干個maptask輸出結(jié)果文件,并在本地進行重新歸并排序,然后按照相同key的KV為一個組,調(diào)用客戶定義的reduce()方法進行邏輯運算,并收集運算輸出的結(jié)果KV,然后調(diào)用客戶指定的outputformat將結(jié)果數(shù)據(jù)輸出到外部存儲。8.2.3Hadoop的安全性眾所周知,Hadoop的優(yōu)勢在于其能夠?qū)⒘畠r的普通PC組織成能夠高效穩(wěn)定處理事務(wù)的大型集群,企業(yè)正是利用這一特點來構(gòu)架Hadoop集群、獲取海量數(shù)據(jù)的高效處理能力的。但是,Hadoop集群搭建起來后如何保證它安全穩(wěn)定地運行呢?舊版本的Hadoop中沒有完善的安全策略,導(dǎo)致Hadoop集群面臨很多風險,例如,用戶可以以任何身份訪問HDFS或MapReduce集群,可以在Hadoop集群上運行自己的代碼來冒充Hadoop集群的服務(wù),任何未被授權(quán)的用戶都可以訪問DataNode節(jié)點的數(shù)據(jù)塊等。8.2.3Hadoop的安全性(1)用戶權(quán)限管理Hadoop上的用戶權(quán)限管理主要涉及用戶分組管理,為更高層的HDFS訪問、服務(wù)訪問、Job提交和配置Job等操作提供認證和控制基礎(chǔ)。Hadoop上的用戶和用戶組名均由用戶自己指定,如果用戶沒有指定,那么Hadoop會調(diào)用Linux的"whoami"命令獲取當前Linux系統(tǒng)的用戶名和用戶組名作為當前用戶的對應(yīng)名,并將其保存在Job的和兩個屬性中。這樣用戶所提交Job的后續(xù)認證和授權(quán)以及集群服務(wù)的訪問都將基于此用戶和用戶組的權(quán)限及認證信息進行。例如,在用戶提交Job到JobTracker時,JobTracker會讀取保存在Job路徑下的用戶信息并進行認證,在認證成功并獲取令牌之后,JobTracker會根據(jù)用戶和用戶組的權(quán)限信息將Job提交到Job隊列(具體細節(jié)參見本小節(jié)的HDFS安全策略和MapReduce安全策略)。
Hadoop集群的管理員是創(chuàng)建和配置Hadoop集群的用戶,它可以配置集群,使用Kerberos機制進行認證和授權(quán)。同時管理員可以在集群的服務(wù)(集群的服務(wù)主要包括NameNode、DataNode、JobTracker和TaskTracker)授權(quán)列表中添加或更改某確定用戶和用戶組,系統(tǒng)管理員同時負責Job隊列和隊列的訪問控制矩陣的創(chuàng)建。
8.2.3Hadoop的安全性(2)HDFS安全策略
用戶和HDFS服務(wù)之間的交互主要有兩種情況:用戶機和NameNode之間的RPC交互獲取待通信的DataNode位置,客戶機和DataNode交互傳輸數(shù)據(jù)塊。
RPC交互可以通過Kerberos或授權(quán)令牌來認證。在認證與NameNode的連接時,用戶需要使用Kerberos證書來通過初試認證,獲取授權(quán)令牌。授權(quán)令牌可以在后續(xù)用戶Job與NameNode連接的認證中使用,而不必再次訪問KerberosKeyServer。授權(quán)令牌實際上是用戶機與NameNode之間共享的密鑰。授權(quán)令牌在不安全的網(wǎng)絡(luò)上傳輸時,應(yīng)給予足夠的保護,防止被其他用戶惡意竊取,因為獲取授權(quán)令牌的任何人都可以假扮成認證用戶與NameNode進行不安全的交互。需要注意的是,每個用戶只能通過Kerberos認證獲取唯一一個新的授權(quán)令牌。用戶從NameNode獲取授權(quán)令牌之后,需要告訴NameNode:誰是指定的令牌更新者。指定的更新者在為用戶更新令牌時應(yīng)通過認證確定自己就是NameNode。更新令牌意味著延長令牌在NameNode上的有效期。為了使MapReduceJob使用一個授權(quán)令牌,用戶應(yīng)將JobTracker指定為令牌更新者。這樣同一個Job的所有Task都會使用同一個令牌。JobTracker需要保證這一令牌在整個任務(wù)的執(zhí)行過程中都是可用的,在任務(wù)結(jié)束之后,它可以選擇取消令牌。
8.2.3Hadoop的安全性數(shù)據(jù)塊的傳輸可以通過塊訪問令牌來認證,每一個塊訪問令牌都由NameNode生成,它們都是特定的。塊訪問令牌代表著數(shù)據(jù)訪問容量,一個塊訪問令牌保證用戶可以訪問指定的數(shù)據(jù)塊。塊訪問令牌由NameNode簽發(fā)被用在DataNode上,其傳輸過程就是將NameNode上的認證信息傳輸?shù)紻ataNode上。塊訪問令牌是基于對稱加密模式生成的,NameNode和DataNode共享了密鑰。對于每個令牌,NameNode基于共享密鑰計算一個消息認證碼(Message
Authentication
Code,
MAC)。接下來,這個消息認證碼就會作為令牌驗證器成為令牌的主要組成部分。當一個DataNode接收到一個令牌時,它會使用自己的共享密鑰重新計算一個消息認證碼,如果這個認證碼同令牌中的認證碼匹配,那么認證成功。
8.2.3Hadoop的安全性(3)MapReduce安全策略
MapReduce安全策略主要涉及Job提交、Task和Shuffle三個方面。對于Job提交,用戶需要將Job配置、輸入文件和輸入文件的元數(shù)據(jù)等寫入用戶home文件夾下,這個文件夾只能由該用戶讀、寫和執(zhí)行。接下來用戶將home文件夾位置和認證信息發(fā)送給JobTracker。在執(zhí)行過程中,Job可能需要訪問多個HDFS節(jié)點或其他服務(wù),因此,Job的安全憑證將以<String
key,
binary
value>形式保存在一個Map數(shù)據(jù)結(jié)構(gòu)中,在物理存儲介質(zhì)上將保存在HDFS中JobTracker的系統(tǒng)目錄下,并分發(fā)給每個TaskTracker。Job的授權(quán)令牌將NameNode的URL作為其關(guān)鍵信息。為了防止授權(quán)令牌過期,JobTracker會定期更新授權(quán)令牌。Job結(jié)束之后所有的令牌都會失效。為了獲取保存在HDFS上的配置信息,JobTracker需要使用用戶的授權(quán)令牌訪問HDFS,讀取必需的配置信息。
8.2.3Hadoop的安全性任務(wù)(Task)的用戶信息沿用生成Task的Job的用戶信息,因為通過這個方式能保證一個用戶的Job不會向TaskTracker或其他用戶Job的Task發(fā)送系統(tǒng)信號。這種方式還保證了本地文件有權(quán)限高效地保存私有信息。在用戶提交Job后,TaskTracker會接收到JobTracker分發(fā)的Job安全憑證,并將其保存在本地僅對該用戶可見的Job文件夾下。在與TaskTracker通信的時候,Task會用到這個憑證。當一個Map任務(wù)完成時,它的輸出被發(fā)送給管理此任務(wù)的TaskTracker。每一個Reduce將會與TaskTracker通信以獲取自己的那部分輸出,此時,就需要MapReduce框架保證其他用戶不會獲取這些Map的輸出。Reduce任務(wù)會根據(jù)Job憑證計算請求的URL和當前時間戳的消息認證碼。這個消息認證碼會和請求一起發(fā)到TaskTracker,而TaskTracker只會在消息認證碼正確并且在封裝時間戳的N分鐘之內(nèi)提供服務(wù)。在TaskTracker返回數(shù)據(jù)時,為了防止數(shù)據(jù)被木馬替換,應(yīng)答消息的頭部將會封裝根據(jù)請求中的消息認證碼計算而來的新消息認證碼和Job憑證,從而保證Reduce能夠驗證應(yīng)答消息是由正確的TaskTracker發(fā)送而來。
8.2.3Hadoop的安全性通過Hadoop安全部署經(jīng)驗總結(jié),開發(fā)出以下十大建議,以確保大型和復(fù)雜多樣環(huán)境下的數(shù)據(jù)信息安全。1)先下手為強!在規(guī)劃部署階段就確定數(shù)據(jù)的隱私保護策略,最好是在將數(shù)據(jù)放入到Hadoop之前就確定好保護策略。
2)確定哪些數(shù)據(jù)屬于企業(yè)的敏感數(shù)據(jù)。根據(jù)公司的隱私保護政策,以及相關(guān)的行業(yè)法規(guī)和政府規(guī)章來綜合確定。
3)及時發(fā)現(xiàn)敏感數(shù)據(jù)是否暴露在外,或者是否導(dǎo)入到Hadoop中。
4)搜集信息并決定是否暴露出安全風險。
5)確定商業(yè)分析是否需要訪問真實數(shù)據(jù),或者確定是否可以使用這些敏感數(shù)據(jù)。然后,選擇合適的加密技術(shù)。如果有任何疑問,對其進行加密隱藏處理,同時提供最安全的加密技術(shù)和靈活的應(yīng)對策略,以適應(yīng)未來需求的發(fā)展。
8.2.3Hadoop的安全性6)確保數(shù)據(jù)保護方案同時采用了隱藏和加密技術(shù),尤其是如果我們需要將敏感數(shù)據(jù)在Hadoop中保持獨立的話。
7)確保數(shù)據(jù)保護方案適用于所有的數(shù)據(jù)文件,以保存在數(shù)據(jù)匯總中實現(xiàn)數(shù)據(jù)分析的準確性。
8)確定是否需要為特定的數(shù)據(jù)集量身定制保護方案,并考慮將Hadoop的目錄分成較小的更為安全的組。
9)確保選擇的加密解決方案可與公司的訪問控制技術(shù)互操作,允許不同用戶可以有選擇性地訪問Hadoop集群中的數(shù)據(jù)。
10)確保需要加密的時候有合適的技術(shù)(比如Java、Pig等)可被部署并支持無縫解密和快速訪問數(shù)據(jù)。
8.3Hadoop安裝與配置剛開始接觸hadoop,hadoop的安裝往往成為新手的一道門檻,本章將詳細地介紹如何在Windows下利用虛擬機VMwareWorkstationPro安裝hadoop的三種模式。介紹Hadoop的安裝之前,先介紹一下Hadoop對各個節(jié)點的角色定義。Hadoop分別從三個角度將主機劃分為兩種角色。第一,最基本的劃分為Master和Slave,即主人與奴隸;第二,從HDFS的角色,將主機劃分為NameNode和DataNode(在分布式文件系統(tǒng)中,目錄的管理很重要,管理目錄相當于主人,而NameNode就是目錄管理者);第三,從Mapreduce的角度,將主機劃分為JobTracker和TaskTracker(一下Job經(jīng)常被劃分為多個Task,從這個角度不難理解它們之間的關(guān)系)。8.3Hadoop安裝與配置Hadoop有三種運行方式:單機模式、偽分布模式與完全分布式模式。乍眼一看,前兩種方式并不能體現(xiàn)云計算的優(yōu)勢,但是它們便于程序的測試與調(diào)試,所以還是很有意義的。可以在hadoop官網(wǎng)獲得hadoop官網(wǎng)發(fā)行版:/releases.html下載hadoop-2.6.5.tar.gz并將其解壓。8.3.1下載安裝Hadoop(1)下載和安裝JDK1.6sudo
apt-get
installopenjdk-6-jdk配置jdk的環(huán)境sudogedit/etc/profile在文件最下面加上下面4句話:#setJAVAEnvironmentexportJAVA_HOME=(你的JDK安裝位置,例如我的是/usr/lib/jvm/java-6-openjdk-amd64)exportCLASS_PATH=".:$JAVA_HOME/lib:$CLASSPATH"exportPATH="$JAVA_HOME/:$PATH"Java-version8.3.1下載安裝Hadoop(2)配置SSH免密碼登入sudoapt-getinstallsshssh-keygen-trsa-P“”將生成的公鑰追加到authorized_keys中cat~/.ssh/id_rsa.pub>>~/.ssh/authorized_keyssshlocalhostexit8.3.1下載安裝Hadoop(3)安裝hadoop2.6.5將hadoop放到/usr/local/hadoop目錄下設(shè)置hadoop-env.sh(其他版本目錄可能有所改變,搜索一下就好了)打開/usr/local/hadoop/etc/hadoop目錄下hadoop-env.sh文件,添加以下3條:exportJAVA_HOME=/usr/lib/jvm/java-6-openjdk-amd64(根據(jù)你的java安裝路徑)exportHADOOP_HOME=/usr/local/hadoopexportPATH=$PATH:/usr/local/hadoop/bin使環(huán)境變量生效:source/usr/local/hadoop/conf/hadoop-env.sh輸入hadoopversion若出現(xiàn)版本信息,則說明hadoop安裝成功8.3.2Hadoop配置Hadoop有兩種配置方式,一種是分布式,另一種是偽分布式這里介紹偽分布式。偽分布式模式就是只有一個節(jié)點的集群,這個節(jié)點既是Master,也是Slave;既是NameNode,也是DataNode;偽分布式前兩步跟單機模式一樣進入/usr/local/hadoop/etc/hadoop文件夾,修改配置文件hadoop-env.sh。指定JDK的安裝位置:exportJAVA_HOME=/usr/lib/jvm/java-6-openjdk-amd648.3.2Hadoop配置這是Hadoop核心的配置文件,這里配置的是HDFS(Hadoop的分布式文件系統(tǒng))的地址及端口號。/usr/local/hadoop/etc/hadoop目錄下core-site.xml文件<configuration> <property> <name></name> <value>hdfs://localhost:9000</value> </property></configuration>8.3.2Hadoop配置以下是hadoop中HDFS的配置,配置的備份方式默認為3,在單機版的hadoop中需要將其改為1。/usr/local/hadoop/etc/hadoop目錄下hdfs-site.xml文件<configuration> <property> <name>dfs.replication</name> <value>1</value> </property></configuration>8.3.2Hadoop配置以下是hadoop中MapReduce的配置文件,配置JobTracker的地址及端口。/usr/local/hadoop/etc/hadoop目錄下mapred-site.xml文件<configuration> <property> <name>mapreduce.job.tracker</name> <value>localhost:9001</value> </property></configuration>接下來,在啟動hadoop前,需要格式化hadoop的文件系統(tǒng)HDFS。進入Hadoop文件夾,輸入命令:bin/HadoopNameNode-format格式化文件系統(tǒng),接下來啟動Hadoop。8.3.2Hadoop配置輸入命令,啟動所有進程:bin/start-all.sh最后,驗證Hadoop是否安裝成功。打開瀏覽器,分別輸入網(wǎng)址:http://localhost:50030(mapreduce的Web頁面)http://localhost:50070(HDFS的Web頁面)如果都能查看,說明hadoop偽分布模式已經(jīng)安裝成功。Hdfs的web端界面如圖8-5所示。8.3.2Hadoop配置8.3.3詞頻統(tǒng)計示例之前我們已經(jīng)搭建好了hadoop平臺,現(xiàn)在我們就用hadoop自帶的一個wordcount命令進行詞頻統(tǒng)計。8.3.3詞頻統(tǒng)計示例【例8--1】單機模式下的詞頻統(tǒng)計。在hdfs根目錄下創(chuàng)建一個input文件夾,創(chuàng)建一個test文本文件,輸入英文單詞。將文件上傳至hdfs下的input目錄hdfsdfs-mkdir/inputHadoopfs-put/usr/test/inputcdinputvitest.txtcd..然后執(zhí)行wordcount命令,將input文件夾中的單詞以及他出現(xiàn)的次數(shù)都統(tǒng)計到output文件夾下。hadoopjarusr/hadoop/lib/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.5.jarwordcount/input/output//jar后面為自己實際jar包的目錄將output文件夾下的文件打印出來。Hdfsdfs-cat/output/part-r-00000//output后應(yīng)該為自己實際的分區(qū)名稱顯示出單詞以及它對應(yīng)的個數(shù)統(tǒng)計則運行成功。8.4Spark簡介Spark是一種快速、通用、可擴展的大數(shù)據(jù)分析引擎,2009年誕生于加州大學(xué)伯克利分校AMPLab,2010年開源,2013年6月成為Apache孵化項目,2014年2月成為Apache頂級項目。目前,Spark生態(tài)系統(tǒng)已經(jīng)發(fā)展成為一個包含多個子項目的集合,其中包含SparkSQL、Spark
Streaming、GraphX、MLlib等子項目,Spark是基于內(nèi)存計算的大數(shù)據(jù)并行計算框架。Spark基于內(nèi)存計算,提高了在大數(shù)據(jù)環(huán)境下數(shù)據(jù)處理的實時性,同時保證了高容錯性和高可伸縮性,允許用戶將Spark部署在大量廉價硬件之上,形成集群。Spark得到了眾多大數(shù)據(jù)公司的支持,這些公司包括Hortonworks、IBM、Intel、Cloudera、MapR、Pivotal、百度、阿里、騰訊、京東、攜程、優(yōu)酷土豆。當前百度的Spark已應(yīng)用于鳳巢、大搜索、直達號、百度大數(shù)據(jù)等業(yè)務(wù);阿里利用GraphX構(gòu)建了大規(guī)模的圖計算和圖挖掘系統(tǒng),實現(xiàn)了很多生產(chǎn)系統(tǒng)的推薦算法;騰訊Spark集群達到8000臺的規(guī)模,是當前已知的世界上最大的Spark集群。8.4.1Spark特點(1)運算速度快與Hadoop的MapReduce相比,Spark基于內(nèi)存的運算要快100倍以上,基于硬盤的運算也要快10倍以上。Spark實現(xiàn)了高效的DAG執(zhí)行引擎,可以通過基于內(nèi)存來高效處理數(shù)據(jù)流。(2)容易使用Spark支持Java、Python和Scala的API,還支持超過80種高級算法,使用戶可以快速構(gòu)建不同的應(yīng)用。而且Spark支持交互式的Python和Scala的shell,可以非常方便地在這些shell中使用Spark集群來驗證解決問題的方法。(3)通用性好Spark提供了統(tǒng)一的解決方案。Spark可以用于批處理、交互式查詢(Spark
SQL)、實時流處理(Spark
Streaming)、機器學(xué)習(xí)(Spark
MLlib)和圖計算(GraphX)。這些不同類型的處理都可以在同一個應(yīng)用中無縫使用。Spark統(tǒng)一的解決方案非常具有吸引力,畢竟任何公司都想用統(tǒng)一的平臺去處理遇到的問題,減少開發(fā)和維護的人力成本和部署平臺的物力成本。8.4.1Spark特點(4)兼容性好Spark可以非常方便地與其他的開源產(chǎn)品進行融合。比如,Spark可以使用Hadoop的YARN和Apache
Mesos作為它的資源管理和調(diào)度器,器,并且可以處理所有Hadoop支持的數(shù)據(jù),包括HDFS、HBase和Cassandra等。這對于已經(jīng)部署Hadoop集群的用戶特別重要,因為不需要做任何數(shù)據(jù)遷移就可以使用Spark的強大處理能力。Spark也可以不依賴于第三方的資源管理和調(diào)度器,它實現(xiàn)了Standalone作為其內(nèi)置的資源管理和調(diào)度框架,這樣進一步降低了Spark的使用門檻,使得所有人都可以非常容易地部署和使用Spark。此外,Spark還提供了在EC2上部署Standalone的Spark集群的工具。8.4.2Spark生態(tài)系統(tǒng)(1)彈性分布式數(shù)據(jù)集RDD(ResilientDistributedDataset)叫做分布式數(shù)據(jù)集,是Spark中最基本的數(shù)據(jù)抽象,它代表一個不可變、可分區(qū)、里面的元素可并行計算的集合。RDD具有數(shù)據(jù)流模型的特點:自動容錯、位置感知性調(diào)度和可伸縮性。RDD允許用戶在執(zhí)行多個查詢時顯式地將工作集緩存在內(nèi)存中,后續(xù)的查詢能夠重用工作集,這極大地提升了查詢速度。8.4.2Spark生態(tài)系統(tǒng)RDD支持兩種類型的操作:轉(zhuǎn)換(從現(xiàn)有數(shù)據(jù)集創(chuàng)建新數(shù)據(jù)集)和操作(在數(shù)據(jù)集上運行計算后將值返回給驅(qū)動程序)。例如,map是一個通過函數(shù)傳遞每個數(shù)據(jù)集元素的變換,并返回表示結(jié)果的新RDD。另一方面,reduce是一個動作,使用某個函數(shù)來聚合RDD的所有元素,并將最終結(jié)果返回給驅(qū)動程序。Spark中的所有轉(zhuǎn)換都是懶加載的,因為它們不會馬上計算結(jié)果。相反,他們只記得應(yīng)用于某些基礎(chǔ)數(shù)據(jù)集(例如文件)的轉(zhuǎn)換。只有在動作需要將結(jié)果返回給驅(qū)動程序時才會計算轉(zhuǎn)換。這種設(shè)計使Spark能夠更高效地運行。例如,我們可以認識到,通過創(chuàng)建的數(shù)據(jù)集map將被用于a中,reduce并且只返回reduce給驅(qū)動程序的結(jié)果,而不是更大的映射數(shù)據(jù)集。默認情況下,每次對其執(zhí)行操作時,每個已轉(zhuǎn)換的RDD都可能重新計算。但是,您也可以使用方法將RDD
保留在內(nèi)存中,在這種情況下,Spark將保留群集中的元素,以便在下次查詢時快速訪問。還支持在磁盤上持久化RDD,或在多個節(jié)點上復(fù)制RDD。8.4.2Spark生態(tài)系統(tǒng)RDD只支持粗粒度轉(zhuǎn)換,即在大量記錄上執(zhí)行的單個操作。將創(chuàng)建RDD的一系列Lineage(即血統(tǒng))記錄下來,以便恢復(fù)丟失的分區(qū)。RDD的Lineage會記錄RDD的元數(shù)據(jù)信息和轉(zhuǎn)換行為,當該RDD的部分分區(qū)數(shù)據(jù)丟失時,它可以根據(jù)這些信息來重新運算和恢復(fù)丟失的數(shù)據(jù)分區(qū)。Spark速度非常快的原因之一,就是在不同操作中可以在內(nèi)存中持久化或緩存?zhèn)€數(shù)據(jù)集。當持久化某個RDD后,每一個節(jié)點都將把計算的分片結(jié)果保存在內(nèi)存中,并在對此RDD或衍生出的RDD進行的其他動作中重用。這使得后續(xù)的動作變得更加迅速。RDD相關(guān)的持久化和緩存,是Spark最重要的特征之一??梢哉f,緩存是Spark構(gòu)建迭代式算法和快速交互式查詢的關(guān)鍵。RDD通過persist方法或cache方法可以將前面的計算結(jié)果緩存,但是并不是這兩個方法被調(diào)用時立即緩存,而是觸發(fā)后面的action時,該RDD將會被緩存在計算節(jié)點的內(nèi)存中,并供后面重用。8.4.2Spark生態(tài)系統(tǒng)RDD的容錯機制實現(xiàn)分布式數(shù)據(jù)集容錯方法有兩種:數(shù)據(jù)檢查點和記錄更新RDD采用記錄更新的方式:記錄所有更新點的成本很高。所以,RDD只支持粗顆粒變換,即只記錄單個塊上執(zhí)行的單個操作,然后創(chuàng)建某個RDD的變換序列(血統(tǒng))存儲下來;變換序列指,每個RDD都包含了他是如何由其他RDD變換過來的以及如何重建某一塊數(shù)據(jù)的信息。因此RDD的容錯機制又稱“血統(tǒng)”容錯。要實現(xiàn)這種“血統(tǒng)”容錯機制,最大的難題就是如何表達父RDD和子RDD之間的依賴關(guān)系。實際上依賴關(guān)系可以分兩種,窄依賴和寬依賴:窄依賴:子RDD中的每個數(shù)據(jù)塊只依賴于父RDD中對應(yīng)的有限個固定的數(shù)據(jù)塊;寬依賴:子RDD中的一個數(shù)據(jù)塊可以依賴于父RDD中的所有數(shù)據(jù)塊。例如:map變換,子RDD中的數(shù)據(jù)塊只依賴于父RDD中對應(yīng)的一個數(shù)據(jù)塊;groupByKey變換,子RDD中的數(shù)據(jù)塊會依賴于多有父RDD中的數(shù)據(jù)塊,因為一個key可能錯在于父RDD的任何一個數(shù)據(jù)塊中將依賴關(guān)系分類的兩個特性:第一,窄依賴可以在某個計算節(jié)點上直接通過計算父RDD的某塊數(shù)據(jù)計算得到子RDD對應(yīng)的某塊數(shù)據(jù);寬依賴則要等到父RDD所有數(shù)據(jù)都計算完成之后,并且父RDD的計算結(jié)果進行hash并傳到對應(yīng)節(jié)點上之后才能計算子RDD。第二,數(shù)據(jù)丟失時,對于窄依賴只需要重新計算丟失的那一塊數(shù)據(jù)來恢復(fù);對于寬依賴則要將祖先RDD中的所有數(shù)據(jù)塊全部重新計算來恢復(fù)。所以在長“血統(tǒng)”鏈特別是有寬依賴的時候,需要在適當?shù)臅r機設(shè)置數(shù)據(jù)檢查點。也是這兩個特性要求對于不同依賴關(guān)系要采取不同的任務(wù)調(diào)度機制和容錯恢復(fù)機制。8.4.2Spark生態(tài)系統(tǒng)RDD中的所有轉(zhuǎn)換都是延遲加載的,也就是說,它們并不會直接計算結(jié)果。相反的,它們只是記住這些應(yīng)用到基礎(chǔ)數(shù)據(jù)集(例如一個文件)上的轉(zhuǎn)換動作。只有當發(fā)生一個要求返回結(jié)果給Driver的動作時,這些轉(zhuǎn)換才會真正運行。這種設(shè)計讓Spark更加有效率地運行。8.4.2Spark生態(tài)系統(tǒng)RDD的一些常用Transformation如下:map(func):返回一個新的RDD,該RDD由每一個輸入元素經(jīng)過func函數(shù)轉(zhuǎn)換后組成filter(func):返回一個新的RDD,該RDD由經(jīng)過func函數(shù)計算后返回值為true的輸入元素組成flatMap(func):類似于map,但是每一個輸入元素可以被映射為0或多個輸出元素(所以func應(yīng)該返回一個序列,而不是單一元素)mapPartitions(func):類似于map,但獨立地在RDD的每一個分片上運行,因此在類型為T的RDD上運行時,func的函數(shù)類型必須是Iterator[T]=>Iterator[U]mapPartitionsWithIndex(func):類似于mapPartitions,但func帶有一個整數(shù)參數(shù)表示分片的索引值,因此在類型為T的RDD上運行時,func的函數(shù)類型必須是(Int,Interator[T])=>Iterator[U]sample(withReplacement,fraction,seed):根據(jù)fraction指定的比例對數(shù)據(jù)進行采樣,可以選擇是否使用隨機數(shù)進行替換,seed用于指定隨機數(shù)生成器種子8.4.2Spark生態(tài)系統(tǒng)union(otherDataset):對源RDD和參數(shù)RDD求并集后返回一個新的RDDintersection(otherDataset):對源RDD和參數(shù)RDD求交集后返回一個新的RDDdistinct([numTasks])):對源RDD進行去重后返回一個新的RDDgroupByKey([numTasks]):在一個(K,V)的RDD上調(diào)用,返回一個(K,Iterator[V])的RDDreduceByKey(func,[numTasks]):在一個(K,V)的RDD上調(diào)用,返回一個(K,V)的RDD,使用指定的reduce函數(shù),將相同key的值聚合到一起,與groupByKey類似,reduce任務(wù)的個數(shù)可以通過第二個可選的參數(shù)來設(shè)置aggregateByKey(zeroValue)(seqOp,combOp,[numTasks])sortByKey([ascending],[numTasks]):在一個(K,V)的RDD上調(diào)用,K必須實現(xiàn)Ordered接口,返回一個按照key進行排序的(K,V)的RDDsortBy(func,[ascending],[numTasks]):與sortByKey類似,但是更靈活join(otherDataset,[numTasks]):在類型為(K,V)和(K,W)的RDD上調(diào)用,返回一個相同key對應(yīng)的所有元素對在一起的(K,(V,W))的RDDcogroup(otherDataset,[numTasks]):在類型為(K,V)和(K,W)的RDD上調(diào)用,返回一個(K,(Iterable<V>,Iterable<W>))類型的RDDcartesian(otherDataset):笛卡爾積8.4.2Spark生態(tài)系統(tǒng)Action算子會觸發(fā)Spark提交作業(yè)(Job),并將數(shù)據(jù)輸出到Spark系統(tǒng)。RDD的一些常用action如下:reduce(func):通過func函數(shù)聚集RDD中的所有元素,這個功能必須是課交換且可并聯(lián)的collect():在驅(qū)動程序中,以數(shù)組的形式返回數(shù)據(jù)集的所有元素count():返回RDD的元素個數(shù)first():返回RDD的第一個元素(類似于take(1))take(n):返回一個由數(shù)據(jù)集的前n個元素組成的數(shù)組takeSample(withReplacement,num,[seed]):返回一個數(shù)組,該數(shù)組由從數(shù)據(jù)集中隨機采樣的num個元素組成,可以選擇是否用隨機數(shù)替換不足的部分,seed用于指定隨機數(shù)生成器種子takeOrdered(n,
[ordering])8.4.2Spark生態(tài)系統(tǒng)saveAsTextFile(path):將數(shù)據(jù)集的元素以textfile的形式保存到HDFS文件系統(tǒng)或者其他支持的文件系統(tǒng),對于每個元素,Spark將會調(diào)用toString方法,將它裝換為文件中的文本saveAsSequenceFile(path)
:將數(shù)據(jù)集中的元素以Hadoopsequencefile的格式保存到指定的目錄下,可以使HDFS或者其他Hadoop支持的文件系統(tǒng)。saveAsObjectFile(path)
countByKey():針對(K,V)類型的RDD,返回一個(K,Int)的map,表示每一個key對應(yīng)的元素個數(shù)。foreach(func):在數(shù)據(jù)集的每一個元素上,運行函數(shù)func進行更新。8.4.2Spark生態(tài)系統(tǒng)(2)SparkSQLSparkSQL是用于結(jié)構(gòu)化數(shù)據(jù)處理的Spark模塊。與基本的SparkRDDAPI不同,SparkSQL提供的接口為Spark提供了關(guān)于數(shù)據(jù)結(jié)構(gòu)和正在執(zhí)行的計算的更多信息。在內(nèi)部,SparkSQL使用這些額外的信息來執(zhí)行額外的優(yōu)化。有幾種與SparkSQL進行交互的方式,包括SQL和DatasetAPI。在計算結(jié)果時,使用相同的執(zhí)行引擎,而不管使用哪種API/語言表示計算。這種統(tǒng)一意味著開發(fā)人員可以輕松地在不同的API之間來回切換,基于這些API提供了表達給定轉(zhuǎn)換的最自然的方式。SparkSQL的一個用途是執(zhí)行SQL查詢。SparkSQL也可以用來從現(xiàn)有的Hive安裝中讀取數(shù)據(jù)。用另一種編程語言中運行SQL時,結(jié)果將作為數(shù)據(jù)集/數(shù)據(jù)框返回。您還可以使用命令行
或通過JDBC/ODBC與SQL接口進行交互。8.4.2Spark生態(tài)系統(tǒng)DataFrame:與RDD類似,DataFrame也是一個分布式數(shù)據(jù)容器。然而DataFrame更像傳統(tǒng)數(shù)據(jù)庫的二維表格,除了數(shù)據(jù)以外,還記錄數(shù)據(jù)的結(jié)構(gòu)信息,即schema。同時,與Hive類似,DataFrame也支持嵌套數(shù)據(jù)類型(struct、array和map)。從API易用性的角度上看,DataFrameAPI提供的是一套高層的關(guān)系操作,比函數(shù)式的RDDAPI要更加友好,門檻更低。由于與R和Pandas的DataFrame類似,SparkDataFrame很好地繼承了傳統(tǒng)單機數(shù)據(jù)分析的開發(fā)體驗。8.4.2Spark生態(tài)系統(tǒng)DataFrame與RDD的主要區(qū)別在于,前者帶有schema元信息,即DataFrame所表示的二維表數(shù)據(jù)集的每一列都帶有名稱和類型。這使得SparkSQL得以洞察更多的結(jié)構(gòu)信息,從而對藏于DataFrame背后的數(shù)據(jù)源以及作用于DataFrame之上的變換進行了針對性的優(yōu)化,最終達到大幅提升運行時效率的目標。反觀RDD,由于無從得知所存數(shù)據(jù)元素的具體內(nèi)部結(jié)構(gòu),SparkCore只能在stage層面進行簡單、通用的流水線優(yōu)化。RDD和DataFrame的比較如圖8-6所示。8.4.2Spark生態(tài)系統(tǒng)8.4.2Spark生態(tài)系統(tǒng)(3)SparkStreamingSparkStreaming是SparkAPI核心的擴展,支持可擴展,高吞吐量,實時數(shù)據(jù)流的容錯流處理。數(shù)據(jù)可以從像卡夫卡,flume,或TCP傳輸許多來源輸入,并且可以使用高級別功能表達復(fù)雜的算法來處理map,reduce,join和window。最后,處理的數(shù)據(jù)可以推送到文件系統(tǒng),數(shù)據(jù)庫和數(shù)據(jù)可視化。事實上,您可以將Spark的
機器學(xué)習(xí)和
圖形處理算法應(yīng)用于數(shù)據(jù)流。SparkStreaming提供了一個高層次的抽象,稱為離散流或DStream,它代表了連續(xù)的數(shù)據(jù)流。DStream可以通過Kafka,F(xiàn)lume和Kinesis等來源的輸入數(shù)據(jù)流創(chuàng)建,也可以通過在其他DStream上應(yīng)用高級操作來創(chuàng)建。在內(nèi)部,一個DStream被表示為一系列
RDDSparkstreaming數(shù)據(jù)處理如圖8-7所示。8.4.2Spark生態(tài)系統(tǒng)8.4.2Spark生態(tài)系統(tǒng)DiscretizedStream:DiscretizedStream是SparkStreaming的基礎(chǔ)抽象,代表持續(xù)性的數(shù)據(jù)流和經(jīng)過各種Spark原語操作后的結(jié)果數(shù)據(jù)流。在內(nèi)部實現(xiàn)上,DStream是一系列連續(xù)的RDD來表示。每個RDD含有一段時間間隔內(nèi)的數(shù)據(jù)。DStream上的原語與RDD的類似,分為Transformations(轉(zhuǎn)換)和OutputOperations(輸出)兩種,此外轉(zhuǎn)換操作中還有一些比較特殊的原語,如:updateStateByKey()、transform()以及各種Window相關(guān)的原語。8.4.2Spark生態(tài)系統(tǒng)常見的轉(zhuǎn)換和含義如下:map(func):通過傳遞函數(shù)func的源DStream的每個元素來返回一個新的DStream
。flatMap(func):類似于地圖,但是每個輸入項目可以被映射到0個或更多的輸出項目。filter(func):通過僅選擇func返回true
的源DStream的記錄來返回一個新的DStream
。repartition(numPartitions):通過創(chuàng)建更多或更少的分區(qū)來更改此DStream中的并行性級別。union(otherStream):返回一個新的DStream,其中包含源DStream和otherDStream中元素的聯(lián)合
。count():通過計算源DStream的每個RDD中元素的數(shù)量,返回一個新的單元素RDD的DStream。8.4.2Spark生態(tài)系統(tǒng)reduce(func):通過使用函數(shù)func(它帶有兩個參數(shù)并返回一個)來聚合源DStream的每個RDD中的元素,從而返回一個新的單元素RDD的DStream
。函數(shù)應(yīng)該是關(guān)聯(lián)和可交換的,以便可以并行計算。countByValue():當在類型為K的元素的DStream上調(diào)用時,返回一個新的(K,Long)對的DStream,其中每個鍵的值是其在源DStream的每個RDD中的頻率。reduceByKey(func,[numTasks]) :在(K,V)對的DStream上調(diào)用時,返回一個新的(K,V)對的DStream,其中每個鍵的值使用給定的reduce函數(shù)進行聚合。注意:默認情況下,它使用Spark的默認并行任務(wù)數(shù)(2表示本地模式,而在集群模式下,數(shù)字由config屬性決定spark.default.parallelism)來執(zhí)行分組。您可以傳遞可選numTasks參數(shù)來設(shè)置不同數(shù)量的任務(wù)。8.4.2Spark生態(tài)系統(tǒng)join(otherStream,[numTasks]):當(K,V)和(K,W)對的兩個DS流被調(diào)用時,返回一個新的(K,(V,W))對的DStream對,每個鍵對的所有元素對。cogroup(otherStream,[numTasks]):當(K,V)和(K,W)對的DStream被調(diào)用時,返回一個新的(K,Seq[V],Seq[W])元組DStream。transform(func):通過將RDD-RDD函數(shù)應(yīng)用于源DStream的每個RDD來返回一個新的DStream。這可以用來在DStream上執(zhí)行任意的RDD操作。updateStateByKey(func):返回一個新的“狀態(tài)”DStream,其中通過對鍵的先前狀態(tài)和鍵的新值應(yīng)用給定函數(shù)來更新每個鍵的狀態(tài)。這可以用來維護每個鍵的任意狀態(tài)數(shù)據(jù)。8.4.2Spark生態(tài)系統(tǒng)DStream輸出操作允許將DStream的數(shù)據(jù)推送到外部系統(tǒng),如數(shù)據(jù)庫或文件系統(tǒng)。由于輸出操作實際上允許外部系統(tǒng)使用轉(zhuǎn)換的數(shù)據(jù),因此它們會觸發(fā)所有DStream轉(zhuǎn)換的實際執(zhí)行(類似于RDD的操作)。目前,定義了以下輸出操作:print():在運行流應(yīng)用程序的驅(qū)動程序節(jié)點上的DStream中打印每批數(shù)據(jù)的前十個元素。這對開發(fā)和調(diào)試很有用。
saveAsTextFiles(prefix,[suffix]):將此DStream的內(nèi)容保存為文本文件。saveAsObjectFiles(prefix,[suffix]):將此DStream的內(nèi)容保存為SequenceFiles序列化的Java對象
saveAsHadoopFiles(prefix,[suffix]):將此DStream的內(nèi)容保存為Hadoop文件。8.
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權(quán)】 ISO 17956:2025 EN Rolling bearings - Method for calculating the effective static safety factor for universally loaded rolling bearings
- 醫(yī)學(xué)合作研究協(xié)議書5篇
- 牛頭包船課程設(shè)計
- 海報插圖課程設(shè)計
- 十四五大數(shù)據(jù)產(chǎn)業(yè)發(fā)展規(guī)劃
- 2024有關(guān)消防演練活動總結(jié)(34篇)
- 美術(shù)微課程設(shè)計與制作
- 幼兒園美食實踐課程設(shè)計
- 康復(fù)科護士的工作體會
- 有趣的音樂游戲課程設(shè)計
- 舞蹈興趣小組活動記錄
- 醫(yī)院檢驗科實驗室生物安全程序文件SOP
- 建立強大的人際影響力與領(lǐng)導(dǎo)力
- 九年級歷史期末考試質(zhì)量分析
- 視覺傳達設(shè)計教資面試
- 三創(chuàng)賽獲獎-非遺文化創(chuàng)新創(chuàng)業(yè)計劃書
- 華師大版八年級下冊數(shù)學(xué)全冊課件
- 慢性高血壓并發(fā)重度子癇前期1
- 常用工具的正確使用
- 管材管件供貨計劃、運輸方案及保障措施及售后服務(wù)
- (2024年)腸梗阻完整版課件
評論
0/150
提交評論