大數(shù)據(jù)的生命周期分為數(shù)據(jù)獲取(data acquisition)、數(shù)據(jù)存儲(data storage)、數(shù)據(jù)分析(data analysis)以及結(jié)果(result),并且將前述大數(shù)據(jù)處理的三代技術(shù)中相關(guān)的工具映射至數(shù)據(jù)獲取、數(shù)據(jù)存儲和數(shù)據(jù)分析三個(gè)環(huán)節(jié)來進(jìn)行分類討論,詳情如表1-2所示。
▲表1-2 大數(shù)據(jù)處理的典型工具
在數(shù)據(jù)獲取階段,通常涉及從多源異構(gòu)的數(shù)據(jù)源獲取數(shù)據(jù),這些數(shù)據(jù)源可能是批處理數(shù)據(jù)源,也有可能是實(shí)時(shí)流數(shù)據(jù)源;
在數(shù)據(jù)存儲階段,需要對前一階段已經(jīng)獲取到的數(shù)據(jù)進(jìn)行存儲,以便進(jìn)行后續(xù)的分析與處理,常見的存儲方式有磁盤(disk)形式和無盤(diskless)形式。
在數(shù)據(jù)分析階段,針對不同的應(yīng)用需求,會運(yùn)用各類模型和算法來對數(shù)據(jù)進(jìn)行分析與處理。
在表1-2中,三代技術(shù)中不同的處理階段所涉及的工具存在重疊。此外,對于混合計(jì)算技術(shù),其本身同時(shí)涉及批處理技術(shù)和實(shí)時(shí)處理技術(shù),實(shí)現(xiàn)混合計(jì)算模型的技術(shù)也要比單純的批處理技術(shù)和實(shí)時(shí)處理技術(shù)更加復(fù)雜;鑒于混合計(jì)算技術(shù)的上述特點(diǎn),這里不對在數(shù)據(jù)的獲取、存儲與分析方面所涉及的具體工具做特別的劃分。
01 hdfs
hadoop分布式文件系統(tǒng)(hadoop distributed file system,hdfs)目前是apache hadoop項(xiàng)目的一個(gè)子項(xiàng)目,與已有的分布式文件系統(tǒng)有很多相似之處。
此外,作為專門針對商業(yè)化硬件(commodity hardware)設(shè)計(jì)的文件系統(tǒng),hdfs的獨(dú)特之處也很明顯:首先其具有很高的容錯(cuò)性,其次可以部署在較為廉價(jià)的硬件上,最后能夠提供高吞吐量的應(yīng)用數(shù)據(jù)訪問能力。
對于終端用戶而言,hdfs就是一個(gè)傳統(tǒng)的文件系統(tǒng),具有文件和目錄的創(chuàng)建、修改、刪除等常規(guī)操作。
hdfs采用主/從(master/slave)體系結(jié)構(gòu)。單個(gè)hdfs集群僅包含一個(gè)名稱節(jié)點(diǎn)(namenode),其提供元數(shù)據(jù)服務(wù),管理文件系統(tǒng)的命名空間(namespace),并引導(dǎo)用戶對文件的訪問。此外,單個(gè)hdfs集群可以包含多個(gè)數(shù)據(jù)節(jié)點(diǎn)(datanode),數(shù)據(jù)節(jié)點(diǎn)負(fù)責(zé)管理與自身相關(guān)聯(lián)的存儲空間。
hdfs對外給出文件系統(tǒng)的命名空間作為用戶對數(shù)據(jù)進(jìn)行訪存的接口。
在hdfs內(nèi)部,單個(gè)文件通常被分割成多個(gè)塊(block),這些塊存儲在一系列數(shù)據(jù)節(jié)點(diǎn)上。由名稱節(jié)點(diǎn)在整個(gè)hdfs集群的命名空間上執(zhí)行文件和目錄的打開、讀取和關(guān)閉等操作。文件的塊與數(shù)據(jù)節(jié)點(diǎn)之間的映射也是由名稱節(jié)點(diǎn)管理的。數(shù)據(jù)節(jié)點(diǎn)基于名稱節(jié)點(diǎn)的指令來實(shí)施塊的創(chuàng)建、復(fù)制和刪除等。
02 sqoop
sqoop是一個(gè)在hadoop和關(guān)系數(shù)據(jù)庫服務(wù)器之間傳送數(shù)據(jù)的工具,方便大量數(shù)據(jù)的導(dǎo)入導(dǎo)出工作,其支持多種類型的數(shù)據(jù)存儲軟件。
sqoop的核心功能為數(shù)據(jù)的導(dǎo)入和導(dǎo)出。
導(dǎo)入數(shù)據(jù):從諸如mysql、sql server和oracle等關(guān)系數(shù)據(jù)庫將數(shù)據(jù)導(dǎo)入到hadoop下的hdfs、hive和hbase等數(shù)據(jù)存儲系統(tǒng)。 導(dǎo)出數(shù)據(jù):從hadoop的文件系統(tǒng)中將數(shù)據(jù)導(dǎo)出至關(guān)系數(shù)據(jù)庫。
sqoop的一個(gè)顯著特點(diǎn)是可以使用mapreduce將數(shù)據(jù)從傳統(tǒng)的關(guān)系數(shù)據(jù)庫導(dǎo)入到hdfs中。sqoop作為一個(gè)通用性的工具,只需要在一個(gè)節(jié)點(diǎn)上安裝,因此安裝和使用十分便捷。
03 flume
flume是由hadoop生態(tài)系統(tǒng)中著名的軟件公司cloudera于2011年發(fā)布,該軟件能夠支持分布式海量日志的采集、集成與傳輸,以實(shí)時(shí)的方式從數(shù)據(jù)發(fā)送方獲取數(shù)據(jù),并傳輸給數(shù)據(jù)接收方。
flume具有兩個(gè)顯著的特點(diǎn):可靠性和可擴(kuò)展性。
針對可靠性,其提供了從強(qiáng)到弱的三級保障,即end-to-end、store on failure和best effort。 針對可擴(kuò)展性,其采用三層的體系結(jié)構(gòu),即agent、collector和storage,每層都可以在水平方向上進(jìn)行擴(kuò)展。
flume以agent的方式運(yùn)行,單個(gè)agent包含source、channel和sink三個(gè)組件,由agent對數(shù)據(jù)進(jìn)行收集,然后交付給存儲機(jī)制。從多個(gè)數(shù)據(jù)源收集到的日志信息依次經(jīng)過上述三個(gè)組件,然后存入hdfs或hbase中。因此,通過flume可以將數(shù)據(jù)便捷地轉(zhuǎn)交給hadoop體系結(jié)構(gòu)。
04 scribe
scribe是由facebook開發(fā)的分布式日志系統(tǒng),在facebook內(nèi)部已經(jīng)得到了廣泛的應(yīng)用。scribe能夠針對位于不同數(shù)據(jù)源的日志信息進(jìn)行收集,然后存儲至某個(gè)統(tǒng)一的存儲系統(tǒng),這個(gè)存儲系統(tǒng)可以是網(wǎng)絡(luò)文件系統(tǒng)(network file system,nfs),也可以是分布式文件系統(tǒng)。
scribe的體系結(jié)構(gòu)由三部分組成:scribe agent、scribe和storage。
第一部分scribe agent為用戶提供接口,用戶使用該接口來發(fā)送數(shù)據(jù)。 第二部分scribe接收由scribe agent發(fā)送來的數(shù)據(jù),根據(jù)各類數(shù)據(jù)所具有的不同topic再次分發(fā)給不同的實(shí)體。 第三部分storage包含多種存儲系統(tǒng)和介質(zhì)。
scribe的日志收集行為只包括主動(dòng)寫入的日志,scribe自身沒有主動(dòng)抓取日志的功能。因此,用戶需要主動(dòng)向scribe agent發(fā)送相關(guān)的日志信息。
05 hbase
hbase的全稱為hadoop database,是基于谷歌bigtable的開源實(shí)現(xiàn),其使用hadoop體系結(jié)構(gòu)中的hdfs作為基本的文件系統(tǒng)。谷歌根據(jù)bigtable的理念設(shè)計(jì)實(shí)現(xiàn)了谷歌文件系統(tǒng)gfs,但是該方案未開源。hbase可以稱為bigtable的山寨版,是開源的。
hbase在hadoop體系結(jié)構(gòu)中的位置介于hdfs和mapreduce之間,其架構(gòu)為主/從形式,內(nèi)部的兩個(gè)核心構(gòu)件為master和regionserver。
hbase是建立在hdfs之上的分布式面向列的數(shù)據(jù)庫,能夠針對海量結(jié)構(gòu)化數(shù)據(jù)實(shí)現(xiàn)隨機(jī)的實(shí)時(shí)訪問,其設(shè)計(jì)理念和運(yùn)行模式都充分利用了hdfs的高容錯(cuò)性。
由于hbase是面向列的,因此它在數(shù)據(jù)庫的表中是按照行進(jìn)行排序的。在hbase中,所有的存儲內(nèi)容都是字節(jié),任何要存儲的內(nèi)容都需要先轉(zhuǎn)換成字節(jié)流的形式,此外數(shù)據(jù)庫的行鍵值按照字節(jié)進(jìn)行排序,同時(shí)形成了索引。
06 mapreduce
mapreduce是hadoop體系結(jié)構(gòu)中極為重要的核心構(gòu)件之一。作為一個(gè)分布式的并行計(jì)算模型,mapreduce包含的兩個(gè)單詞分別具有特定的含義:“map”表示“映射”;“reduce”表示“歸約”。上述兩個(gè)概念的基本理念源于函數(shù)式編程語言(functional programming language)。
與傳統(tǒng)的編程語言不同,函數(shù)式編程語言是一類非馮諾依曼式的程序設(shè)計(jì)語言,其編程范式的抽象程度很高,主要由原始函數(shù)、定義函數(shù)和函數(shù)型構(gòu)成。
mapreduce的這種設(shè)計(jì)思想使分布式并行程序設(shè)計(jì)的難度得以簡化,用戶將已有的代碼稍加修改就能夠運(yùn)行在分布式環(huán)境下。在實(shí)際應(yīng)用場景中,大多數(shù)情況下收集到的大量多源異構(gòu)數(shù)據(jù)都不具有特定的規(guī)律和特征。
mapreduce的工作過程能夠在一定程度上將上述數(shù)據(jù)按照某種規(guī)律進(jìn)行歸納和總結(jié)。在“map”階段,通過指定的映射函數(shù)提取數(shù)據(jù)的特征,得到的結(jié)果的形式為鍵值對 。在“reduce”階段,通過指定的歸約函數(shù)對“map”階段得到的結(jié)果進(jìn)行統(tǒng)計(jì)。對于不同的具體問題,所需要的歸約函數(shù)的個(gè)數(shù)可能千差萬別。
總體來說,mapreduce具有開發(fā)難度低、擴(kuò)展性強(qiáng)和容錯(cuò)性高三個(gè)顯著特點(diǎn)。盡管其分布式并行計(jì)算模型能大幅度提高海量數(shù)據(jù)的處理速度,但受限于大數(shù)據(jù)的規(guī)模,通常mapreduce的作業(yè)例程的執(zhí)行時(shí)間為分鐘級,隨著數(shù)據(jù)量的增加,耗時(shí)若干天也很普遍。
07 hive
hive針對數(shù)據(jù)倉庫來提供類似sql語句的查詢功能,其能夠?qū)⒁越Y(jié)構(gòu)化形式存儲的數(shù)據(jù)映射成數(shù)據(jù)庫表,主要應(yīng)用場景為多維度數(shù)據(jù)分析和海量結(jié)構(gòu)化數(shù)據(jù)離線分析。hive的體系結(jié)構(gòu)主要包含用戶接口、元數(shù)據(jù)存儲、解釋器、編譯器、優(yōu)化器和執(zhí)行器。
雖然使用mapreduce也能夠?qū)崿F(xiàn)查詢,但是對于邏輯復(fù)雜度高的查詢,用戶在實(shí)現(xiàn)時(shí)難度較大。hive提供類似于sql的語法接口,降低了學(xué)習(xí)成本,提高了開發(fā)效率。
hive基于sql的語法來定義名為hiveql或hql的查詢語言,其支持常規(guī)的索引化和基本的數(shù)據(jù)查詢,更重要的是能夠?qū)⒒趕ql的查詢需求轉(zhuǎn)化為mapreduce的作業(yè)例程。
除了自身具有的功能之外,用戶可以在hive中編寫自定義函數(shù),具體來說分為三種:
用戶自定義函數(shù)(user defined function,udf) 用戶自定義聚合函數(shù)(user defined aggregation function,udaf) 用戶自定義表生成函數(shù)(user defined table-generating function,udtf)
08 pig
pig是一個(gè)面向過程的高級程序設(shè)計(jì)語言,能夠分析大型數(shù)據(jù)集,并將結(jié)果表示為數(shù)據(jù)流,其內(nèi)置了多種數(shù)據(jù)類型,并且支持元組(tuple)、映射(map)和包(package)等范式。
pig有兩種工作模式:local模式和mapreduce模式。
在local模式下