版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
本項(xiàng)目學(xué)習(xí)內(nèi)容包括:1.大數(shù)據(jù)計(jì)算和傳統(tǒng)數(shù)據(jù)計(jì)算區(qū)別2.常見(jiàn)的大數(shù)據(jù)計(jì)算框架3.NoSQL數(shù)據(jù)庫(kù)4.在Hadoop環(huán)境上安裝Spark和HBase5.利用Spark進(jìn)行房屋信息進(jìn)行計(jì)算處理,并存儲(chǔ)在HBase數(shù)據(jù)庫(kù)本項(xiàng)目學(xué)習(xí)主要內(nèi)容本項(xiàng)目思維導(dǎo)圖
數(shù)據(jù)計(jì)算是對(duì)數(shù)據(jù)依某種模式而建立起來(lái)的關(guān)系進(jìn)行處理的過(guò)程,常見(jiàn)的“加減乘除”就是數(shù)據(jù)計(jì)算。在大數(shù)據(jù)還未出現(xiàn)的時(shí)候,傳統(tǒng)數(shù)據(jù)計(jì)算的核心思想是數(shù)據(jù)的集中式計(jì)算。在集中式計(jì)算中,所有的數(shù)據(jù)計(jì)算過(guò)程都由一個(gè)大型中央計(jì)算系統(tǒng)或一臺(tái)高性能服務(wù)器完成,需要參與計(jì)算的數(shù)據(jù)全部由大型中央計(jì)算系統(tǒng)(服務(wù)器)中的數(shù)據(jù)庫(kù)進(jìn)行存儲(chǔ)。如果有數(shù)據(jù)計(jì)算需求,各I/O終端需要統(tǒng)一發(fā)送請(qǐng)求給大型中央計(jì)算系統(tǒng)(服務(wù)器)。由大型中央計(jì)算系統(tǒng)(服務(wù)器)進(jìn)行統(tǒng)一計(jì)算后得出結(jié)果,又通過(guò)網(wǎng)絡(luò)傳輸給各個(gè)I/O終端。集中式計(jì)算的典型案例就是網(wǎng)絡(luò)文件系統(tǒng)(NFS)和Web系統(tǒng)。任務(wù)5-1初識(shí)大數(shù)據(jù)計(jì)算框架5.1.1大數(shù)據(jù)計(jì)算和傳統(tǒng)數(shù)據(jù)計(jì)算區(qū)別
在數(shù)據(jù)量不大的情況下,集中式計(jì)算模式完全可以滿(mǎn)足需求。但是隨著數(shù)據(jù)量的逐漸增大,我們需要通過(guò)縱向擴(kuò)展方式不斷增加大型中央計(jì)算系統(tǒng)(服務(wù)器)的處理器數(shù)量、內(nèi)存容量、磁盤(pán)容量等來(lái)增強(qiáng)單個(gè)服務(wù)器的計(jì)算能力,從而保證數(shù)據(jù)計(jì)算的速度。即使這樣做,也仍然存在以下三個(gè)問(wèn)題。
(1)隨著數(shù)據(jù)量的逐漸增大,數(shù)據(jù)的網(wǎng)絡(luò)傳輸時(shí)間大大增加,嚴(yán)重影響計(jì)算效率。(2)隨著數(shù)據(jù)量的逐漸增大,我們采用縱向擴(kuò)展方式來(lái)提高計(jì)算性能終究會(huì)遇到瓶頸。(3)如果服務(wù)器故障停機(jī)或者斷電,那么整個(gè)計(jì)算過(guò)程無(wú)法繼續(xù)執(zhí)行下去,整個(gè)計(jì)算系統(tǒng)的將癱瘓,不再具有可用性。
如何解決?任務(wù)5-1初識(shí)大數(shù)據(jù)計(jì)算框架
很顯然,在大數(shù)據(jù)時(shí)代,縱向擴(kuò)展的方式只能解燃眉之急,并不能從根本上解決問(wèn)題。即然縱向擴(kuò)展不行,那么我們就換一條路,有人就設(shè)想利用橫向擴(kuò)展方式來(lái)提高計(jì)算性能,即我們可以向服務(wù)端添加另一個(gè)計(jì)算節(jié)點(diǎn)(另一臺(tái)服務(wù)器),當(dāng)計(jì)算數(shù)據(jù)量比較大時(shí),我們可以把大的計(jì)算任務(wù)切分成小任務(wù),分給兩臺(tái)服務(wù)器協(xié)同完成,然后再匯總計(jì)算結(jié)果。任務(wù)5-1初識(shí)大數(shù)據(jù)計(jì)算框架
這種計(jì)算方式稱(chēng)之為分布式計(jì)算。分布式計(jì)算是由多個(gè)服務(wù)器組成一個(gè)計(jì)算集群來(lái)共同執(zhí)行計(jì)算任務(wù)。盡管單個(gè)服務(wù)器的運(yùn)算能力還是有限,但是將成百上千的服務(wù)器組成服務(wù)器集群后,整個(gè)系統(tǒng)計(jì)算性能大幅度提升,同時(shí)集群還具備強(qiáng)大的橫向擴(kuò)展功能,隨著數(shù)據(jù)量的增大,還可以不斷往集群中新增服務(wù)器。分布式計(jì)算的關(guān)鍵問(wèn)題就在于如何進(jìn)行任務(wù)分解,同時(shí)協(xié)調(diào)各個(gè)計(jì)算節(jié)點(diǎn)的資源分配和任務(wù)分配。
這就需要一個(gè)“管家”。這個(gè)“管家”可以是集群中的某一臺(tái)機(jī)器來(lái)做,也可以是集群中所有的機(jī)器共同來(lái)做。如果是某一臺(tái)機(jī)器來(lái)做,那么這個(gè)集群的架構(gòu)稱(chēng)之為主從架構(gòu)。主從架構(gòu)集群中只有1臺(tái)機(jī)器總管整個(gè)集群,其他機(jī)器屬于從屬地位。如果是集群中所有機(jī)器來(lái)做,這個(gè)集群稱(chēng)之為P2P架構(gòu)。P2P架構(gòu)集群中,各個(gè)機(jī)器地位同等,沒(méi)有主從之分。任務(wù)5-1初識(shí)大數(shù)據(jù)計(jì)算框架“管家”機(jī)器在分配計(jì)算任務(wù)時(shí)并不是隨機(jī)分配的,而是根據(jù)“數(shù)據(jù)向計(jì)算靠攏”的原則進(jìn)行任務(wù)分配,即哪臺(tái)機(jī)器存儲(chǔ)了計(jì)算任務(wù)所需要的數(shù)據(jù),那么這個(gè)計(jì)算任務(wù)就分配給對(duì)應(yīng)的那臺(tái)機(jī)器。分布式計(jì)算在理論上能夠滿(mǎn)足大數(shù)據(jù)計(jì)算需求,但是技術(shù)實(shí)現(xiàn)比較困難。因此,在2003年之前,分布式計(jì)算發(fā)展非常緩慢,大多數(shù)企業(yè)仍然采用縱向方式擴(kuò)容計(jì)算服務(wù)器,數(shù)據(jù)計(jì)算模式多為集中式計(jì)算。對(duì)于企業(yè)來(lái)說(shuō),集中式計(jì)算對(duì)單個(gè)服務(wù)器性能要求較高,服務(wù)器價(jià)格非常昂貴,大大增加了企業(yè)的購(gòu)買(mǎi)成本。
在2003—2006年間,互聯(lián)網(wǎng)巨頭Google公司相繼發(fā)表了GFS(GoogleFileSystem)、MapReduce和BigTable三篇技術(shù)論文,提出了一套全新的分布式計(jì)算模型。其中,GFS是谷歌分布式文件系統(tǒng),MapReduce是谷歌分布式計(jì)算框架,BigTable是構(gòu)建在GFS之上的數(shù)據(jù)存儲(chǔ)系統(tǒng)。這三大組件共同構(gòu)成了Google的分布式計(jì)算模型。任務(wù)5-1初識(shí)大數(shù)據(jù)計(jì)算框架Google的分布式計(jì)算模型大幅度簡(jiǎn)化了傳統(tǒng)的分布式計(jì)算理論,降低了分布式計(jì)算技術(shù)實(shí)現(xiàn)難度,使分布式計(jì)算從理論進(jìn)入實(shí)際運(yùn)用階段成為可能。在Google的分布式計(jì)算模型中,分布式計(jì)算節(jié)點(diǎn)可以選用廉價(jià)服務(wù)器甚至普通的PC機(jī)。如果需要提升集群的計(jì)算性能,只需增加廉價(jià)服務(wù)器的數(shù)量,這樣整個(gè)計(jì)算集群構(gòu)建的成本將會(huì)十分低廉。隨后,谷歌在其計(jì)算中心成功搭建了一個(gè)分布式計(jì)算集群,并取得了良好的數(shù)據(jù)計(jì)算效果。至此,各互聯(lián)網(wǎng)公司也開(kāi)始利用Google的分布式計(jì)算模型搭建屬于自己的分布式計(jì)算系統(tǒng)。分布式計(jì)算模式風(fēng)靡世界。目前,在Google、阿里巴巴等大型互聯(lián)網(wǎng)企業(yè)的計(jì)算中心里,分布式計(jì)算集群服務(wù)器數(shù)量已經(jīng)達(dá)到了上千臺(tái)之多,完全能夠滿(mǎn)足日常海量數(shù)據(jù)的計(jì)算負(fù)荷。任務(wù)5-1初識(shí)大數(shù)據(jù)計(jì)算框架
通過(guò)項(xiàng)目二的表2-2的學(xué)習(xí),我們知道大數(shù)據(jù)有4種計(jì)算模式,離線(xiàn)批處理,實(shí)時(shí)流計(jì)算,交互查詢(xún)分析和圖計(jì)算。其實(shí),根據(jù)計(jì)算數(shù)據(jù)是否實(shí)時(shí)又可以把計(jì)算模式總的分為兩類(lèi),一類(lèi)為批量計(jì)算包含離線(xiàn)計(jì)算、交互查詢(xún)分析和圖計(jì)算。另一類(lèi)為流計(jì)算。任務(wù)5-1初識(shí)大數(shù)據(jù)計(jì)算框架5.1.2常見(jiàn)的大數(shù)據(jù)計(jì)算框架簡(jiǎn)介
下面我們選取一些具有代表性的大數(shù)據(jù)計(jì)算框架來(lái)介紹。1.批量計(jì)算1)MapReduceMapReduce是最早的大數(shù)據(jù)計(jì)算框架,是Hadoop大數(shù)據(jù)處理平臺(tái)的兩大核心組件之一。其原型是谷歌分布式計(jì)算模型中的MapReduce計(jì)算框架。MapReduce計(jì)算框架只有2個(gè)操作Map和Reduce,在一定程度上限制了MapReduce的表達(dá)能力。當(dāng)然我們可以通過(guò)多個(gè)MapReduce的組合,表達(dá)復(fù)雜的計(jì)算問(wèn)題,但實(shí)現(xiàn)過(guò)程太過(guò)復(fù)雜。MapReduce采用Java語(yǔ)言編程,編寫(xiě)一個(gè)MapReduce應(yīng)用程序需要實(shí)現(xiàn)3個(gè)Java類(lèi)(Map類(lèi)、Reduce類(lèi)和驅(qū)動(dòng)程序類(lèi))。MapReduce一般適用于離線(xiàn)大批量數(shù)據(jù)計(jì)算,實(shí)時(shí)性不高,比如歷史數(shù)據(jù)的分析、日志分析等。MapReduce的計(jì)算過(guò)程是把大批量的數(shù)據(jù)按照某種特征進(jìn)行分片,然后對(duì)各個(gè)分片進(jìn)行并行計(jì)算,最后按照該特征合并各并行計(jì)算的結(jié)果,得到最終結(jié)果。MapReduce的架構(gòu)在項(xiàng)目二已經(jīng)介紹過(guò)了,下面我們結(jié)合詞頻統(tǒng)計(jì)的案例,介紹MapReduce數(shù)據(jù)計(jì)算過(guò)程。任務(wù)5-1初識(shí)大數(shù)據(jù)計(jì)算框架
假設(shè)我要統(tǒng)計(jì)集群中的HDFS某目下所有文件中各個(gè)單詞出現(xiàn)的頻率。任務(wù)5-1初識(shí)大數(shù)據(jù)計(jì)算框架MapReduce的計(jì)算過(guò)程主要分為6個(gè)階段,分別是輸入數(shù)據(jù)、分片、Mapping、Shuffling、Reducing和輸出計(jì)算結(jié)果。下面簡(jiǎn)單介紹一下各個(gè)階段所執(zhí)行的任務(wù)。
(1)輸入數(shù)據(jù)階段所執(zhí)行的任務(wù)是程序從HDFS分布式文件系統(tǒng)上的某個(gè)目錄讀取數(shù)據(jù)。一般情況下,HDFS目錄里面的文件被分割成很多小文件存儲(chǔ)在集群的不同機(jī)器上。讀取數(shù)據(jù)文件采用就近原則,每個(gè)機(jī)器只讀取自己存儲(chǔ)的那一部分?jǐn)?shù)據(jù),數(shù)據(jù)讀取不涉及跨節(jié)點(diǎn)的數(shù)據(jù)復(fù)制。
(2)分片階段所執(zhí)行的任務(wù)是程序按照一定的標(biāo)準(zhǔn)對(duì)數(shù)據(jù)分片,每個(gè)分片對(duì)應(yīng)一個(gè)Map任務(wù)。例如圖5-3的數(shù)據(jù)經(jīng)過(guò)數(shù)據(jù)分片后形成3個(gè)數(shù)據(jù)片,每個(gè)數(shù)據(jù)片會(huì)啟動(dòng)一個(gè)Map任務(wù)進(jìn)行后續(xù)處理。
(3)Mapping階段所執(zhí)行的任務(wù)是對(duì)分片后的單詞執(zhí)行Map操作,把分片后單詞轉(zhuǎn)換成鍵值對(duì)的形式輸出。任務(wù)5-1初識(shí)大數(shù)據(jù)計(jì)算框架
(4)Shuffling階段所執(zhí)行的任務(wù)是對(duì)Map任務(wù)輸出的鍵值對(duì)進(jìn)行Shuffle操作,把相同鍵名的鍵值對(duì)分為一組。
(5)Reducing階段所執(zhí)行的任務(wù)是當(dāng)集群所有節(jié)點(diǎn)都執(zhí)行完Shuffle操作后,對(duì)每個(gè)分組數(shù)據(jù)啟動(dòng)一個(gè)Reduce操作。把同一個(gè)分組中鍵名相同的數(shù)據(jù)合并為列表,并對(duì)每個(gè)列表的值進(jìn)行相加。
(6)輸出最終計(jì)算結(jié)果。MapReduce主要用來(lái)解決實(shí)時(shí)性要求不高的大批量數(shù)據(jù)集的數(shù)據(jù)計(jì)算問(wèn)題,多用于對(duì)海量歷史數(shù)據(jù)的分析。但是,目前MapReduce已經(jīng)慢慢的退出我們的視野,被其他更快速、方便的大數(shù)據(jù)計(jì)算框架取代。這是為什么呢?因?yàn)镸apReduce數(shù)據(jù)計(jì)算延遲高。MapReduce數(shù)據(jù)計(jì)算延遲高有兩方面的問(wèn)題。任務(wù)5-1初識(shí)大數(shù)據(jù)計(jì)算框架
問(wèn)題1:MapReduce計(jì)算過(guò)程存在木桶效應(yīng),每個(gè)階段都需要所有的計(jì)算機(jī)同步,影響了執(zhí)行效率。比如啟動(dòng)Reduce任務(wù)時(shí),需要集群中所有的計(jì)算機(jī)都執(zhí)行完畢Shuffle階段,這樣如果集群有一臺(tái)計(jì)算機(jī)性能較差,則拖慢整個(gè)集群的計(jì)算過(guò)程,造成高延遲。
問(wèn)題2:MapReduce每次數(shù)據(jù)處理的中間結(jié)果都要使用磁盤(pán)存儲(chǔ),下一次數(shù)據(jù)處理又要從磁盤(pán)讀取,整個(gè)數(shù)據(jù)計(jì)算過(guò)程涉及到大量的I/O磁盤(pán)讀寫(xiě)操作。尤其在解決機(jī)器學(xué)習(xí)相關(guān)問(wèn)題,需要迭代計(jì)算,這樣高頻次的I/O磁盤(pán)讀寫(xiě)嚴(yán)重影響程序執(zhí)行效率。任務(wù)5-1初識(shí)大數(shù)據(jù)計(jì)算框架
2)Tez
為克服MapReduce上述問(wèn)題,有人提出了有向無(wú)環(huán)圖(DAG)計(jì)算模型,核心思想是基于MapReduce計(jì)算框架,將Map和Reduce兩個(gè)操作進(jìn)一步拆分,分解后的子操作可以任意靈活組合,產(chǎn)生新的操作,這些操作經(jīng)過(guò)一些控制程序組裝后,可形成一個(gè)大的DAG作業(yè)。這樣能夠大幅度提升數(shù)據(jù)計(jì)算速度。ApacheTez就是最早出現(xiàn)的DAG模型之一。
DAG預(yù)先給程序設(shè)定了一個(gè)執(zhí)行流程指示圖,形成管道化作業(yè)。程序不需要每步執(zhí)行完耗時(shí)等待下步如何執(zhí)行。舉個(gè)列子假設(shè)我們要到超市去買(mǎi)菜,我不知道超市在哪里,如果用類(lèi)似MapReduce的計(jì)算模式解決,我們需要等待問(wèn)路—>走一段—>繼續(xù)等待問(wèn)路—>再走一段—>經(jīng)過(guò)多次等待問(wèn)路后最終可以到達(dá)超市。中間過(guò)程充滿(mǎn)了等待時(shí)間,速度肯定慢。如果用類(lèi)似DAG的計(jì)算模式解決,我們?cè)谌コ械拈_(kāi)始就有人給我們繪制了一張地圖,告訴你怎么走,你可以按照地圖指示一步步走到超市,而中間過(guò)程不必有等待時(shí)間去問(wèn)路,這樣速度肯定快。任務(wù)5-1初識(shí)大數(shù)據(jù)計(jì)算框架Tez把Map和Reduce進(jìn)一步拆分為很多子操作,這樣可以表達(dá)所有復(fù)雜的Map和Reduce操作。一個(gè)Tez任務(wù)的執(zhí)行由輸入、執(zhí)行、輸出三個(gè)階段組成。任務(wù)5-1初識(shí)大數(shù)據(jù)計(jì)算框架
下圖為MapReduce和Tez執(zhí)行流程對(duì)比,從圖中可以看出,Tez在數(shù)據(jù)計(jì)算時(shí)可以將多個(gè)有依賴(lài)的任務(wù)轉(zhuǎn)換為一個(gè)任務(wù),從而提升數(shù)據(jù)計(jì)算性能。
Tez利用DAG機(jī)制解決了MapReduce的計(jì)算延遲高的第一個(gè)問(wèn)題,增強(qiáng)了數(shù)據(jù)計(jì)算任務(wù)執(zhí)行流程的銜接性,大幅度提升了數(shù)據(jù)計(jì)算的速度。但是對(duì)于問(wèn)題2仍然沒(méi)有解決方案,所以大數(shù)據(jù)計(jì)算速度仍具有進(jìn)一步提升的空間。任務(wù)5-1初識(shí)大數(shù)據(jù)計(jì)算框架
3)SparkSpark由加州大學(xué)伯克利分校AMP實(shí)驗(yàn)室開(kāi)發(fā)。Spark借鑒了DAG的機(jī)制同時(shí)又提出了基于內(nèi)存的分布式存儲(chǔ)抽象模型RDD(ResilientDistributedDatasets,可恢復(fù)分布式數(shù)據(jù)集),把中間數(shù)據(jù)有選擇地加載并保存到內(nèi)存中,只有內(nèi)存放不下時(shí)數(shù)據(jù)才寫(xiě)入磁盤(pán),極大的提高了計(jì)算性能,特別是在迭代計(jì)算的場(chǎng)合,這種計(jì)算模式減少大量的磁盤(pán)IO開(kāi)銷(xiāo)。Spark完美解決了MapReduce的延遲高的第二個(gè)問(wèn)題。使用Spark進(jìn)行數(shù)據(jù)計(jì)算時(shí),一般只需要進(jìn)行2次磁盤(pán)I/O讀寫(xiě),即在計(jì)算開(kāi)始階段從磁盤(pán)讀取數(shù)據(jù),在計(jì)算全部結(jié)束后把結(jié)果寫(xiě)入磁盤(pán)。這種計(jì)算模式非常適用于迭代計(jì)算和數(shù)據(jù)挖掘。在迭代計(jì)算中,Spark和MapReduce計(jì)算過(guò)程對(duì)比如下圖所示。與MapReduce相比,Spark的運(yùn)算效率要快100倍以上。任務(wù)5-1初識(shí)大數(shù)據(jù)計(jì)算框架任務(wù)5-1初識(shí)大數(shù)據(jù)計(jì)算框架
基于Spark批處理功能,Spark演化出一系列的組件,滿(mǎn)足不同大數(shù)據(jù)計(jì)算應(yīng)用場(chǎng)景需求,這些組件共同構(gòu)成了Spark生態(tài)系統(tǒng)。例如,專(zhuān)門(mén)用來(lái)做流計(jì)算的組件SparkStreaming,用來(lái)做交互查詢(xún)分析的組件SparkSQL,用來(lái)做圖計(jì)算的組件GraphX,用來(lái)做機(jī)器學(xué)習(xí)的組件MLLIB等。Spark的宗旨就是“一個(gè)軟件棧滿(mǎn)足所有應(yīng)用場(chǎng)景”。Spark可以搭建在Hadoop平臺(tái)之上,完美兼容Hadoop生態(tài)系統(tǒng)組件,比如HBase、Hive、HDFS、Yarn、Zookeeper等。目前,Spark已經(jīng)成為第三代大數(shù)據(jù)計(jì)算框架的代表技術(shù)。任務(wù)5-1初識(shí)大數(shù)據(jù)計(jì)算框架Spark整個(gè)架構(gòu)包括集群資源管理器(ClusterManager)、運(yùn)行作業(yè)任務(wù)的工作節(jié)點(diǎn)(WorkerNode)、每個(gè)應(yīng)用的任務(wù)控制節(jié)點(diǎn)(Driver)和每個(gè)工作節(jié)點(diǎn)上負(fù)責(zé)具體任務(wù)的執(zhí)行進(jìn)程(Executor)。任務(wù)5-1初識(shí)大數(shù)據(jù)計(jì)算框架
Spark運(yùn)行流程如下。
(1)從客戶(hù)端提交任務(wù),創(chuàng)建SparkContext對(duì)象。
(2)SparkContext向資源管理器(ClusterManager)申請(qǐng)運(yùn)行Executor資源,資源管理器選定工作節(jié)點(diǎn)(WorkerNode)并分配資源,啟動(dòng)Executor進(jìn)程。
(3)Executor進(jìn)程向SparkContext申請(qǐng)任務(wù)(Task)。
(4)SparkContext將應(yīng)用程序分發(fā)給Executor.
(5)SparkContext構(gòu)建DAG圖,將大的任務(wù)分解成多個(gè)小任務(wù),通過(guò)任務(wù)解析器發(fā)送給Executor運(yùn)行具體任務(wù)。
(6)所有Executor運(yùn)行完任務(wù)后,把結(jié)果統(tǒng)一匯總給SparkContext,客戶(hù)端得到計(jì)算結(jié)果。任務(wù)5-1初識(shí)大數(shù)據(jù)計(jì)算框架
Spark是基于Scala編程語(yǔ)言實(shí)現(xiàn)的,同時(shí)也支持Python、Java、R等編程語(yǔ)言來(lái)開(kāi)發(fā)。Spark語(yǔ)法簡(jiǎn)潔,代碼實(shí)現(xiàn)簡(jiǎn)單,比MapReduce代碼量減少了很多,因?yàn)镾park為RDD提供了豐富的操作方法,其中不僅包括了map和reduce方法,還有filter、flatMap、groupByKey、reduceByKey、union、join、mapValues、sort、partionBy等用于數(shù)據(jù)轉(zhuǎn)換的操作和count、collect、reduce、lookup、save等用于收集或輸出計(jì)算結(jié)果的操作。如果用Spark實(shí)現(xiàn)上述詞頻統(tǒng)計(jì)案例,則只需要調(diào)用Spark的map和reduceByKey兩個(gè)轉(zhuǎn)換操作就可以得到最終結(jié)果,首先通過(guò)map操作把原始數(shù)據(jù)轉(zhuǎn)換成鍵值對(duì)形式,然后通過(guò)reduceByKey操作對(duì)所有鍵值對(duì)按鍵進(jìn)行相加操作,代碼量非常少。Spark實(shí)現(xiàn)詞頻統(tǒng)計(jì)案例的計(jì)算過(guò)程如下圖。任務(wù)5-1初識(shí)大數(shù)據(jù)計(jì)算框架Spark中的RDD是一個(gè)高度受限的內(nèi)存共享模型,是只讀的,只能創(chuàng)建,不能修改。Spark的容錯(cuò)性能比MapReduce更好。Spark采用記錄日志方式來(lái)進(jìn)行容錯(cuò)控制,RDD之間的轉(zhuǎn)換操作用記錄日志的方式記錄下來(lái)。由于Spark中的RDD只支持粗粒度轉(zhuǎn)換并且只讀,結(jié)合DAG機(jī)制使得RDD之間具有父子關(guān)系。當(dāng)RDD的部分分區(qū)數(shù)據(jù)出錯(cuò)時(shí),Spark可以通過(guò)查看日志,準(zhǔn)確定位出錯(cuò)的RDD分區(qū),并根據(jù)RDD之間的父子關(guān)系圖找到出錯(cuò)RDD的父RDD分區(qū),并進(jìn)行重新運(yùn)算。任務(wù)5-1初識(shí)大數(shù)據(jù)計(jì)算框架2.流計(jì)算1)StormStorm是Twitter公司開(kāi)發(fā)的一個(gè)分布式的流計(jì)算框架。Storm軟件核心部分使用Clojure開(kāi)發(fā),外圍部分使用Java開(kāi)發(fā)。Storm只能用來(lái)做流計(jì)算,不能用來(lái)做批處理。Storm實(shí)時(shí)性非常高,能夠達(dá)到毫秒級(jí)的響應(yīng),一般用于實(shí)時(shí)性非常高的場(chǎng)景中,比如實(shí)時(shí)推薦、實(shí)時(shí)預(yù)警等。Storm編程支持多種語(yǔ)言,比如Java、Python、Clojure等,由于Storm內(nèi)部的多語(yǔ)言協(xié)議,你甚至可以使用任何你熟悉的編程語(yǔ)言來(lái)編程。Storm架構(gòu)為主從架構(gòu),主要由一個(gè)主節(jié)點(diǎn)(Nimbus)和若干個(gè)工作節(jié)點(diǎn)(Supervisor)組成。每個(gè)Supervisor上運(yùn)行了多個(gè)任務(wù)工作進(jìn)程(Worker)。Worker可以啟動(dòng)多個(gè)執(zhí)行線(xiàn)程運(yùn)行Storm的流計(jì)算任務(wù)(Topology)。一個(gè)Topology就是一個(gè)有向無(wú)環(huán)圖,由一些消息的發(fā)送者(Spout)和消息的處理者(Bolt)組成。任務(wù)5-1初識(shí)大數(shù)據(jù)計(jì)算框架Storm整個(gè)架構(gòu)如下圖。任務(wù)5-1初識(shí)大數(shù)據(jù)計(jì)算框架Strom運(yùn)行流程為:當(dāng)客戶(hù)端向主節(jié)點(diǎn)(Nimbus)提交一個(gè)Topology時(shí),Nimbus會(huì)對(duì)Topology進(jìn)行調(diào)度。Nimbus根據(jù)Topology所需要的Worker進(jìn)行分配,將其分配到各個(gè)Supervisor的節(jié)點(diǎn)上執(zhí)行。Supervisor啟動(dòng)工作進(jìn)程,每個(gè)工作進(jìn)程執(zhí)行topology的一個(gè)子集。如果把實(shí)時(shí)數(shù)據(jù)比作流水,Spout可以理解為一個(gè)水龍頭,Bolt就是一個(gè)個(gè)水處理池。Storm使用Spout從數(shù)據(jù)源拉取數(shù)據(jù),數(shù)據(jù)組成一個(gè)元組(Tuple)后轉(zhuǎn)交給Bolt處理單元處理。Bolt接受到Tuple處理完后,可以繼續(xù)交給下一個(gè)Bolt處理或停止。這樣數(shù)據(jù)以Tuple的形式一個(gè)接一個(gè)的往下執(zhí)行,就形成了一個(gè)Topology。整個(gè)流計(jì)算處理過(guò)程就是實(shí)時(shí)數(shù)據(jù)不斷地執(zhí)行Topology任務(wù)處理的過(guò)程。任務(wù)5-1初識(shí)大數(shù)據(jù)計(jì)算框架2)SparkStreamingSparkStreaming是Spark核心API的一個(gè)擴(kuò)展,是一個(gè)準(zhǔn)實(shí)時(shí)的流計(jì)算框架。SparkStreaming準(zhǔn)實(shí)時(shí)的流計(jì)算流程如圖5-13所示。從圖中我們可以看出,SparkStreaming將接收到的實(shí)時(shí)流數(shù)據(jù),按照一定時(shí)間間隔(一般為1秒)對(duì)數(shù)據(jù)進(jìn)行拆分,然后將拆分的數(shù)據(jù)交給Spark進(jìn)行批處理計(jì)算,最終得到計(jì)算結(jié)果。SparkStreaming的底層仍然是批處理操作,只是時(shí)間間隔很短,一般稱(chēng)為微批處理操作。SparkStreaming不是完全實(shí)時(shí)流計(jì)算框架,只能算作準(zhǔn)實(shí)時(shí)的流計(jì)算框架,但是這并不妨礙SparkStreaming的廣泛應(yīng)用,因?yàn)?0%實(shí)時(shí)流計(jì)算場(chǎng)景對(duì)實(shí)時(shí)性要求能達(dá)到秒級(jí)就了,SparkStreaming完全滿(mǎn)足。只有少數(shù)實(shí)時(shí)要求非常高的場(chǎng)景,才需要達(dá)到毫秒級(jí),那就需要用Strom或者其他流計(jì)算框架。任務(wù)5-1初識(shí)大數(shù)據(jù)計(jì)算框架SparkStreaming在內(nèi)部把輸入實(shí)時(shí)數(shù)據(jù)按照時(shí)間切片(如1秒)分成一段一段,每個(gè)切片數(shù)據(jù)內(nèi)部是連續(xù)的(連續(xù)數(shù)據(jù)流),而切片之間的數(shù)據(jù)卻是相互獨(dú)立的(離散數(shù)據(jù)流)。每個(gè)切片被稱(chēng)為一個(gè)DStream,每個(gè)DStream被看作是包含一組RDD的序列。任何對(duì)DStream的操作都會(huì)轉(zhuǎn)變?yōu)閷?duì)底層RDD的批處理操作。任務(wù)5-1初識(shí)大數(shù)據(jù)計(jì)算框架
在傳統(tǒng)數(shù)據(jù)存儲(chǔ)中,一個(gè)數(shù)據(jù)文件是存儲(chǔ)在單臺(tái)服務(wù)器的磁盤(pán)中,但是當(dāng)數(shù)據(jù)文件存儲(chǔ)所需磁盤(pán)空間大于這臺(tái)服務(wù)器的磁盤(pán)空間時(shí),怎么辦?
方案1:給這臺(tái)服務(wù)器加磁盤(pán)。這只能解決燃眉之急,如果后續(xù)又有大容量數(shù)據(jù)文件要存儲(chǔ),是不是還要繼續(xù)加磁盤(pán),服務(wù)器的體積是有限的,磁盤(pán)數(shù)量不可能無(wú)限制的增加下去,最終會(huì)達(dá)到一個(gè)瓶頸。
方案2:增加服務(wù)器數(shù)量。用遠(yuǎn)程共享目錄的方式提供數(shù)據(jù)文件的網(wǎng)絡(luò)化的存儲(chǔ),把不同數(shù)據(jù)文件放入不同的機(jī)器中,如果存儲(chǔ)空間不足,可繼續(xù)加服務(wù)器數(shù)量,從理論上來(lái)說(shuō)隨著服務(wù)器數(shù)量增加,存儲(chǔ)空間可以無(wú)限擴(kuò)大。綜合上述2個(gè)方案,我們看到方案2的優(yōu)勢(shì)更大,方案2構(gòu)建了一個(gè)數(shù)據(jù)文件分布式存儲(chǔ)的雛形,這就是早期的分布式文件系統(tǒng)。這種分布式文件系統(tǒng)能夠解決大容量的數(shù)據(jù)存儲(chǔ)問(wèn)題,但是在使用中也暴露出一些問(wèn)題。任務(wù)5-2初識(shí)大數(shù)據(jù)存儲(chǔ)5.2.1分布式文件系統(tǒng)
問(wèn)題1:服務(wù)器集群負(fù)載不均衡。如果某個(gè)數(shù)據(jù)文件是熱門(mén)文件,有很多用戶(hù)經(jīng)常讀取這個(gè)文件,假設(shè)某一臺(tái)服務(wù)器存儲(chǔ)了這個(gè)文件,那么,這臺(tái)服務(wù)器的負(fù)載將會(huì)很高,而其他服務(wù)器沒(méi)有什么壓力。這就造成了各服務(wù)器的負(fù)載不均衡,降低了整個(gè)服務(wù)器集群資源利用率。
問(wèn)題2:數(shù)據(jù)可靠性低,安全性差。如果某個(gè)文件所在的機(jī)器出現(xiàn)故障,那么這個(gè)文件就不損壞了,會(huì)造成數(shù)據(jù)丟失。
問(wèn)題3:文件管理維護(hù)困難。假設(shè)有100臺(tái)服務(wù)器,如果需要人工去管理文件,安排每個(gè)文件的存放位置。那么工作量非常大。因此,我們需要一種工具來(lái)管理自動(dòng)管理多臺(tái)機(jī)器上的數(shù)據(jù)文件的存儲(chǔ),并具有容錯(cuò)機(jī)制,同時(shí)能夠解決負(fù)載均衡問(wèn)題,這個(gè)工具就是分布式文件系統(tǒng)(HDFS)。任務(wù)5-2初識(shí)大數(shù)據(jù)存儲(chǔ)HDFS來(lái)源于谷歌的GFS文件系統(tǒng),由Java語(yǔ)言編寫(xiě),是Hadoop生態(tài)系統(tǒng)的兩大核心組件之一。HDFS可讓多臺(tái)機(jī)器上的多用戶(hù)分享數(shù)據(jù)文件和底層存儲(chǔ)空間。HDFS解決了傳統(tǒng)分布式文件系統(tǒng)的上述3個(gè)問(wèn)題。
解決方案1:為了解決存儲(chǔ)結(jié)點(diǎn)負(fù)載不均衡的問(wèn)題,HDFS把一個(gè)大文件分割成多個(gè)小文件,然后再把這些小文件分別存儲(chǔ)在不同服務(wù)器上。外界要讀取文件時(shí),需要從各個(gè)服務(wù)器同時(shí)讀取小文件,最終合并成一個(gè)大文件。讀取文件的壓力不會(huì)全部集中在一臺(tái)服務(wù)器上,而是分布在多個(gè)服務(wù)器上。這樣可以避免對(duì)某熱點(diǎn)文件的頻繁讀取帶來(lái)的單機(jī)負(fù)載過(guò)高的問(wèn)題。
解決方案2:對(duì)于容錯(cuò)問(wèn)題的解決,HDFS會(huì)把分割形成的每個(gè)小文件進(jìn)行多個(gè)備份,存儲(chǔ)在不同的服務(wù)器上,如果某臺(tái)服務(wù)器壞了,還可以讀取其他服務(wù)器上的備份版本。
解決方案3:為了管理存儲(chǔ)文件,HDFS由一個(gè)主節(jié)點(diǎn)(NameNode)記錄維護(hù)文件存儲(chǔ)的元數(shù)據(jù),比如,HDFS中那個(gè)目錄存了哪些文件,文件被分成了哪些塊,每個(gè)塊被放在哪臺(tái)服務(wù)器上等。HDFS提供了豐富的文件操作命令供用戶(hù)使用,管理員只需要把文件利用HDFS相關(guān)命令上傳,HDFS會(huì)自動(dòng)對(duì)文件進(jìn)行分割存儲(chǔ),不需要管理員去了解底層存儲(chǔ)機(jī)制。任務(wù)5-2初識(shí)大數(shù)據(jù)存儲(chǔ)HDFS可以運(yùn)行在通用硬件平臺(tái)上,利用HDFS我們可以構(gòu)建一個(gè)廉價(jià)的分布式存儲(chǔ)集群。HDFS的設(shè)計(jì)思想是“分而治之”,即將大文件和大批量數(shù)據(jù)文件分布式存儲(chǔ)在大量獨(dú)立的服務(wù)器上。HDFS要求數(shù)據(jù)集“一次寫(xiě)入、多次查詢(xún)”,每次查詢(xún)都將涉及該數(shù)據(jù)集的大部分?jǐn)?shù)據(jù)甚至全部數(shù)據(jù),因此延遲較高,多應(yīng)用在一些實(shí)時(shí)性和交互性要求不高的場(chǎng)合,比如海量歷史日志數(shù)據(jù)的存儲(chǔ)查詢(xún)分析。HDFS適合存儲(chǔ)大容量數(shù)據(jù)文件,對(duì)于大量小文件的存儲(chǔ),HDFS優(yōu)勢(shì)并不明顯。HDFS架構(gòu)為主從架構(gòu),HDFS集群擁有一個(gè)主節(jié)點(diǎn)(NameNode)和若干個(gè)從節(jié)點(diǎn)(DataNode)。NameNode管理文件系統(tǒng)的元數(shù)據(jù),DataNode存儲(chǔ)實(shí)際的數(shù)據(jù)。當(dāng)用戶(hù)需要獲取文件時(shí),通過(guò)Client向NameNode獲取文件存儲(chǔ)的元數(shù)據(jù),知道文件的存儲(chǔ)位置。然后和相關(guān)的DataNode進(jìn)行文件的I/O讀取。任務(wù)5-2初識(shí)大數(shù)據(jù)存儲(chǔ)HDFS可以運(yùn)行在通用硬件平臺(tái)上,利用HDFS我們可以構(gòu)建一個(gè)廉價(jià)的分布式存儲(chǔ)集群。HDFS的設(shè)計(jì)思想是“分而治之”,即將大文件和大批量數(shù)據(jù)文件分布式存儲(chǔ)在大量獨(dú)立的服務(wù)器上。HDFS要求數(shù)據(jù)集“一次寫(xiě)入、多次查詢(xún)”,每次查詢(xún)都將涉及該數(shù)據(jù)集的大部分?jǐn)?shù)據(jù)甚至全部數(shù)據(jù),因此延遲較高,多應(yīng)用在一些實(shí)時(shí)性和交互性要求不高的場(chǎng)合,比如海量歷史日志數(shù)據(jù)的存儲(chǔ)查詢(xún)分析。HDFS適合存儲(chǔ)大容量數(shù)據(jù)文件,對(duì)于大量小文件的存儲(chǔ),HDFS優(yōu)勢(shì)并不明顯。HDFS架構(gòu)為主從架構(gòu),HDFS集群擁有一個(gè)主節(jié)點(diǎn)(NameNode)和若干個(gè)從節(jié)點(diǎn)(DataNode)。NameNode管理文件系統(tǒng)的元數(shù)據(jù),DataNode存儲(chǔ)實(shí)際的數(shù)據(jù)。當(dāng)用戶(hù)需要獲取文件時(shí),通過(guò)Client向NameNode獲取文件存儲(chǔ)的元數(shù)據(jù),知道文件的存儲(chǔ)位置。然后和相關(guān)的DataNode進(jìn)行文件的I/O讀取。HDFS解決了大數(shù)據(jù)下的數(shù)據(jù)存儲(chǔ)問(wèn)題,但是HDFS只提供了對(duì)文件的操作,如果要對(duì)文件內(nèi)部的數(shù)據(jù)進(jìn)行一些操作,比如對(duì)數(shù)據(jù)的增刪改查,HDFS并沒(méi)有提供相關(guān)的命令,需要我們編寫(xiě)專(zhuān)門(mén)的應(yīng)用程序才能實(shí)現(xiàn)。要實(shí)現(xiàn)對(duì)數(shù)據(jù)的增刪改查,我們想到了數(shù)據(jù)庫(kù)這個(gè)工具,比如常見(jiàn)的關(guān)系數(shù)據(jù)庫(kù)。但是在大數(shù)據(jù)時(shí)代,面對(duì)快速增長(zhǎng)的數(shù)據(jù)規(guī)模和日漸復(fù)雜的數(shù)據(jù)模型,關(guān)系型數(shù)據(jù)庫(kù)已無(wú)法滿(mǎn)足需求。問(wèn)題主要體現(xiàn)在以下幾點(diǎn):
問(wèn)題1:關(guān)系數(shù)據(jù)庫(kù)無(wú)法滿(mǎn)足海量數(shù)據(jù)的高效率存儲(chǔ)和訪(fǎng)問(wèn)。
問(wèn)題2:關(guān)系數(shù)據(jù)庫(kù)擴(kuò)展性有限。傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)部署一般為單節(jié)點(diǎn)部署,如果數(shù)據(jù)量劇增,可以采用縱向擴(kuò)充,加CPU、加磁盤(pán)、加內(nèi)存,但是終有盡頭。如果采用橫向擴(kuò)展,關(guān)系數(shù)據(jù)庫(kù)很難通過(guò)增加服務(wù)器結(jié)點(diǎn)來(lái)擴(kuò)展性能和提高負(fù)載能力??v使實(shí)現(xiàn)了,還有下面的問(wèn)題3存在。
問(wèn)題3:關(guān)系數(shù)據(jù)庫(kù)無(wú)法存儲(chǔ)和處理半結(jié)構(gòu)化和非結(jié)構(gòu)化數(shù)據(jù)。任務(wù)5-2初識(shí)大數(shù)據(jù)存儲(chǔ)5.2.2NoSQL數(shù)據(jù)庫(kù)
綜上,我們需要一種易擴(kuò)展、大數(shù)據(jù)量、高性能和靈活數(shù)據(jù)模型的數(shù)據(jù)庫(kù)來(lái)進(jìn)行海量的數(shù)據(jù)存儲(chǔ)和查詢(xún),這種數(shù)據(jù)庫(kù)叫做非關(guān)系(NoSQL)數(shù)據(jù)庫(kù)。NoSQL數(shù)據(jù)庫(kù)采用的數(shù)據(jù)模型不同于關(guān)系數(shù)據(jù)庫(kù)模型,關(guān)系數(shù)據(jù)庫(kù)數(shù)據(jù)模型是結(jié)構(gòu)化的行和列,而NoSQL數(shù)據(jù)庫(kù)數(shù)據(jù)模型采用的是類(lèi)似鍵值、列族、文檔等的非關(guān)系模型。同時(shí)NoSQL數(shù)據(jù)庫(kù)弱化了關(guān)系型數(shù)據(jù)庫(kù)的4大原則,即數(shù)據(jù)的原子性、一致性、隔離性、和持久性。
在數(shù)據(jù)存儲(chǔ)方面,關(guān)系型數(shù)據(jù)庫(kù)中的表都是存儲(chǔ)一些格式化的數(shù)據(jù)結(jié)構(gòu),關(guān)系型數(shù)據(jù)庫(kù)中每條記錄(行)稱(chēng)為元組。每個(gè)元組的字段(列)的組成都一樣,即使有一些元組不需要某些字段,但數(shù)據(jù)庫(kù)依然會(huì)為每個(gè)元組分配所有的字段。而NoSQL數(shù)據(jù)庫(kù)數(shù)據(jù)存儲(chǔ)不需要固定的表結(jié)構(gòu),每一個(gè)元組可以有不一樣的字段,每個(gè)元組可以根據(jù)需要增加一些自己的鍵值對(duì)。這樣數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)就不固定,可以滿(mǎn)足對(duì)非結(jié)構(gòu)化數(shù)據(jù)和半結(jié)構(gòu)化數(shù)據(jù)的存儲(chǔ),同時(shí)也可以減少一些時(shí)間和空間的開(kāi)銷(xiāo)。由于數(shù)據(jù)結(jié)構(gòu)不固定,數(shù)據(jù)之間無(wú)關(guān)系,導(dǎo)致NoSQL數(shù)據(jù)庫(kù)非常容易擴(kuò)展,增強(qiáng)了數(shù)據(jù)庫(kù)的橫向擴(kuò)展能力。任務(wù)5-2初識(shí)大數(shù)據(jù)存儲(chǔ)NoSQL數(shù)據(jù)庫(kù)種類(lèi)繁多,歸結(jié)起來(lái),可以劃分為4種類(lèi)型,分別是鍵值數(shù)據(jù)庫(kù)、列式數(shù)據(jù)庫(kù)、文檔數(shù)據(jù)庫(kù)和圖形數(shù)據(jù)庫(kù)。任務(wù)5-2初識(shí)大數(shù)據(jù)存儲(chǔ)NoSQL數(shù)據(jù)庫(kù)類(lèi)型類(lèi)型特點(diǎn)產(chǎn)品代表鍵值數(shù)據(jù)庫(kù)數(shù)據(jù)存儲(chǔ)為key-value形式,使用哈希表存儲(chǔ)數(shù)據(jù),數(shù)據(jù)查詢(xún)時(shí)通過(guò)表中的Key(鍵)用來(lái)定位Value(值)Value可以用來(lái)存儲(chǔ)任意類(lèi)型的數(shù)據(jù),包括整型、字符型、數(shù)組、對(duì)象等。Redis列式數(shù)據(jù)庫(kù)數(shù)據(jù)按列存儲(chǔ),每行列數(shù)可變,方便存儲(chǔ)結(jié)構(gòu)化和半結(jié)構(gòu)化數(shù)據(jù)。列可以單獨(dú)存儲(chǔ),方便做數(shù)據(jù)壓縮,對(duì)針對(duì)某一列或者某幾列的查詢(xún)具有速度優(yōu)勢(shì)Hbase、Cassandra、Hypertable文檔數(shù)據(jù)庫(kù)文檔數(shù)據(jù)庫(kù)主要用于存儲(chǔ)和檢索文檔數(shù)據(jù),文檔數(shù)據(jù)庫(kù)通過(guò)鍵來(lái)定位一個(gè)文檔。在文檔數(shù)據(jù)庫(kù)中,文檔是數(shù)據(jù)庫(kù)的最小單位。文檔格式包括XML、JSON等,也可以使用二進(jìn)制格式,如PDF、Office文檔等。一個(gè)文檔可以包含復(fù)雜的數(shù)據(jù)結(jié)構(gòu),每個(gè)文檔可以具有完全不同的結(jié)構(gòu)。MongoDB圖形數(shù)據(jù)庫(kù)圖形數(shù)據(jù)庫(kù)以圖論為基礎(chǔ),使用圖作為數(shù)據(jù)模型來(lái)存儲(chǔ)數(shù)據(jù),圖形數(shù)據(jù)庫(kù)適用于保存和處理高度相互關(guān)聯(lián)的數(shù)據(jù),適用于社交網(wǎng)絡(luò)、依賴(lài)分析、模式識(shí)別、推薦系統(tǒng)、路徑尋找等場(chǎng)景Neo4JHBase是基于Hadoop的面向列的NoSQL數(shù)據(jù)庫(kù),前身是谷歌的BigTable,屬于Hadoop生態(tài)系統(tǒng)的一個(gè)組件。HBase的出現(xiàn)解決了HDFS存儲(chǔ)數(shù)據(jù)無(wú)法進(jìn)行實(shí)施查詢(xún)計(jì)算的問(wèn)題,HBase構(gòu)建在HDFS之上,數(shù)據(jù)的底層存儲(chǔ)仍然采用HDFS。本項(xiàng)目的數(shù)據(jù)存儲(chǔ)就選用HBase數(shù)據(jù)庫(kù)。HBase是一個(gè)稀疏、多維度、有序的映射表。HBase的數(shù)據(jù)存儲(chǔ)模式如下表所示。從表中可以看出,HBase的數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)單元中,每個(gè)數(shù)據(jù)單元通過(guò)行鍵、列簇、列限定符和時(shí)間戳共同組成的索引來(lái)標(biāo)識(shí)的。每個(gè)單元的值是一個(gè)未經(jīng)解釋的字符串,沒(méi)有數(shù)據(jù)類(lèi)型。HBase中的每一行由一個(gè)唯一的行鍵和一個(gè)或多個(gè)列簇組成,一個(gè)列簇中可以包含任意多個(gè)列。在一張表中,每行所包含的列簇是相同的,但是每個(gè)列簇中列的個(gè)數(shù)可以不同,列簇支持動(dòng)態(tài)擴(kuò)展,可以隨時(shí)添加新的列。因此對(duì)于整個(gè)映射表的每行數(shù)據(jù)而言,有些列的值為空。所以,HBase的是稀疏的,這非常方便存儲(chǔ)非結(jié)構(gòu)化數(shù)據(jù)和半結(jié)構(gòu)化數(shù)據(jù)。任務(wù)5-2初識(shí)大數(shù)據(jù)存儲(chǔ)5.2.3HBase簡(jiǎn)介HBase的數(shù)據(jù)存儲(chǔ)模式行鍵時(shí)間戳列簇"n.www"t3contents:html=”<html>...”t2contents:html=”<html>...”t1contents:html=”<html>...”"n.www"t5anchor:=”CNN”t4anchor:my.look.ca=”CNN.com”
對(duì)HBase數(shù)據(jù)的操作只有新增,刪除和查詢(xún),沒(méi)有更新操作,這和HBase的底層仍然用HDFS存儲(chǔ)有關(guān),HDFS為保證數(shù)據(jù)讀取的吞吐量,實(shí)行“一次寫(xiě),多次讀”的原則。不允許在原有數(shù)據(jù)上更新。如果外界傳輸了新的數(shù)據(jù)進(jìn)來(lái),HBase并不會(huì)刪除該數(shù)據(jù)舊的版本,而是生成一個(gè)新的版本并加上時(shí)間戳,數(shù)據(jù)原有的版本仍然保留。在應(yīng)用中,用戶(hù)可以對(duì)保留的版本數(shù)量進(jìn)行設(shè)置。在查詢(xún)數(shù)據(jù)時(shí),用戶(hù)可以自定義選擇獲取離某個(gè)時(shí)間點(diǎn)最近版本的數(shù)據(jù),或者一次獲取數(shù)據(jù)的所有版本。如果不給定時(shí)間戳,那么查詢(xún)得到的是離當(dāng)前時(shí)間最近的那一個(gè)版本的數(shù)據(jù)。任務(wù)5-2初識(shí)大數(shù)據(jù)存儲(chǔ)HBase數(shù)據(jù)如何存放在HDFS上呢?假設(shè)有一張表,HBase會(huì)根據(jù)行鍵的值對(duì)該表中的行進(jìn)行分區(qū),每個(gè)行區(qū)間構(gòu)成一個(gè)分區(qū)(Region),分區(qū)內(nèi)包含了位于這個(gè)行區(qū)間內(nèi)的所有數(shù)據(jù)。默認(rèn)一張表的初始分區(qū)數(shù)為2個(gè),隨著表中數(shù)據(jù)不斷增加,Region不斷增大,當(dāng)增大到超過(guò)閾值的時(shí)候,一個(gè)Region就會(huì)分為兩個(gè)Region。表中的行越來(lái)越多,Region就越來(lái)越多。這么多Region需要一個(gè)“管家”來(lái)管理,這個(gè)管家就是RegionServer。RegionServer的管理原則為每個(gè)RegionServer負(fù)責(zé)管理一個(gè)或多個(gè)Region。不同的Region可以分布在不同的RegionServer上,但一個(gè)Region不會(huì)拆分到多個(gè)RegionServer上。任務(wù)5-2初識(shí)大數(shù)據(jù)存儲(chǔ)Region并不是數(shù)據(jù)存儲(chǔ)的最小單元。Region往下還可以細(xì)分,每個(gè)Region又由一個(gè)或者多個(gè)Store組成,每個(gè)Store保存一個(gè)列族的數(shù)據(jù)。每個(gè)Store又由一個(gè)MemStore和零或多個(gè)StoreFile組成,StoreFile以文件格式保存在HDFS上。任務(wù)5-2初識(shí)大數(shù)據(jù)存儲(chǔ)
由于HBase架構(gòu)在HDFS之上,所以HBase也是主從架構(gòu)。HBase集群架構(gòu)如下圖所示,整個(gè)架構(gòu)主要由Master、RegionServer和Zookeeper組成。Master作為主節(jié)點(diǎn)主要負(fù)責(zé)表和數(shù)據(jù)的管理工作,包括表的增刪改查和數(shù)據(jù)存儲(chǔ)Region的協(xié)調(diào)分配。RegionServer負(fù)責(zé)維護(hù)Master分配給它的一個(gè)或多個(gè)Region的數(shù)據(jù)讀寫(xiě)操作。Zookeeper主要負(fù)責(zé)實(shí)時(shí)監(jiān)控RegionServer的狀態(tài),并上報(bào)給Master。這樣,Master就可以隨時(shí)知道各個(gè)RegionServer的工作狀態(tài),進(jìn)行統(tǒng)一管理。任務(wù)5-2初識(shí)大數(shù)據(jù)存儲(chǔ)環(huán)境搭建步驟包含5.3.1安裝HBase并配置5.3.2安裝Spark并配置教材中任務(wù)5-3中有詳細(xì)實(shí)現(xiàn),這里不做展示任務(wù)5-3搭建Spark和HBase開(kāi)發(fā)環(huán)境
安裝和使用ScalaIDEForEclipse步驟如下:
(1)把scala-SDK-4.7.0-vfinal-2.12-linux.gtk.x86_64.tar.gz文件拷貝到目錄/home/person/soft下,在soft文件夾下空白區(qū)域點(diǎn)擊右鍵,選擇在“終端打開(kāi)”,打開(kāi)命令行終端,命令行終端當(dāng)前目錄就是soft目錄。輸入命令:sudotar-zxvfscala-SDK-4.7.0-vfinal-2.12-linux.gtk.x86_64.tar.gz-C/usr/local,將壓縮包解壓到/usr/local目錄下。任務(wù)5-4編寫(xiě)Spark應(yīng)用程序并提交集群運(yùn)行5.4.1Linux下安裝和配置ScalaIDEForEclipse工具
(2)啟動(dòng)ScalaIDE。輸入命令cd/usr/local,切換到local目錄下,繼續(xù)輸入命令:./eclipse/eclipse,啟動(dòng)ScalaIDE。ScalaIDE第一次啟動(dòng)會(huì)彈出如下圖所示界面,讓你設(shè)置工作空間,可以自己設(shè)定或者按默認(rèn)設(shè)置,點(diǎn)擊“l(fā)aunch”,打開(kāi)ScalaIDE。任務(wù)5-4編寫(xiě)Spark應(yīng)用程序并提交集群運(yùn)行
(3)打開(kāi)ScalaIDE后,這里需要額外配置一下Maven相關(guān)包的下載路徑,因?yàn)镸aven相關(guān)包的默認(rèn)下載路徑是國(guó)外網(wǎng)站,速度非常慢,我們改成從國(guó)內(nèi)鏡像網(wǎng)站阿里云下載。從圖形界面進(jìn)入.m2文件夾下,路徑為:/home/person/.m2。注意:m2文件夾為隱藏文件夾,默認(rèn)看不見(jiàn),需按ctrl+h鍵才能看到。在.m2文件夾下建立settings.xml文件。在settings.xml文件輸入以下內(nèi)容并保存。任務(wù)5-4編寫(xiě)Spark應(yīng)用程序并提交集群運(yùn)行<settings><localRepository>/home/person/.m2/repository</localRepository><servers><server><id>ernal</id><username>admin</username><password>admin123</password></server><server><id>archiva.snapshots</id><username>admin</username><password>admin123</password></server></servers><mirrors><mirror><id>alimaven</id><name>aliyunmaven</name>
<url>/nexus/content/groups/public/</url><mirrorOf>central</mirrorOf></mirror></mirrors></settings>
(4)設(shè)置Maven的UserSettings為我們自己新建的settings.xml文件。在ScalaIDE點(diǎn)擊window–>preferences。彈出對(duì)話(huà)框點(diǎn)擊Maven–>UserSettings,點(diǎn)擊UserSettings下方的“browse”按鈕,設(shè)置路徑為剛才編寫(xiě)的settings.xml。設(shè)置路徑若看不見(jiàn)隱藏文件,需按ctrl+h鍵才能看到。設(shè)置完畢后點(diǎn)擊下方“ApplyandClose”按鈕。任務(wù)5-4編寫(xiě)Spark應(yīng)用程序并提交集群運(yùn)行
(1)我們先創(chuàng)建一個(gè)Project。在左側(cè)空白區(qū)域右鍵,彈出對(duì)話(huà)框,依次點(diǎn)擊New–>Project,進(jìn)入工程選擇界面。任務(wù)5-4編寫(xiě)Spark應(yīng)用程序并提交集群運(yùn)行5.4.2ScalaIDE編寫(xiě)Spark應(yīng)用程序并打包
(2)在彈出的界面上雙擊Maven文件,選擇MavenProject,點(diǎn)擊“next”。任務(wù)5-4編寫(xiě)Spark應(yīng)用程序并提交集群運(yùn)行
(3)進(jìn)入如圖5-51所示界面,繼續(xù)點(diǎn)擊“next”。任務(wù)5-4編寫(xiě)Spark應(yīng)用程序并提交集群運(yùn)行
(4)ScalaIDE自帶Maven插件,但是自帶的Maven插件不能應(yīng)用到Scala項(xiàng)目。因此需要再下載一個(gè)針對(duì)Scala的Maven插件。點(diǎn)擊右下角的“AddArchetype”按鈕,添加Maven項(xiàng)目模板。任務(wù)5-4編寫(xiě)Spark應(yīng)用程序并提交集群運(yùn)行
(5)在A(yíng)ddArchetype窗口中輸入如下信息,在A(yíng)rchetypeGroupid欄輸入net.alchim31.maven,在A(yíng)rchetypeArtifactid欄輸入scala-archetype-simple,在version欄輸入1.6,點(diǎn)擊“ok”。任務(wù)5-4編寫(xiě)Spark應(yīng)用程序并提交集群運(yùn)行
(6)等幾秒鐘,我們看到net.alchim31.maven文件已經(jīng)下載好了,選擇它,點(diǎn)擊“next”。任務(wù)5-4編寫(xiě)Spark應(yīng)用程序并提交集群運(yùn)行
(7)進(jìn)入下圖所示界面,在GroupId上填寫(xiě)opeartehbase,在A(yíng)rtifactId填寫(xiě)writedata,點(diǎn)擊“Finish”。這樣就可以創(chuàng)建一個(gè)MavenProject。任務(wù)5-4編寫(xiě)Spark應(yīng)用程序并提交集群運(yùn)行
(8)創(chuàng)建MavenProject過(guò)程需要等一小會(huì),因?yàn)橐螺dMaven的一些jar包。創(chuàng)建完畢以后整個(gè)Projcect結(jié)構(gòu)如下圖所示。任務(wù)5-4編寫(xiě)Spark應(yīng)用程序并提交集群運(yùn)行
(9)我們看到Projcect左下角有小叉叉,代表有錯(cuò)誤。查看Scala版本,發(fā)現(xiàn)默認(rèn)是2.12版本,需要改成2.11版本。在“ScalaLibrarycontainer”上點(diǎn)擊右鍵,點(diǎn)擊“buildPath”,點(diǎn)擊“ConfigurebuildPath”進(jìn)入配置界面。任務(wù)5-4編寫(xiě)Spark應(yīng)用程序并提交集群運(yùn)行
(10)雙擊“ScalaLibrarycontainer”,在彈出的窗口中選擇,latest2.11bundle(dynamic),點(diǎn)擊“Finish”。任務(wù)5-4編寫(xiě)Spark應(yīng)用程序并提交集群運(yùn)行
(11)修改完畢后,我們發(fā)現(xiàn)還存在錯(cuò)誤,錯(cuò)誤定位在工程src/test/scala文件夾下的specs.scala文件,由于我們不需要用到,右鍵specs.scala,點(diǎn)擊“Delete”直接刪除該文件即可。這時(shí)我們發(fā)現(xiàn)不會(huì)再報(bào)錯(cuò)了。任務(wù)5-4編寫(xiě)Spark應(yīng)用程序并提交集群運(yùn)行
(12)在writedata目錄的src/main/scala下,右鍵operatehba
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度酒店客房經(jīng)營(yíng)權(quán)及服務(wù)標(biāo)準(zhǔn)合同3篇
- 圖紙管理培訓(xùn)
- 培訓(xùn)有效溝通技巧
- 二零二五年度安裝工勞動(dòng)合同范本:新能源項(xiàng)目專(zhuān)版2篇
- 2024年綜合性商業(yè)地產(chǎn)物業(yè)服務(wù)協(xié)議版B版
- 二零二五年度廠(chǎng)房物業(yè)管理與法律咨詢(xún)服務(wù)合同范本3篇
- 病人術(shù)前宣教和護(hù)理
- 2025湖南省建筑安全員-C證考試(專(zhuān)職安全員)題庫(kù)附答案
- 2025年度民間房屋抵押借款合同范本全新修訂3篇
- 2025福建省建筑安全員B證考試題庫(kù)及答案
- 【航空個(gè)性化服務(wù)淺析4700字(論文)】
- 保障農(nóng)民工工資支付條例全文及解讀課件
- 中國(guó)移動(dòng)全面預(yù)算管理
- 【部編】小高考:2021年江蘇普通高中學(xué)業(yè)水平測(cè)試歷史試卷
- 公路隧道建設(shè)施工技術(shù)規(guī)范學(xué)習(xí)考試題庫(kù)(400道)
- 新人教版七至九年級(jí)英語(yǔ)單詞表 漢譯英(含音標(biāo))
- 淺談事業(yè)單位固定資產(chǎn)的折舊本科學(xué)位論文
- 食堂管理制度大全
- 愛(ài)普生機(jī)器人中級(jí)培訓(xùn)資料
- 2020-2021學(xué)年江蘇省徐州市九年級(jí)(上)期末化學(xué)試卷
評(píng)論
0/150
提交評(píng)論