《大數(shù)據(jù)技術(shù)導論》課件-項目五_第1頁
《大數(shù)據(jù)技術(shù)導論》課件-項目五_第2頁
《大數(shù)據(jù)技術(shù)導論》課件-項目五_第3頁
《大數(shù)據(jù)技術(shù)導論》課件-項目五_第4頁
《大數(shù)據(jù)技術(shù)導論》課件-項目五_第5頁
已閱讀5頁,還剩62頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

本項目學習內(nèi)容包括:1.大數(shù)據(jù)計算和傳統(tǒng)數(shù)據(jù)計算區(qū)別2.常見的大數(shù)據(jù)計算框架3.NoSQL數(shù)據(jù)庫4.在Hadoop環(huán)境上安裝Spark和HBase5.利用Spark進行房屋信息進行計算處理,并存儲在HBase數(shù)據(jù)庫本項目學習主要內(nèi)容本項目思維導圖

數(shù)據(jù)計算是對數(shù)據(jù)依某種模式而建立起來的關(guān)系進行處理的過程,常見的“加減乘除”就是數(shù)據(jù)計算。在大數(shù)據(jù)還未出現(xiàn)的時候,傳統(tǒng)數(shù)據(jù)計算的核心思想是數(shù)據(jù)的集中式計算。在集中式計算中,所有的數(shù)據(jù)計算過程都由一個大型中央計算系統(tǒng)或一臺高性能服務器完成,需要參與計算的數(shù)據(jù)全部由大型中央計算系統(tǒng)(服務器)中的數(shù)據(jù)庫進行存儲。如果有數(shù)據(jù)計算需求,各I/O終端需要統(tǒng)一發(fā)送請求給大型中央計算系統(tǒng)(服務器)。由大型中央計算系統(tǒng)(服務器)進行統(tǒng)一計算后得出結(jié)果,又通過網(wǎng)絡傳輸給各個I/O終端。集中式計算的典型案例就是網(wǎng)絡文件系統(tǒng)(NFS)和Web系統(tǒng)。任務5-1初識大數(shù)據(jù)計算框架5.1.1大數(shù)據(jù)計算和傳統(tǒng)數(shù)據(jù)計算區(qū)別

在數(shù)據(jù)量不大的情況下,集中式計算模式完全可以滿足需求。但是隨著數(shù)據(jù)量的逐漸增大,我們需要通過縱向擴展方式不斷增加大型中央計算系統(tǒng)(服務器)的處理器數(shù)量、內(nèi)存容量、磁盤容量等來增強單個服務器的計算能力,從而保證數(shù)據(jù)計算的速度。即使這樣做,也仍然存在以下三個問題。

(1)隨著數(shù)據(jù)量的逐漸增大,數(shù)據(jù)的網(wǎng)絡傳輸時間大大增加,嚴重影響計算效率。(2)隨著數(shù)據(jù)量的逐漸增大,我們采用縱向擴展方式來提高計算性能終究會遇到瓶頸。(3)如果服務器故障停機或者斷電,那么整個計算過程無法繼續(xù)執(zhí)行下去,整個計算系統(tǒng)的將癱瘓,不再具有可用性。

如何解決?任務5-1初識大數(shù)據(jù)計算框架

很顯然,在大數(shù)據(jù)時代,縱向擴展的方式只能解燃眉之急,并不能從根本上解決問題。即然縱向擴展不行,那么我們就換一條路,有人就設想利用橫向擴展方式來提高計算性能,即我們可以向服務端添加另一個計算節(jié)點(另一臺服務器),當計算數(shù)據(jù)量比較大時,我們可以把大的計算任務切分成小任務,分給兩臺服務器協(xié)同完成,然后再匯總計算結(jié)果。任務5-1初識大數(shù)據(jù)計算框架

這種計算方式稱之為分布式計算。分布式計算是由多個服務器組成一個計算集群來共同執(zhí)行計算任務。盡管單個服務器的運算能力還是有限,但是將成百上千的服務器組成服務器集群后,整個系統(tǒng)計算性能大幅度提升,同時集群還具備強大的橫向擴展功能,隨著數(shù)據(jù)量的增大,還可以不斷往集群中新增服務器。分布式計算的關(guān)鍵問題就在于如何進行任務分解,同時協(xié)調(diào)各個計算節(jié)點的資源分配和任務分配。

這就需要一個“管家”。這個“管家”可以是集群中的某一臺機器來做,也可以是集群中所有的機器共同來做。如果是某一臺機器來做,那么這個集群的架構(gòu)稱之為主從架構(gòu)。主從架構(gòu)集群中只有1臺機器總管整個集群,其他機器屬于從屬地位。如果是集群中所有機器來做,這個集群稱之為P2P架構(gòu)。P2P架構(gòu)集群中,各個機器地位同等,沒有主從之分。任務5-1初識大數(shù)據(jù)計算框架“管家”機器在分配計算任務時并不是隨機分配的,而是根據(jù)“數(shù)據(jù)向計算靠攏”的原則進行任務分配,即哪臺機器存儲了計算任務所需要的數(shù)據(jù),那么這個計算任務就分配給對應的那臺機器。分布式計算在理論上能夠滿足大數(shù)據(jù)計算需求,但是技術(shù)實現(xiàn)比較困難。因此,在2003年之前,分布式計算發(fā)展非常緩慢,大多數(shù)企業(yè)仍然采用縱向方式擴容計算服務器,數(shù)據(jù)計算模式多為集中式計算。對于企業(yè)來說,集中式計算對單個服務器性能要求較高,服務器價格非常昂貴,大大增加了企業(yè)的購買成本。

在2003—2006年間,互聯(lián)網(wǎng)巨頭Google公司相繼發(fā)表了GFS(GoogleFileSystem)、MapReduce和BigTable三篇技術(shù)論文,提出了一套全新的分布式計算模型。其中,GFS是谷歌分布式文件系統(tǒng),MapReduce是谷歌分布式計算框架,BigTable是構(gòu)建在GFS之上的數(shù)據(jù)存儲系統(tǒng)。這三大組件共同構(gòu)成了Google的分布式計算模型。任務5-1初識大數(shù)據(jù)計算框架Google的分布式計算模型大幅度簡化了傳統(tǒng)的分布式計算理論,降低了分布式計算技術(shù)實現(xiàn)難度,使分布式計算從理論進入實際運用階段成為可能。在Google的分布式計算模型中,分布式計算節(jié)點可以選用廉價服務器甚至普通的PC機。如果需要提升集群的計算性能,只需增加廉價服務器的數(shù)量,這樣整個計算集群構(gòu)建的成本將會十分低廉。隨后,谷歌在其計算中心成功搭建了一個分布式計算集群,并取得了良好的數(shù)據(jù)計算效果。至此,各互聯(lián)網(wǎng)公司也開始利用Google的分布式計算模型搭建屬于自己的分布式計算系統(tǒng)。分布式計算模式風靡世界。目前,在Google、阿里巴巴等大型互聯(lián)網(wǎng)企業(yè)的計算中心里,分布式計算集群服務器數(shù)量已經(jīng)達到了上千臺之多,完全能夠滿足日常海量數(shù)據(jù)的計算負荷。任務5-1初識大數(shù)據(jù)計算框架

通過項目二的表2-2的學習,我們知道大數(shù)據(jù)有4種計算模式,離線批處理,實時流計算,交互查詢分析和圖計算。其實,根據(jù)計算數(shù)據(jù)是否實時又可以把計算模式總的分為兩類,一類為批量計算包含離線計算、交互查詢分析和圖計算。另一類為流計算。任務5-1初識大數(shù)據(jù)計算框架5.1.2常見的大數(shù)據(jù)計算框架簡介

下面我們選取一些具有代表性的大數(shù)據(jù)計算框架來介紹。1.批量計算1)MapReduceMapReduce是最早的大數(shù)據(jù)計算框架,是Hadoop大數(shù)據(jù)處理平臺的兩大核心組件之一。其原型是谷歌分布式計算模型中的MapReduce計算框架。MapReduce計算框架只有2個操作Map和Reduce,在一定程度上限制了MapReduce的表達能力。當然我們可以通過多個MapReduce的組合,表達復雜的計算問題,但實現(xiàn)過程太過復雜。MapReduce采用Java語言編程,編寫一個MapReduce應用程序需要實現(xiàn)3個Java類(Map類、Reduce類和驅(qū)動程序類)。MapReduce一般適用于離線大批量數(shù)據(jù)計算,實時性不高,比如歷史數(shù)據(jù)的分析、日志分析等。MapReduce的計算過程是把大批量的數(shù)據(jù)按照某種特征進行分片,然后對各個分片進行并行計算,最后按照該特征合并各并行計算的結(jié)果,得到最終結(jié)果。MapReduce的架構(gòu)在項目二已經(jīng)介紹過了,下面我們結(jié)合詞頻統(tǒng)計的案例,介紹MapReduce數(shù)據(jù)計算過程。任務5-1初識大數(shù)據(jù)計算框架

假設我要統(tǒng)計集群中的HDFS某目下所有文件中各個單詞出現(xiàn)的頻率。任務5-1初識大數(shù)據(jù)計算框架MapReduce的計算過程主要分為6個階段,分別是輸入數(shù)據(jù)、分片、Mapping、Shuffling、Reducing和輸出計算結(jié)果。下面簡單介紹一下各個階段所執(zhí)行的任務。

(1)輸入數(shù)據(jù)階段所執(zhí)行的任務是程序從HDFS分布式文件系統(tǒng)上的某個目錄讀取數(shù)據(jù)。一般情況下,HDFS目錄里面的文件被分割成很多小文件存儲在集群的不同機器上。讀取數(shù)據(jù)文件采用就近原則,每個機器只讀取自己存儲的那一部分數(shù)據(jù),數(shù)據(jù)讀取不涉及跨節(jié)點的數(shù)據(jù)復制。

(2)分片階段所執(zhí)行的任務是程序按照一定的標準對數(shù)據(jù)分片,每個分片對應一個Map任務。例如圖5-3的數(shù)據(jù)經(jīng)過數(shù)據(jù)分片后形成3個數(shù)據(jù)片,每個數(shù)據(jù)片會啟動一個Map任務進行后續(xù)處理。

(3)Mapping階段所執(zhí)行的任務是對分片后的單詞執(zhí)行Map操作,把分片后單詞轉(zhuǎn)換成鍵值對的形式輸出。任務5-1初識大數(shù)據(jù)計算框架

(4)Shuffling階段所執(zhí)行的任務是對Map任務輸出的鍵值對進行Shuffle操作,把相同鍵名的鍵值對分為一組。

(5)Reducing階段所執(zhí)行的任務是當集群所有節(jié)點都執(zhí)行完Shuffle操作后,對每個分組數(shù)據(jù)啟動一個Reduce操作。把同一個分組中鍵名相同的數(shù)據(jù)合并為列表,并對每個列表的值進行相加。

(6)輸出最終計算結(jié)果。MapReduce主要用來解決實時性要求不高的大批量數(shù)據(jù)集的數(shù)據(jù)計算問題,多用于對海量歷史數(shù)據(jù)的分析。但是,目前MapReduce已經(jīng)慢慢的退出我們的視野,被其他更快速、方便的大數(shù)據(jù)計算框架取代。這是為什么呢?因為MapReduce數(shù)據(jù)計算延遲高。MapReduce數(shù)據(jù)計算延遲高有兩方面的問題。任務5-1初識大數(shù)據(jù)計算框架

問題1:MapReduce計算過程存在木桶效應,每個階段都需要所有的計算機同步,影響了執(zhí)行效率。比如啟動Reduce任務時,需要集群中所有的計算機都執(zhí)行完畢Shuffle階段,這樣如果集群有一臺計算機性能較差,則拖慢整個集群的計算過程,造成高延遲。

問題2:MapReduce每次數(shù)據(jù)處理的中間結(jié)果都要使用磁盤存儲,下一次數(shù)據(jù)處理又要從磁盤讀取,整個數(shù)據(jù)計算過程涉及到大量的I/O磁盤讀寫操作。尤其在解決機器學習相關(guān)問題,需要迭代計算,這樣高頻次的I/O磁盤讀寫嚴重影響程序執(zhí)行效率。任務5-1初識大數(shù)據(jù)計算框架

2)Tez

為克服MapReduce上述問題,有人提出了有向無環(huán)圖(DAG)計算模型,核心思想是基于MapReduce計算框架,將Map和Reduce兩個操作進一步拆分,分解后的子操作可以任意靈活組合,產(chǎn)生新的操作,這些操作經(jīng)過一些控制程序組裝后,可形成一個大的DAG作業(yè)。這樣能夠大幅度提升數(shù)據(jù)計算速度。ApacheTez就是最早出現(xiàn)的DAG模型之一。

DAG預先給程序設定了一個執(zhí)行流程指示圖,形成管道化作業(yè)。程序不需要每步執(zhí)行完耗時等待下步如何執(zhí)行。舉個列子假設我們要到超市去買菜,我不知道超市在哪里,如果用類似MapReduce的計算模式解決,我們需要等待問路—>走一段—>繼續(xù)等待問路—>再走一段—>經(jīng)過多次等待問路后最終可以到達超市。中間過程充滿了等待時間,速度肯定慢。如果用類似DAG的計算模式解決,我們在去超市的開始就有人給我們繪制了一張地圖,告訴你怎么走,你可以按照地圖指示一步步走到超市,而中間過程不必有等待時間去問路,這樣速度肯定快。任務5-1初識大數(shù)據(jù)計算框架Tez把Map和Reduce進一步拆分為很多子操作,這樣可以表達所有復雜的Map和Reduce操作。一個Tez任務的執(zhí)行由輸入、執(zhí)行、輸出三個階段組成。任務5-1初識大數(shù)據(jù)計算框架

下圖為MapReduce和Tez執(zhí)行流程對比,從圖中可以看出,Tez在數(shù)據(jù)計算時可以將多個有依賴的任務轉(zhuǎn)換為一個任務,從而提升數(shù)據(jù)計算性能。

Tez利用DAG機制解決了MapReduce的計算延遲高的第一個問題,增強了數(shù)據(jù)計算任務執(zhí)行流程的銜接性,大幅度提升了數(shù)據(jù)計算的速度。但是對于問題2仍然沒有解決方案,所以大數(shù)據(jù)計算速度仍具有進一步提升的空間。任務5-1初識大數(shù)據(jù)計算框架

3)SparkSpark由加州大學伯克利分校AMP實驗室開發(fā)。Spark借鑒了DAG的機制同時又提出了基于內(nèi)存的分布式存儲抽象模型RDD(ResilientDistributedDatasets,可恢復分布式數(shù)據(jù)集),把中間數(shù)據(jù)有選擇地加載并保存到內(nèi)存中,只有內(nèi)存放不下時數(shù)據(jù)才寫入磁盤,極大的提高了計算性能,特別是在迭代計算的場合,這種計算模式減少大量的磁盤IO開銷。Spark完美解決了MapReduce的延遲高的第二個問題。使用Spark進行數(shù)據(jù)計算時,一般只需要進行2次磁盤I/O讀寫,即在計算開始階段從磁盤讀取數(shù)據(jù),在計算全部結(jié)束后把結(jié)果寫入磁盤。這種計算模式非常適用于迭代計算和數(shù)據(jù)挖掘。在迭代計算中,Spark和MapReduce計算過程對比如下圖所示。與MapReduce相比,Spark的運算效率要快100倍以上。任務5-1初識大數(shù)據(jù)計算框架任務5-1初識大數(shù)據(jù)計算框架

基于Spark批處理功能,Spark演化出一系列的組件,滿足不同大數(shù)據(jù)計算應用場景需求,這些組件共同構(gòu)成了Spark生態(tài)系統(tǒng)。例如,專門用來做流計算的組件SparkStreaming,用來做交互查詢分析的組件SparkSQL,用來做圖計算的組件GraphX,用來做機器學習的組件MLLIB等。Spark的宗旨就是“一個軟件棧滿足所有應用場景”。Spark可以搭建在Hadoop平臺之上,完美兼容Hadoop生態(tài)系統(tǒng)組件,比如HBase、Hive、HDFS、Yarn、Zookeeper等。目前,Spark已經(jīng)成為第三代大數(shù)據(jù)計算框架的代表技術(shù)。任務5-1初識大數(shù)據(jù)計算框架Spark整個架構(gòu)包括集群資源管理器(ClusterManager)、運行作業(yè)任務的工作節(jié)點(WorkerNode)、每個應用的任務控制節(jié)點(Driver)和每個工作節(jié)點上負責具體任務的執(zhí)行進程(Executor)。任務5-1初識大數(shù)據(jù)計算框架

Spark運行流程如下。

(1)從客戶端提交任務,創(chuàng)建SparkContext對象。

(2)SparkContext向資源管理器(ClusterManager)申請運行Executor資源,資源管理器選定工作節(jié)點(WorkerNode)并分配資源,啟動Executor進程。

(3)Executor進程向SparkContext申請任務(Task)。

(4)SparkContext將應用程序分發(fā)給Executor.

(5)SparkContext構(gòu)建DAG圖,將大的任務分解成多個小任務,通過任務解析器發(fā)送給Executor運行具體任務。

(6)所有Executor運行完任務后,把結(jié)果統(tǒng)一匯總給SparkContext,客戶端得到計算結(jié)果。任務5-1初識大數(shù)據(jù)計算框架

Spark是基于Scala編程語言實現(xiàn)的,同時也支持Python、Java、R等編程語言來開發(fā)。Spark語法簡潔,代碼實現(xiàn)簡單,比MapReduce代碼量減少了很多,因為Spark為RDD提供了豐富的操作方法,其中不僅包括了map和reduce方法,還有filter、flatMap、groupByKey、reduceByKey、union、join、mapValues、sort、partionBy等用于數(shù)據(jù)轉(zhuǎn)換的操作和count、collect、reduce、lookup、save等用于收集或輸出計算結(jié)果的操作。如果用Spark實現(xiàn)上述詞頻統(tǒng)計案例,則只需要調(diào)用Spark的map和reduceByKey兩個轉(zhuǎn)換操作就可以得到最終結(jié)果,首先通過map操作把原始數(shù)據(jù)轉(zhuǎn)換成鍵值對形式,然后通過reduceByKey操作對所有鍵值對按鍵進行相加操作,代碼量非常少。Spark實現(xiàn)詞頻統(tǒng)計案例的計算過程如下圖。任務5-1初識大數(shù)據(jù)計算框架Spark中的RDD是一個高度受限的內(nèi)存共享模型,是只讀的,只能創(chuàng)建,不能修改。Spark的容錯性能比MapReduce更好。Spark采用記錄日志方式來進行容錯控制,RDD之間的轉(zhuǎn)換操作用記錄日志的方式記錄下來。由于Spark中的RDD只支持粗粒度轉(zhuǎn)換并且只讀,結(jié)合DAG機制使得RDD之間具有父子關(guān)系。當RDD的部分分區(qū)數(shù)據(jù)出錯時,Spark可以通過查看日志,準確定位出錯的RDD分區(qū),并根據(jù)RDD之間的父子關(guān)系圖找到出錯RDD的父RDD分區(qū),并進行重新運算。任務5-1初識大數(shù)據(jù)計算框架2.流計算1)StormStorm是Twitter公司開發(fā)的一個分布式的流計算框架。Storm軟件核心部分使用Clojure開發(fā),外圍部分使用Java開發(fā)。Storm只能用來做流計算,不能用來做批處理。Storm實時性非常高,能夠達到毫秒級的響應,一般用于實時性非常高的場景中,比如實時推薦、實時預警等。Storm編程支持多種語言,比如Java、Python、Clojure等,由于Storm內(nèi)部的多語言協(xié)議,你甚至可以使用任何你熟悉的編程語言來編程。Storm架構(gòu)為主從架構(gòu),主要由一個主節(jié)點(Nimbus)和若干個工作節(jié)點(Supervisor)組成。每個Supervisor上運行了多個任務工作進程(Worker)。Worker可以啟動多個執(zhí)行線程運行Storm的流計算任務(Topology)。一個Topology就是一個有向無環(huán)圖,由一些消息的發(fā)送者(Spout)和消息的處理者(Bolt)組成。任務5-1初識大數(shù)據(jù)計算框架Storm整個架構(gòu)如下圖。任務5-1初識大數(shù)據(jù)計算框架Strom運行流程為:當客戶端向主節(jié)點(Nimbus)提交一個Topology時,Nimbus會對Topology進行調(diào)度。Nimbus根據(jù)Topology所需要的Worker進行分配,將其分配到各個Supervisor的節(jié)點上執(zhí)行。Supervisor啟動工作進程,每個工作進程執(zhí)行topology的一個子集。如果把實時數(shù)據(jù)比作流水,Spout可以理解為一個水龍頭,Bolt就是一個個水處理池。Storm使用Spout從數(shù)據(jù)源拉取數(shù)據(jù),數(shù)據(jù)組成一個元組(Tuple)后轉(zhuǎn)交給Bolt處理單元處理。Bolt接受到Tuple處理完后,可以繼續(xù)交給下一個Bolt處理或停止。這樣數(shù)據(jù)以Tuple的形式一個接一個的往下執(zhí)行,就形成了一個Topology。整個流計算處理過程就是實時數(shù)據(jù)不斷地執(zhí)行Topology任務處理的過程。任務5-1初識大數(shù)據(jù)計算框架2)SparkStreamingSparkStreaming是Spark核心API的一個擴展,是一個準實時的流計算框架。SparkStreaming準實時的流計算流程如圖5-13所示。從圖中我們可以看出,SparkStreaming將接收到的實時流數(shù)據(jù),按照一定時間間隔(一般為1秒)對數(shù)據(jù)進行拆分,然后將拆分的數(shù)據(jù)交給Spark進行批處理計算,最終得到計算結(jié)果。SparkStreaming的底層仍然是批處理操作,只是時間間隔很短,一般稱為微批處理操作。SparkStreaming不是完全實時流計算框架,只能算作準實時的流計算框架,但是這并不妨礙SparkStreaming的廣泛應用,因為80%實時流計算場景對實時性要求能達到秒級就了,SparkStreaming完全滿足。只有少數(shù)實時要求非常高的場景,才需要達到毫秒級,那就需要用Strom或者其他流計算框架。任務5-1初識大數(shù)據(jù)計算框架SparkStreaming在內(nèi)部把輸入實時數(shù)據(jù)按照時間切片(如1秒)分成一段一段,每個切片數(shù)據(jù)內(nèi)部是連續(xù)的(連續(xù)數(shù)據(jù)流),而切片之間的數(shù)據(jù)卻是相互獨立的(離散數(shù)據(jù)流)。每個切片被稱為一個DStream,每個DStream被看作是包含一組RDD的序列。任何對DStream的操作都會轉(zhuǎn)變?yōu)閷Φ讓覴DD的批處理操作。任務5-1初識大數(shù)據(jù)計算框架

在傳統(tǒng)數(shù)據(jù)存儲中,一個數(shù)據(jù)文件是存儲在單臺服務器的磁盤中,但是當數(shù)據(jù)文件存儲所需磁盤空間大于這臺服務器的磁盤空間時,怎么辦?

方案1:給這臺服務器加磁盤。這只能解決燃眉之急,如果后續(xù)又有大容量數(shù)據(jù)文件要存儲,是不是還要繼續(xù)加磁盤,服務器的體積是有限的,磁盤數(shù)量不可能無限制的增加下去,最終會達到一個瓶頸。

方案2:增加服務器數(shù)量。用遠程共享目錄的方式提供數(shù)據(jù)文件的網(wǎng)絡化的存儲,把不同數(shù)據(jù)文件放入不同的機器中,如果存儲空間不足,可繼續(xù)加服務器數(shù)量,從理論上來說隨著服務器數(shù)量增加,存儲空間可以無限擴大。綜合上述2個方案,我們看到方案2的優(yōu)勢更大,方案2構(gòu)建了一個數(shù)據(jù)文件分布式存儲的雛形,這就是早期的分布式文件系統(tǒng)。這種分布式文件系統(tǒng)能夠解決大容量的數(shù)據(jù)存儲問題,但是在使用中也暴露出一些問題。任務5-2初識大數(shù)據(jù)存儲5.2.1分布式文件系統(tǒng)

問題1:服務器集群負載不均衡。如果某個數(shù)據(jù)文件是熱門文件,有很多用戶經(jīng)常讀取這個文件,假設某一臺服務器存儲了這個文件,那么,這臺服務器的負載將會很高,而其他服務器沒有什么壓力。這就造成了各服務器的負載不均衡,降低了整個服務器集群資源利用率。

問題2:數(shù)據(jù)可靠性低,安全性差。如果某個文件所在的機器出現(xiàn)故障,那么這個文件就不損壞了,會造成數(shù)據(jù)丟失。

問題3:文件管理維護困難。假設有100臺服務器,如果需要人工去管理文件,安排每個文件的存放位置。那么工作量非常大。因此,我們需要一種工具來管理自動管理多臺機器上的數(shù)據(jù)文件的存儲,并具有容錯機制,同時能夠解決負載均衡問題,這個工具就是分布式文件系統(tǒng)(HDFS)。任務5-2初識大數(shù)據(jù)存儲HDFS來源于谷歌的GFS文件系統(tǒng),由Java語言編寫,是Hadoop生態(tài)系統(tǒng)的兩大核心組件之一。HDFS可讓多臺機器上的多用戶分享數(shù)據(jù)文件和底層存儲空間。HDFS解決了傳統(tǒng)分布式文件系統(tǒng)的上述3個問題。

解決方案1:為了解決存儲結(jié)點負載不均衡的問題,HDFS把一個大文件分割成多個小文件,然后再把這些小文件分別存儲在不同服務器上。外界要讀取文件時,需要從各個服務器同時讀取小文件,最終合并成一個大文件。讀取文件的壓力不會全部集中在一臺服務器上,而是分布在多個服務器上。這樣可以避免對某熱點文件的頻繁讀取帶來的單機負載過高的問題。

解決方案2:對于容錯問題的解決,HDFS會把分割形成的每個小文件進行多個備份,存儲在不同的服務器上,如果某臺服務器壞了,還可以讀取其他服務器上的備份版本。

解決方案3:為了管理存儲文件,HDFS由一個主節(jié)點(NameNode)記錄維護文件存儲的元數(shù)據(jù),比如,HDFS中那個目錄存了哪些文件,文件被分成了哪些塊,每個塊被放在哪臺服務器上等。HDFS提供了豐富的文件操作命令供用戶使用,管理員只需要把文件利用HDFS相關(guān)命令上傳,HDFS會自動對文件進行分割存儲,不需要管理員去了解底層存儲機制。任務5-2初識大數(shù)據(jù)存儲HDFS可以運行在通用硬件平臺上,利用HDFS我們可以構(gòu)建一個廉價的分布式存儲集群。HDFS的設計思想是“分而治之”,即將大文件和大批量數(shù)據(jù)文件分布式存儲在大量獨立的服務器上。HDFS要求數(shù)據(jù)集“一次寫入、多次查詢”,每次查詢都將涉及該數(shù)據(jù)集的大部分數(shù)據(jù)甚至全部數(shù)據(jù),因此延遲較高,多應用在一些實時性和交互性要求不高的場合,比如海量歷史日志數(shù)據(jù)的存儲查詢分析。HDFS適合存儲大容量數(shù)據(jù)文件,對于大量小文件的存儲,HDFS優(yōu)勢并不明顯。HDFS架構(gòu)為主從架構(gòu),HDFS集群擁有一個主節(jié)點(NameNode)和若干個從節(jié)點(DataNode)。NameNode管理文件系統(tǒng)的元數(shù)據(jù),DataNode存儲實際的數(shù)據(jù)。當用戶需要獲取文件時,通過Client向NameNode獲取文件存儲的元數(shù)據(jù),知道文件的存儲位置。然后和相關(guān)的DataNode進行文件的I/O讀取。任務5-2初識大數(shù)據(jù)存儲HDFS可以運行在通用硬件平臺上,利用HDFS我們可以構(gòu)建一個廉價的分布式存儲集群。HDFS的設計思想是“分而治之”,即將大文件和大批量數(shù)據(jù)文件分布式存儲在大量獨立的服務器上。HDFS要求數(shù)據(jù)集“一次寫入、多次查詢”,每次查詢都將涉及該數(shù)據(jù)集的大部分數(shù)據(jù)甚至全部數(shù)據(jù),因此延遲較高,多應用在一些實時性和交互性要求不高的場合,比如海量歷史日志數(shù)據(jù)的存儲查詢分析。HDFS適合存儲大容量數(shù)據(jù)文件,對于大量小文件的存儲,HDFS優(yōu)勢并不明顯。HDFS架構(gòu)為主從架構(gòu),HDFS集群擁有一個主節(jié)點(NameNode)和若干個從節(jié)點(DataNode)。NameNode管理文件系統(tǒng)的元數(shù)據(jù),DataNode存儲實際的數(shù)據(jù)。當用戶需要獲取文件時,通過Client向NameNode獲取文件存儲的元數(shù)據(jù),知道文件的存儲位置。然后和相關(guān)的DataNode進行文件的I/O讀取。HDFS解決了大數(shù)據(jù)下的數(shù)據(jù)存儲問題,但是HDFS只提供了對文件的操作,如果要對文件內(nèi)部的數(shù)據(jù)進行一些操作,比如對數(shù)據(jù)的增刪改查,HDFS并沒有提供相關(guān)的命令,需要我們編寫專門的應用程序才能實現(xiàn)。要實現(xiàn)對數(shù)據(jù)的增刪改查,我們想到了數(shù)據(jù)庫這個工具,比如常見的關(guān)系數(shù)據(jù)庫。但是在大數(shù)據(jù)時代,面對快速增長的數(shù)據(jù)規(guī)模和日漸復雜的數(shù)據(jù)模型,關(guān)系型數(shù)據(jù)庫已無法滿足需求。問題主要體現(xiàn)在以下幾點:

問題1:關(guān)系數(shù)據(jù)庫無法滿足海量數(shù)據(jù)的高效率存儲和訪問。

問題2:關(guān)系數(shù)據(jù)庫擴展性有限。傳統(tǒng)關(guān)系數(shù)據(jù)庫部署一般為單節(jié)點部署,如果數(shù)據(jù)量劇增,可以采用縱向擴充,加CPU、加磁盤、加內(nèi)存,但是終有盡頭。如果采用橫向擴展,關(guān)系數(shù)據(jù)庫很難通過增加服務器結(jié)點來擴展性能和提高負載能力??v使實現(xiàn)了,還有下面的問題3存在。

問題3:關(guān)系數(shù)據(jù)庫無法存儲和處理半結(jié)構(gòu)化和非結(jié)構(gòu)化數(shù)據(jù)。任務5-2初識大數(shù)據(jù)存儲5.2.2NoSQL數(shù)據(jù)庫

綜上,我們需要一種易擴展、大數(shù)據(jù)量、高性能和靈活數(shù)據(jù)模型的數(shù)據(jù)庫來進行海量的數(shù)據(jù)存儲和查詢,這種數(shù)據(jù)庫叫做非關(guān)系(NoSQL)數(shù)據(jù)庫。NoSQL數(shù)據(jù)庫采用的數(shù)據(jù)模型不同于關(guān)系數(shù)據(jù)庫模型,關(guān)系數(shù)據(jù)庫數(shù)據(jù)模型是結(jié)構(gòu)化的行和列,而NoSQL數(shù)據(jù)庫數(shù)據(jù)模型采用的是類似鍵值、列族、文檔等的非關(guān)系模型。同時NoSQL數(shù)據(jù)庫弱化了關(guān)系型數(shù)據(jù)庫的4大原則,即數(shù)據(jù)的原子性、一致性、隔離性、和持久性。

在數(shù)據(jù)存儲方面,關(guān)系型數(shù)據(jù)庫中的表都是存儲一些格式化的數(shù)據(jù)結(jié)構(gòu),關(guān)系型數(shù)據(jù)庫中每條記錄(行)稱為元組。每個元組的字段(列)的組成都一樣,即使有一些元組不需要某些字段,但數(shù)據(jù)庫依然會為每個元組分配所有的字段。而NoSQL數(shù)據(jù)庫數(shù)據(jù)存儲不需要固定的表結(jié)構(gòu),每一個元組可以有不一樣的字段,每個元組可以根據(jù)需要增加一些自己的鍵值對。這樣數(shù)據(jù)的存儲結(jié)構(gòu)就不固定,可以滿足對非結(jié)構(gòu)化數(shù)據(jù)和半結(jié)構(gòu)化數(shù)據(jù)的存儲,同時也可以減少一些時間和空間的開銷。由于數(shù)據(jù)結(jié)構(gòu)不固定,數(shù)據(jù)之間無關(guān)系,導致NoSQL數(shù)據(jù)庫非常容易擴展,增強了數(shù)據(jù)庫的橫向擴展能力。任務5-2初識大數(shù)據(jù)存儲NoSQL數(shù)據(jù)庫種類繁多,歸結(jié)起來,可以劃分為4種類型,分別是鍵值數(shù)據(jù)庫、列式數(shù)據(jù)庫、文檔數(shù)據(jù)庫和圖形數(shù)據(jù)庫。任務5-2初識大數(shù)據(jù)存儲NoSQL數(shù)據(jù)庫類型類型特點產(chǎn)品代表鍵值數(shù)據(jù)庫數(shù)據(jù)存儲為key-value形式,使用哈希表存儲數(shù)據(jù),數(shù)據(jù)查詢時通過表中的Key(鍵)用來定位Value(值)Value可以用來存儲任意類型的數(shù)據(jù),包括整型、字符型、數(shù)組、對象等。Redis列式數(shù)據(jù)庫數(shù)據(jù)按列存儲,每行列數(shù)可變,方便存儲結(jié)構(gòu)化和半結(jié)構(gòu)化數(shù)據(jù)。列可以單獨存儲,方便做數(shù)據(jù)壓縮,對針對某一列或者某幾列的查詢具有速度優(yōu)勢Hbase、Cassandra、Hypertable文檔數(shù)據(jù)庫文檔數(shù)據(jù)庫主要用于存儲和檢索文檔數(shù)據(jù),文檔數(shù)據(jù)庫通過鍵來定位一個文檔。在文檔數(shù)據(jù)庫中,文檔是數(shù)據(jù)庫的最小單位。文檔格式包括XML、JSON等,也可以使用二進制格式,如PDF、Office文檔等。一個文檔可以包含復雜的數(shù)據(jù)結(jié)構(gòu),每個文檔可以具有完全不同的結(jié)構(gòu)。MongoDB圖形數(shù)據(jù)庫圖形數(shù)據(jù)庫以圖論為基礎,使用圖作為數(shù)據(jù)模型來存儲數(shù)據(jù),圖形數(shù)據(jù)庫適用于保存和處理高度相互關(guān)聯(lián)的數(shù)據(jù),適用于社交網(wǎng)絡、依賴分析、模式識別、推薦系統(tǒng)、路徑尋找等場景Neo4JHBase是基于Hadoop的面向列的NoSQL數(shù)據(jù)庫,前身是谷歌的BigTable,屬于Hadoop生態(tài)系統(tǒng)的一個組件。HBase的出現(xiàn)解決了HDFS存儲數(shù)據(jù)無法進行實施查詢計算的問題,HBase構(gòu)建在HDFS之上,數(shù)據(jù)的底層存儲仍然采用HDFS。本項目的數(shù)據(jù)存儲就選用HBase數(shù)據(jù)庫。HBase是一個稀疏、多維度、有序的映射表。HBase的數(shù)據(jù)存儲模式如下表所示。從表中可以看出,HBase的數(shù)據(jù)存儲在數(shù)據(jù)單元中,每個數(shù)據(jù)單元通過行鍵、列簇、列限定符和時間戳共同組成的索引來標識的。每個單元的值是一個未經(jīng)解釋的字符串,沒有數(shù)據(jù)類型。HBase中的每一行由一個唯一的行鍵和一個或多個列簇組成,一個列簇中可以包含任意多個列。在一張表中,每行所包含的列簇是相同的,但是每個列簇中列的個數(shù)可以不同,列簇支持動態(tài)擴展,可以隨時添加新的列。因此對于整個映射表的每行數(shù)據(jù)而言,有些列的值為空。所以,HBase的是稀疏的,這非常方便存儲非結(jié)構(gòu)化數(shù)據(jù)和半結(jié)構(gòu)化數(shù)據(jù)。任務5-2初識大數(shù)據(jù)存儲5.2.3HBase簡介HBase的數(shù)據(jù)存儲模式行鍵時間戳列簇"n.www"t3contents:html=”<html>...”t2contents:html=”<html>...”t1contents:html=”<html>...”"n.www"t5anchor:=”CNN”t4anchor:my.look.ca=”CNN.com”

對HBase數(shù)據(jù)的操作只有新增,刪除和查詢,沒有更新操作,這和HBase的底層仍然用HDFS存儲有關(guān),HDFS為保證數(shù)據(jù)讀取的吞吐量,實行“一次寫,多次讀”的原則。不允許在原有數(shù)據(jù)上更新。如果外界傳輸了新的數(shù)據(jù)進來,HBase并不會刪除該數(shù)據(jù)舊的版本,而是生成一個新的版本并加上時間戳,數(shù)據(jù)原有的版本仍然保留。在應用中,用戶可以對保留的版本數(shù)量進行設置。在查詢數(shù)據(jù)時,用戶可以自定義選擇獲取離某個時間點最近版本的數(shù)據(jù),或者一次獲取數(shù)據(jù)的所有版本。如果不給定時間戳,那么查詢得到的是離當前時間最近的那一個版本的數(shù)據(jù)。任務5-2初識大數(shù)據(jù)存儲HBase數(shù)據(jù)如何存放在HDFS上呢?假設有一張表,HBase會根據(jù)行鍵的值對該表中的行進行分區(qū),每個行區(qū)間構(gòu)成一個分區(qū)(Region),分區(qū)內(nèi)包含了位于這個行區(qū)間內(nèi)的所有數(shù)據(jù)。默認一張表的初始分區(qū)數(shù)為2個,隨著表中數(shù)據(jù)不斷增加,Region不斷增大,當增大到超過閾值的時候,一個Region就會分為兩個Region。表中的行越來越多,Region就越來越多。這么多Region需要一個“管家”來管理,這個管家就是RegionServer。RegionServer的管理原則為每個RegionServer負責管理一個或多個Region。不同的Region可以分布在不同的RegionServer上,但一個Region不會拆分到多個RegionServer上。任務5-2初識大數(shù)據(jù)存儲Region并不是數(shù)據(jù)存儲的最小單元。Region往下還可以細分,每個Region又由一個或者多個Store組成,每個Store保存一個列族的數(shù)據(jù)。每個Store又由一個MemStore和零或多個StoreFile組成,StoreFile以文件格式保存在HDFS上。任務5-2初識大數(shù)據(jù)存儲

由于HBase架構(gòu)在HDFS之上,所以HBase也是主從架構(gòu)。HBase集群架構(gòu)如下圖所示,整個架構(gòu)主要由Master、RegionServer和Zookeeper組成。Master作為主節(jié)點主要負責表和數(shù)據(jù)的管理工作,包括表的增刪改查和數(shù)據(jù)存儲Region的協(xié)調(diào)分配。RegionServer負責維護Master分配給它的一個或多個Region的數(shù)據(jù)讀寫操作。Zookeeper主要負責實時監(jiān)控RegionServer的狀態(tài),并上報給Master。這樣,Master就可以隨時知道各個RegionServer的工作狀態(tài),進行統(tǒng)一管理。任務5-2初識大數(shù)據(jù)存儲環(huán)境搭建步驟包含5.3.1安裝HBase并配置5.3.2安裝Spark并配置教材中任務5-3中有詳細實現(xiàn),這里不做展示任務5-3搭建Spark和HBase開發(fā)環(huán)境

安裝和使用ScalaIDEForEclipse步驟如下:

(1)把scala-SDK-4.7.0-vfinal-2.12-linux.gtk.x86_64.tar.gz文件拷貝到目錄/home/person/soft下,在soft文件夾下空白區(qū)域點擊右鍵,選擇在“終端打開”,打開命令行終端,命令行終端當前目錄就是soft目錄。輸入命令:sudotar-zxvfscala-SDK-4.7.0-vfinal-2.12-linux.gtk.x86_64.tar.gz-C/usr/local,將壓縮包解壓到/usr/local目錄下。任務5-4編寫Spark應用程序并提交集群運行5.4.1Linux下安裝和配置ScalaIDEForEclipse工具

(2)啟動ScalaIDE。輸入命令cd/usr/local,切換到local目錄下,繼續(xù)輸入命令:./eclipse/eclipse,啟動ScalaIDE。ScalaIDE第一次啟動會彈出如下圖所示界面,讓你設置工作空間,可以自己設定或者按默認設置,點擊“l(fā)aunch”,打開ScalaIDE。任務5-4編寫Spark應用程序并提交集群運行

(3)打開ScalaIDE后,這里需要額外配置一下Maven相關(guān)包的下載路徑,因為Maven相關(guān)包的默認下載路徑是國外網(wǎng)站,速度非常慢,我們改成從國內(nèi)鏡像網(wǎng)站阿里云下載。從圖形界面進入.m2文件夾下,路徑為:/home/person/.m2。注意:m2文件夾為隱藏文件夾,默認看不見,需按ctrl+h鍵才能看到。在.m2文件夾下建立settings.xml文件。在settings.xml文件輸入以下內(nèi)容并保存。任務5-4編寫Spark應用程序并提交集群運行<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)設置Maven的UserSettings為我們自己新建的settings.xml文件。在ScalaIDE點擊window–>preferences。彈出對話框點擊Maven–>UserSettings,點擊UserSettings下方的“browse”按鈕,設置路徑為剛才編寫的settings.xml。設置路徑若看不見隱藏文件,需按ctrl+h鍵才能看到。設置完畢后點擊下方“ApplyandClose”按鈕。任務5-4編寫Spark應用程序并提交集群運行

(1)我們先創(chuàng)建一個Project。在左側(cè)空白區(qū)域右鍵,彈出對話框,依次點擊New–>Project,進入工程選擇界面。任務5-4編寫Spark應用程序并提交集群運行5.4.2ScalaIDE編寫Spark應用程序并打包

(2)在彈出的界面上雙擊Maven文件,選擇MavenProject,點擊“next”。任務5-4編寫Spark應用程序并提交集群運行

(3)進入如圖5-51所示界面,繼續(xù)點擊“next”。任務5-4編寫Spark應用程序并提交集群運行

(4)ScalaIDE自帶Maven插件,但是自帶的Maven插件不能應用到Scala項目。因此需要再下載一個針對Scala的Maven插件。點擊右下角的“AddArchetype”按鈕,添加Maven項目模板。任務5-4編寫Spark應用程序并提交集群運行

(5)在AddArchetype窗口中輸入如下信息,在ArchetypeGroupid欄輸入net.alchim31.maven,在ArchetypeArtifactid欄輸入scala-archetype-simple,在version欄輸入1.6,點擊“ok”。任務5-4編寫Spark應用程序并提交集群運行

(6)等幾秒鐘,我們看到net.alchim31.maven文件已經(jīng)下載好了,選擇它,點擊“next”。任務5-4編寫Spark應用程序并提交集群運行

(7)進入下圖所示界面,在GroupId上填寫opeartehbase,在ArtifactId填寫writedata,點擊“Finish”。這樣就可以創(chuàng)建一個MavenProject。任務5-4編寫Spark應用程序并提交集群運行

(8)創(chuàng)建MavenProject過程需要等一小會,因為要下載Maven的一些jar包。創(chuàng)建完畢以后整個Projcect結(jié)構(gòu)如下圖所示。任務5-4編寫Spark應用程序并提交集群運行

(9)我們看到Projcect左下角有小叉叉,代表有錯誤。查看Scala版本,發(fā)現(xiàn)默認是2.12版本,需要改成2.11版本。在“ScalaLibrarycontainer”上點擊右鍵,點擊“buildPath”,點擊“ConfigurebuildPath”進入配置界面。任務5-4編寫Spark應用程序并提交集群運行

(10)雙擊“ScalaLibrarycontainer”,在彈出的窗口中選擇,latest2.11bundle(dynamic),點擊“Finish”。任務5-4編寫Spark應用程序并提交集群運行

(11)修改完畢后,我們發(fā)現(xiàn)還存在錯誤,錯誤定位在工程src/test/scala文件夾下的specs.scala文件,由于我們不需要用到,右鍵specs.scala,點擊“Delete”直接刪除該文件即可。這時我們發(fā)現(xiàn)不會再報錯了。任務5-4編寫Spark應用程序并提交集群運行

(12)在writedata目錄的src/main/scala下,右鍵operatehba

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論