Hadoop生態(tài)圈
可以把hadoop想象成一個很大的生態(tài)圈(本來就是),或者說想象成一個動物園吧,之后的東西就比較好理解了。(我也不知道為啥python的教程一般都是動物做封面,難道已經(jīng)暗喻加入了動物園生態(tài)圈了?)
HDFS
HDFS(Hadoop Distributed File System)是一個分布式文件系統(tǒng),是谷歌的GFS山寨版本。它具有高容錯性并提供了高吞吐量的數(shù)據(jù)訪問,非常適合大規(guī)模數(shù)據(jù)集上的應用,它提供了一個高度容錯性和高吞吐量的海量數(shù)據(jù)存儲解決方案。
- 高吞吐量訪問:HDFS的每個Block分布在不同的Rack上,在用戶訪問時,HDFS會計算使用最近和訪問量最小的服務器給用戶提供。由于Block在不同的Rack上都有備份,所以不再是單數(shù)據(jù)訪問,所以速度和效率是非常快的。另外HDFS可以并行從服務器集群中讀寫,增加了文件讀寫的訪問帶寬。
- 高容錯性:系統(tǒng)故障是不可避免的,如何做到故障之后的數(shù)據(jù)恢復和容錯處理是至關(guān)重要的。HDFS通過多方面保證數(shù)據(jù)的可靠性,多份復制并且分布到物理位置的不同服務器上,數(shù)據(jù)校驗功能、后臺的連續(xù)自檢數(shù)據(jù)一致性功能都為高容錯提供了可能。
- 線性擴展:因為HDFS的Block信息存放到NameNode上,文件的Block分布到DataNode上,當擴充的時候僅僅添加DataNode數(shù)量,系統(tǒng)可以在不停止服務的情況下做擴充,不需要人工干預。
HDFS架構(gòu)
- NameNode:在Hadoop1.X中只有一個Master節(jié)點,管理HDFS的名稱空間和數(shù)據(jù)塊映射信息、配置副本策略和處理客戶端請求;
- Secondary NameNode:輔助NameNode,分擔NameNode工作,定期合并fsimage和fsedits并推送給NameNode,緊急情況下可輔助恢復NameNode;
- DataNode:Slave節(jié)點,實際存儲數(shù)據(jù)、執(zhí)行數(shù)據(jù)塊的讀寫并匯報存儲信息給NameNode;
MapReduce
MapReduce 是現(xiàn)今一個非常流行的分布式計算框架,它被設計用于并行計算海量數(shù)據(jù)。MapReduce 框架的核心步驟主要分兩部分:Map 和Reduce。當你向MapReduce 框架提交一個計算作業(yè)時,它會首先把計算作業(yè)拆分成若干個Map 任務,然后分配到不同的節(jié)點上去執(zhí)行,每一個Map 任務處理輸入數(shù)據(jù)中的一部分,當Map 任務完成后,它會生成一些中間文件,這些中間文件將會作為Reduce 任務的輸入數(shù)據(jù)。Reduce 任務的主要目標就是把前面若干個Map 的輸出匯總到一起并輸出。從高層抽象來看,MapReduce的數(shù)據(jù)流圖如下圖所示:
MapReduce流程圖
MapReduce工作流程
- 在集群中的任意一個節(jié)點提交MapReduce程序
- JobClient收到作業(yè)后,JobClient向JobTracker請求獲取一個Job ID
- 將運行作業(yè)所需要的資源文件復制到HDFS上(包括MapReduce程序打包的JAR文件、配置文件和客戶端計算所得的輸入劃分信息),這些文件都存放在JobTracker專門為該作業(yè)創(chuàng)建的文件夾中,文件夾名為該作業(yè)的Job ID
- 獲得作業(yè)ID后,提交作業(yè)
- .JobTracker接收到作業(yè)后,將其放在一個作業(yè)隊列里,等待作業(yè)調(diào)度器對其進行調(diào)度,當作業(yè)調(diào)度器根據(jù)自己的調(diào)度算法調(diào)度到該作業(yè)時,會根據(jù)輸入劃分信息為每個劃分創(chuàng)建一個map任務,并將map任務分配給TaskTracker執(zhí)行
- 對于map和reduce任務,TaskTracker根據(jù)主機核的數(shù)量和內(nèi)存的大小有固定數(shù)量的map槽和reduce槽。這里需要強調(diào)的是:map任務不是隨隨便便地分配給某個TaskTracker的,這里有個概念叫:數(shù)據(jù)本地化(Data-Local)。意思是:將map任務分配給含有該map處理的數(shù)據(jù)塊的TaskTracker上,同時將程序JAR包復制到該TaskTracker上來運行,這叫“運算移動,數(shù)據(jù)不移動”
- TaskTracker每隔一段時間會給JobTracker發(fā)送一個心跳,告訴JobTracker它依然在運行,同時心跳中還攜帶著很多的信息,比如當前map任務完成的進度等信息。當JobTracker收到作業(yè)的最后一個任務完成信息時,便把該作業(yè)設置成“成功”。當JobClient查詢狀態(tài)時,它將得知任務已完成,便顯示一條消息給用戶
- 運行的TaskTracker從HDFS中獲取運行所需要的資源,這些資源包括MapReduce程序打包的JAR文件、配置文件和客戶端計算所得的輸入劃分等信息
- TaskTracker獲取資源后啟動新的JVM虛擬機
- 運行每一個任務
補充:
- JobTracker:是一個后臺服務進程,啟動之后,會一直監(jiān)聽并接收來自各個TaskTracker發(fā)送的心跳信息,包括資源使用情況和任務運行情況等信息。在hadoop中每個應用程序被表示成一個作業(yè),每個作業(yè)又被分成多個任務,JobTracker的作業(yè)控制模塊則負責作業(yè)的分解和狀態(tài)監(jiān)控(主要包括TaskTracker狀態(tài)監(jiān)控、作業(yè)狀態(tài)監(jiān)控和任務狀態(tài)監(jiān)控)。
Map過程:
Step1:每個輸入分片會讓一個map任務來處理,默認情況下,以HDFS的一個塊的大?。J為64M)為一個分片,當然我們也可以設置塊的大小。map輸出的結(jié)果會暫且放在一個環(huán)形內(nèi)存緩沖區(qū)中(該緩沖區(qū)的大小默認為100M,由io.sort.mb屬性控制),當該緩沖區(qū)快要溢出時(默認為緩沖區(qū)大小的80%,由io.sort.spill.percent屬性控制),會在本地文件系統(tǒng)中創(chuàng)建一個溢出文件,將該緩沖區(qū)中的數(shù)據(jù)寫入這個文件;
Step2:在寫入磁盤之前,線程首先根據(jù)reduce任務的數(shù)目將數(shù)據(jù)劃分為相同數(shù)目的分區(qū),也就是一個reduce任務對應一個分區(qū)的數(shù)據(jù)。這樣做是為了避免有些reduce任務分配到大量數(shù)據(jù),而有些reduce任務卻分到很少數(shù)據(jù),甚至沒有分到數(shù)據(jù)的尷尬局面。其實分區(qū)就是對數(shù)據(jù)進行hash的過程。然后對每個分區(qū)中的數(shù)據(jù)進行排序,如果此時設置了Combiner,將排序后的結(jié)果進行Combia操作,這樣做的目的是讓盡可能少的數(shù)據(jù)寫入到磁盤;
Step3:當map任務輸出最后一個記錄時,可能會有很多的溢出文件,這時需要將這些文件合并,目的是為了盡量減少每次寫入磁盤的數(shù)據(jù)量和盡量減少下一復制階段網(wǎng)絡傳輸?shù)臄?shù)據(jù)量。
Reduce過程
Step1:Reduce會接收到不同map任務傳來的數(shù)據(jù),并且每個map傳來的數(shù)據(jù)都是有序的。如果reduce端接受的數(shù)據(jù)量相當小,則直接存儲在內(nèi)存中(緩沖區(qū)大小由mapred.job.shuffle.input.buffer.percent屬性控制,表示用作此用途的堆空間的百分比),如果數(shù)據(jù)量超過了該緩沖區(qū)大小的一定比例(由mapred.job.shuffle.merge.percent決定),則對數(shù)據(jù)合并后溢寫到磁盤中;
Step2:隨著溢寫文件的增多,后臺線程會將它們合并成一個更大的有序的文件,這樣做是為了給后面的合并節(jié)省時間。其實不管在map端還是reduce端,MapReduce都是反復地執(zhí)行排序,合并操作;
Step3:合并的過程中會產(chǎn)生許多的中間文件(寫入磁盤了),但MapReduce會讓寫入磁盤的數(shù)據(jù)盡可能地少,并且最后一次合并的結(jié)果并沒有寫入磁盤,而是直接輸入到reduce函數(shù)。
Hive
Hive是Facebook開發(fā)的構(gòu)建于Hadoop集群之上的數(shù)據(jù)倉庫應用,它提供了類似于SQL語法的HQL語句作為數(shù)據(jù)訪問接口,這使得普通分析人員的應用Hadoop的學習曲線變小。
- Hive是基于Hadoop的一個數(shù)據(jù)倉庫工具,可以將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫表,并使用sql語句轉(zhuǎn)換為MapReduce任務進行運行。其優(yōu)點是學習成本低,可以通過類SQL語句快速實現(xiàn)簡單的MapReduce統(tǒng)計,不必開發(fā)專門的MapReduce應用,十分適合數(shù)據(jù)倉庫的統(tǒng)計分析
- Hive是建立在 Hadoop 上的數(shù)據(jù)倉庫基礎構(gòu)架。它提供了一系列的工具,可以用來進行數(shù)據(jù)提取轉(zhuǎn)化加載(ETL),這是一種可以存儲、查詢和分析存儲在 Hadoop 中的大規(guī)模數(shù)據(jù)的機制。Hive 定義了簡單的類 SQL 查詢語言,稱為 HQL,它允許熟悉 SQL 的用戶查詢數(shù)據(jù)。同時,這個語言也允許熟悉 MapReduce 開發(fā)者的開發(fā)自定義的 Mapper 和 Reducer 來處理內(nèi)建的Mapper 和Reducer 無法完成的復雜的分析工作。
HIve架構(gòu)
客戶端組件
- CLI:command line interface,啟動的時候會同時啟動一個Hive副本,Client是Hive的客戶端,用戶連接至Hive Server。在啟動 Client模式的時候,需要指出Hive Server所在節(jié)點,并且在該節(jié)點啟動Hive Server。--hive shell
- WUI:用戶接口,通過瀏覽器訪問Hive。
- JDBC/ODBC:開放的API客戶端。--(java 訪問hive)
服務端組件
- Thrift服務:thrift是facebook開發(fā)的一個軟件框架,它用來進行可擴展且跨語言的服務的開發(fā),Hive集成了該服務,能讓不同的編程語言調(diào)用hive的接口。
- Metastore組件:元數(shù)據(jù)服務組件,這個組件存儲Hive的元數(shù)據(jù),Hive的元數(shù)據(jù)存儲在關(guān)系數(shù)據(jù)庫里,Hive支持的關(guān)系數(shù)據(jù)庫有derby和mysql。元數(shù)據(jù)對于Hive十分重要,因此Hive支持把metastore服務獨立出來,安裝到遠程的服務器集群里,從而解耦Hive服務和metastore服務,保證Hive運行的健壯性。
- Driver組件:該組件包括Complier、Optimizer和Executor,它的作用是將HiveQL(類SQL)語句進行解析、編譯優(yōu)化,生成執(zhí)行計劃,然后調(diào)用底層的mapreduce計算框架。
HBase
Hadoop Database,是一個高可靠性、高性能、面向列、可伸縮的分布式存儲系統(tǒng),利用HBase技術(shù)可在廉價PC Server上搭建起大規(guī)模結(jié)構(gòu)化存儲集群。Google運行MapReduce來處理Bigtable中的海量數(shù)據(jù),HBase同樣利用Hadoop MapReduce來處理HBase中的海量數(shù)據(jù);Google Bigtable利用 Chubby作為協(xié)同服務,HBase利用Zookeeper作為對應。
Pig
一種操作hadoop的輕量級腳本語言,是一種數(shù)據(jù)流語言,用來快速輕松的處理巨大的數(shù)據(jù)。Pig可以非常方便的處理HDFS和HBase的數(shù)據(jù),和Hive一樣,Pig可以非常高效的處理其需要做的,通過直接操作Pig查詢可以節(jié)省大量的勞動和時間。當你想在你的數(shù)據(jù)上做一些轉(zhuǎn)換,并且不想編寫MapReduce jobs就可以用Pig.
Hive .vs Pig
- Hive更適合于數(shù)據(jù)倉庫的任務,Hive主要用于靜態(tài)的結(jié)構(gòu)以及需要經(jīng)常分析的工作。Hive與SQL相似促使 其成為Hadoop與其他BI工具結(jié)合的理想交集。
- Pig賦予開發(fā)人員在大數(shù)據(jù)集領(lǐng)域更多的靈活性,并允許開發(fā)簡潔的腳本用于轉(zhuǎn)換數(shù)據(jù)流以便嵌入到較大的 應用程序。
- Pig相比Hive相對輕量,它主要的優(yōu)勢是相比于直接使用Hadoop Java APIs可大幅削減代碼量。正因為如此,Pig仍然是吸引大量的軟件開發(fā)人員。
- Hive和Pig都可以與HBase組合使用,Hive和Pig還為HBase提供了高層語言支持,使得在HBase上進行數(shù)據(jù)統(tǒng)計處理變的非常簡單.
Hive .vs Hbase
- Hive是建立在Hadoop之上為了減少MapReduce jobs編寫工作的批處理系統(tǒng),HBase是為了支持彌補Hadoop對實時操作的缺陷的項目 。
- 想象你在操作RMDB數(shù)據(jù)庫,如果是全表掃描,就用Hive+Hadoop,如果是索引訪問,就用HBase+Hadoop.
- Hive query就是MapReduce jobs可以從5分鐘到數(shù)小時不止,HBase是非常高效的,肯定比Hive高效的多。
Mahout
Mahout 是 Apache Software Foundation(ASF) 旗下的一個開源項目,提供一些可擴展的機器學習領(lǐng)域經(jīng)典算法的實現(xiàn),旨在幫助開發(fā)人員更加方便快捷地創(chuàng)建智能應用程序。AMahout包含許多實現(xiàn),包括聚類、分類、推薦過濾、頻繁子項挖掘。此外,通過使用 Apache Hadoop 庫,Mahout 可以有效地擴展到云中。
Zookeeper
Zookeeper 作為 Hadoop 項目中的一個子項目,一個分布式的服務框架,主要用來解決分布式集群中應用系統(tǒng)的一致性問題,是 Hadoop 集群管理的一個必不可少的模塊,它主要用來控制集群中的數(shù)據(jù),如它管理 Hadoop 集群中的NameNode,還有 Hbase 中 Master Election、Server 之間狀態(tài)同步等。
Oozie
Oozie是一個工作流引擎服務器,用于運行Hadoop Map/Reduce和Pig 任務工作流.同時Oozie還是一個Java Web程序,運行在Java Servlet容器中,如Tomcat.
最后
至此,hadoop的生態(tài)圈介紹的差不多了,對于想深入的話,這些是遠遠不夠的,我這個只是為了吃早飯的時候,可以看一下,記一下各個部分功能大體,也算是一種初步了解,希望對你也有些幫助
致謝
@yeruby--對MapReduce過程的理解
@石山園--Hadoop入門進階課程5
@石山園--Hadoop入門進階課程8
@lifuxiangcaohui--Hive總結(jié)(九)Hive體系結(jié)構(gòu)
@天戈朱--Hive(一):架構(gòu)及知識體系
@u011308691--Hive初識功能架構(gòu)
@轉(zhuǎn)--JobTracker和TaskTracker概述
@zhoubl668--Mahout推薦算法API詳解
@轉(zhuǎn)--分布式服務框架 Zookeeper
@清霧沁仙--Hadoop Oozie 學習筆記(六) Hadoop Oozie概述