Hadoop、MapReduce、Hive、HBase、YARN、Spark……初搞大數據的,面對一堆名詞,猶如走進森林,弄得焦頭爛額……別說深入底層架構原理,就連他們之間的區別聯繫,有時候,都搞迷糊……
01那什麼是hadoop呢?
Hadoop是一個開源框架,允許使用簡單的編程模型,在跨計算機集群的分布式環境中,存儲和處理大數據。它的設計是從單個伺服器擴展到數千個機器,每個都提供本地計算和存儲。
Hadoop最底部是 Hadoop Distributed File System(HDFS),它存儲 Hadoop 集群中所有存儲節點上的文件。HDFS的上一層是MapReduce 引擎,該引擎由 JobTrackers 和 TaskTrackers 組成。
Hadoop分布式計算平臺,最核心的是,提供海量數據存儲的HDFS,與提供海量數據計算的MapReduce,以及數據倉庫工具Hive和分布式資料庫Hbase。
Hadoop三大組件:
分布式文件系統:HDFS —— 實現將文件分布式存儲在很多的伺服器上分布式運算編程框架:MapReduce——實現多臺機器的分布式並行運算。分布式資源調度平臺:YARN —— 幫用戶調度大量的mapreduce程序,併合理分配運算資源
02什麼是MapReduce
MapReduce是一種編程模型,是指定一個Map(映射)函數,用來把一組鍵值對,映射成一組新的鍵值對,指定並發的Reduce(歸約)函數,用來保證所有映射的鍵值對中的每一個共享相同的鍵組。
MapReduce核心思想
分而治之,先分後和:將一個大的、複雜的工作或任務,拆分成多個小的任務,並行處理,最終進行合併。
構建抽象模型:Map和Reduce
MapReduce借鑑了函數式語言中的思想,用Map和Reduce兩個函數,提供了高層的並行編程抽象模型。
Map:
對一組數據元素,進行某種重複式的處理([k1,v1] → [(k2,v2)]);
Reduce:
對Map的中間結果,進行某種進一步的結果整理([k2, {v2,…}] → [k3, v3])。
03那什麼是hive呢
hive是基於Hadoop的一個數據倉庫工具,用來進行數據提取、轉化、加載,可以存儲、查詢和分析存儲在Hadoop中的大規模數據的機制。
hive數據倉庫工具能將結構化的數據文件映射為一張資料庫表,並提供SQL查詢功能,能將SQL語句轉變成MapReduce任務來執行。
hive與關係型資料庫的SQL略有不同,但支持了絕大多數的語句如DDL、DML以及常見的聚合函數、連接查詢、條件查詢。
hive提供了很多具有進行數據提取轉化加載,用來存儲、查詢和分析存儲在Hadoop中的大規模數據集,並允許用戶自定義函數插件,包括支持UDF(User-Defined Function)、UDAF(User-Defnes AggregateFunction)和UDTF(User-Defined Table-Generating Function),實現對map和reduce函數的定製,為數據操作提供了良好的伸縮性和可擴展性
元數據存儲
hive 將元數據存儲在資料庫中,如 mysql、derby。hive 中的元數據,包括表的名字,表的列和分區及其屬性,表的屬性(是否為外部表等),表的數據所在目錄等。
解釋器、編譯器、優化器、執行器
解釋器、編譯器、優化器完成HQL 查詢語句,從詞法分析、語法分析、編譯、優化以及查詢計劃的生成。生成的查詢計劃存儲在 HDFS 中,並在隨後由 MapReduce 調用執行。
hive 的數據存儲
在 HDFS 中,大部分的查詢由 MapReduce 完成(不包含 * 的查詢,比如 select * from tbl 不會生成MapReduce 任務)。
數據存儲模型編輯
hive中包含以下四類數據模型:表(Table)、外部表(External Table)、分區(Partition)、桶(Bucket)。
(1) hive中的Table,和資料庫中的Table在概念上是類似的。在hive中每一個Table都有一個相應的目錄存儲數據。
(2)外部表是一個已經存儲在HDFS中,並具有一定格式的數據。使用外部表意味著hive表內的數據,不在hive的數據倉庫內,它會到倉庫目錄以外的位置訪問數據。
外部表和普通表的操作不同:
○建普通表的操作分兩步,即表的創建和數據裝入(可以分開也可以同時完成)。
數據裝入過程中,實際數據會移動到數據表,所在的hive數據倉庫文件目錄中,其後對該數據表的訪問,將直接訪問所對應文件目錄中的數據。
刪除表時,該表的元數據和在數據倉庫目錄下的實際數據將同時刪除。
○外部表的創建只有一個步,創建表和裝入數據同時完成。外部表的實際數據存儲在創建語句。
location參數,指定的外部HDFS文件路徑中,但這個數據並不會移動到hive數據倉庫的文件目錄中。
刪除外部表時,僅刪除其元數據,保存在外部HDFS文件目錄中的數據不會被刪除。
(3)分區對應於資料庫中的分區列的密集索引,但是hive中分區的組織方式,和資料庫中的很不相同。在hive中,表中的一個分區對應於表下的一個目錄,所有的分區的數據都存儲在對應的目錄中。
(4)桶對指定列,進行哈希(hash)計算,會根據哈希值切分數據,目的是為了並行,每一個桶對應一個文件。
(5)分區又分桶
可以對數據表分區之後繼續分桶,但是分區之後繼續分桶,我們在hdfs文件系統上看不出分桶的多個數據表文件,只能看見一個文件,但是能從文件路徑上看出分區的信息。
04那什麼是hbase呢?
HBase是一個高可靠性、高性能、面向列、可伸縮的分布式存儲系統,是一個面向列的資料庫,在表中它由行排序。表模式定義只能列族,也就是鍵值對。一個表有多個列族,以及每一個列族可以有任意數量的列。後續列的值連續存儲在磁碟上。表中的每個單元格值都具有時間戳。
組成部件說明:
Client:
使用HBase RPC機制與HMaster和HRegionServer進行通信。Client與HMaster進行管理類操作。Client與HRegionServer進行數據讀寫類操作。Zookeeper:
Zookeeper Quorum存儲-ROOT-表地址、HMaster地址。HRegionServer把自己以Ephedral方式註冊到Zookeeper中,HMaster隨時感知各個HRegionServer的健康狀況。Zookeeper避免HMaster單點問題。HMaster:
HMaster沒有單點問題,HBase可以啟動多個HMaster,通過Zookeeper的Master Election機制,保證總有一個Master在運行。
主要負責Table和Region的管理工作:
管理用戶對表的增刪改查操作。管理HRegionServer的負載均衡,調整Region分布。Region Split後,負責新Region的分布。在HRegionServer停機後,負責失效HRegionServer上Region遷移。HRegionServer:
HBase中最核心的模塊,主要負責響應用戶I/O請求,向HDFS文件系統中讀寫。
HRegionServer管理一系列HRegion對象;每個HRegion對應Table中一個Region,HRegion由多個HStore組成;每個HStore對應Table中一個Column Family的存儲;Column Family就是一個集中的存儲單元,故將具有相同IO特性的Column放在一個Column Family會更高效。HStore:
HBase存儲的核心。由MemStore和StoreFile組成。MemStore是Stored Memory Buffer。
HLog:
引入HLog原因:在分布式系統環境中,無法避免系統出錯或者宕機,一旦HRegionServer意外退出,MemStore中的內存數據就會丟失,引入HLog就是防止這種情況。
工作機制:
每個HRegionServer中都會有一個HLog對象,HLog是一個實現Write Ahead Log的類,每次用戶操作寫入MemStore的同時,也會寫一份數據到HLog文件,HLog文件定期會滾動出新,並刪除舊的文件(已持久化到StoreFile中的數據)。
當HRegionServer意外終止後,HMaster會通過Zookeeper感知,HMaster首先處理遺留的HLog文件,將不同region的log數據拆分,分別放到相應region目錄下,然後再將失效的region重新分配,領取到這些region的HRegionServer,在Load Region的過程中,會發現有歷史HLog需要處理,因此會Replay HLog中的數據到MemStore中,然後flush到StoreFiles,完成數據恢復。
hbase具體操作使用
在HBase中,namespace命名空間,是對一組表的邏輯分組,類似RDBMS中的database,方便對表在業務上劃分。Apache HBase從0.98.0,0.95.2兩個版本開始支持namespace級別的授權操作,HBase全局管理員可以創建、修改和回收namespace的授權。
HBase系統默認定義了兩個預設的namespace:
hbase:系統內建表,包括namespace和meta表。default:用戶建表時,未指定namespace的表都創建在此。命令的進退
hbase的一般操作
1、查看HBase運行狀態 status
2、創建表 create <table>,{NAME => <family>, VERSIONS => <VERSIONS>}
3、查看所有表 list
4、描述表詳情 describe 'User'
5、判斷表是否存在 exists 'User'
6、啟用或禁用表 is_disabled 'User' is_enabled 'User'
7、添加記錄,即插入數據,語法:put <table>,<rowkey>,<family:column>,<value>
8、根據rowKey查詢某個記錄,語法:get <table>,<rowkey>,[<family:column>, ...]
9、查詢所有記錄,語法:scan <table>,{COLUMNS => [family:column, ...], LIMIT => num}
另外,還可以添加TIMERANGE和FILTER等高級功能,STARTROW、ENDROW必須大寫,否則報錯,查詢結果不包含等於ENDROW的結果集。
10、統計表記錄數,語法:count <table>, {INTERVAL => intervalNum,CACHE => cacheNum}
INTERVAL設置多少行顯示一次及對應的rowkey,默認1000;CACHE每次去取的緩存區大小,默認是10,調整該參數可提高查詢速度。
hbase的刪除操作
hbase批量命令
bulkload為hbase的批量插入命令,應用於大數據量的插入,沒有性能問題。
bulkload應用
業務場景:Hive離線計算好的數據,需要同步到HBase供在線業務查詢,思路是用HBase自帶的ImportTsv工具。
Hive跑批:
建表語句,要用文本格式,即Tsv格式,分割符可以自己定義:
跑批語句,注意設置不要compress,否則ImportTsv工具無法識別。
生成中間的HFile。
說明:config_dir是hbase的配置目錄,裡面包含hbase-site.xml,這個步驟ImportTsv會去讀取hive_table_dir中的文件,並分析hbase table的region分布,生成對應region的hfile,放到hfile_path中。
hbase中的ImportTsv與bulkload對比說明:
Hive表必須是帶分隔符的文本格式,而且不能壓縮(比如啟用了mapreduce的output snappy壓縮也不行)。ImportTsv可以直接一條條插入hbase,這時mapper解析一條,就插入一條,沒有reduce階段;相比bulkload,大批量數據性能不好。bulkload的優點是快,生成的hfile直接註冊到region server,數據對應用立即可見,沒有wal log,沒有flush。
05那什麼是YARN呢
Apache Hadoop YARN (Yet Another Resource Negotiator,另一種資源協調者)是一種新的 Hadoop 資源管理器,它是一個通用資源管理系統,可為上層應用提供統一的資源管理和調度,它的引入為集群在利用率、資源統一管理和數據共享等方面帶來了巨大好處。
Container
容器(Container)是 Yarn對資源做的一層抽象,對底層進行封裝,只提供給上層一個調用接口。
如上所示,Yarn 將CPU核數,內存這些計算資源都封裝成為一個個的容器(Container)。需要注意兩點:
容器由 Node Manager 啟動和管理,並被它所監控。容器被 Resource Manager 進行調度。Resource Manager
最中央的那個 ResourceManager(RM)。顧名思義,是負責資源管理的,整個系統有且只有一個 RM,來負責資源的調度。它也包含了兩個主要的組件:定時調用器(Scheduler)以及應用管理器(Application Manager)。
應用管理器(Application Manager)
顧名思義,應用管理器,就是負責管理 Client 用戶提交的應用。定時調度器(Scheduler)不對用戶提交的程序監控,監控應用的工作,正是由應用管理器(Application Manager)完成的。
每當 Client 提交一個 Application 時候,就會新建一個Application Master 。由這個 Application Master ,去與 Resource Manager申請容器資源,獲得資源後,會將要運行的程序,發送到容器上啟動,然後進行分布式計算。
為什麼是把運行程序發送到容器上去運行?
如果以傳統的思路來看,是程序運行著不動,然後數據進進出出不停流轉。但當數據量大的時候就沒法這麼玩了,因為海量數據移動成本太大,時間太長。
提交一個 Application 到 Yarn 的流程
但是中國有一句老話山不過來,我就過去。
大數據分布式計算就是這種思想,既然大數據難以移動,那就把容易移動的應用程式,發布到各個節點進行計算,這就是大數據分布式計算的思路。
Node Manager
Node Manager 是 Resource Manager 在每臺機器的上代理,負責容器的管理,並監控他們的資源使用情況(cpu,內存,磁碟及網絡等),以及向 Resource Manager / Scheduler 提供這些資源使用報告。
06那什麼是spark呢?
Spark 是一個用來實現快速,而通用的集群計算的平臺。
在速度方面,Spark 擴展了廣泛使用的 MapReduce 計算模型,而且高效地支持更多計算模式,包括交互式查詢和流處理。在處理大規模數據集時,速度快就意味著,可以進行交互式的數據操作,否則每次操作就需要等待數分鐘甚至數小時。
Spark 的一個主要特點就是能夠在內存中進行計算,因而更快。不過即使是,必須在磁碟上進行的複雜計算,Spark 依然比MapReduce 更加高效。
總的來說,Spark 適用於各種各樣,原先需要多種不同的分布式平臺的場景,包括批處理、迭代算法、交互式查詢、流處理。
通過在一個統一的框架下,支持這些不同的計算,Spark可以簡單而低耗地把各種處理流程整合在一起,大大減輕了原先需要對各種平臺分別管理的負擔。
Spark 所提供的接口非常豐富。除了提供基於 Python、Java、Scala 和 SQL 的簡單易用的API 以及內建的豐富的程序庫以外,Spark 還能和其他大數據工具密切配合使用。例如,Spark 可以運行在 Hadoop 集群上,訪問包括 Cassandra 在內的任意 Hadoop 數據源。
Spark 以其先進的設計理念,迅速成為社區的熱門項目,圍繞著 Spark 推出了 SparkSQL、SparkStreaming、MLlib 和 GraphX 等組件,逐漸形成大數據處理一站式解決平臺。
07以上技術棧區別於聯繫
根據 Hadoop MapReduce 的工作流程,可以分析出 Hadoop MapRedcue 的一些缺點。
1)Hadoop MapRedue 的表達能力有限。
所有計算都需要轉換成 Map 和 Reduce 兩個操作,不能適用於所有場景,對於複雜的數據處理過程難以描述。
2)磁碟 I/O 開銷大。
Hadoop MapReduce 要求每個步驟間的數據序列化到磁碟,所以 I/O 成本很高,導致交互分析和迭代算法開銷很大,而幾乎所有的最優化和機器學習都是迭代的。所以,Hadoop MapReduce 不適合於交互分析和機器學習。
3)計算延遲高。
如果想要完成比較複雜的工作,就必須將一系列的 MapReduce 作業,串聯起來,然後順序執行這些作業。每一個作業,都是高時延的,而且只有在前一個作業完成之後,下一個作業才能開始啟動。因此,Hadoop MapReduce 不能勝任比較複雜的、多階段的計算服務。
Spark 是借鑑了 Hadoop MapReduce 技術發展而來的,繼承了其分布式並行計算的優點,並改進了 MapReduce 明顯的缺陷。
Spark 使用Scala 語言進行實現,它是一種面向對象的函數式程式語言,能夠像操作本地集合對象一樣,輕鬆地操作分布式數據集。它具有運行速度快、易用性好、通用性強和隨處運行等特點,具體優勢如下。
1)Spark 提供了內存計算,把中間結果,放到內存中,帶來了更高的迭代運算效率。通過支持有向無環圖(DAG)的分布式,並行計算的編程框架,Spark 減少了迭代過程中數據需要寫入磁碟的需求,提高了處理效率。
2)Spark 為我們提供了一個全面、統一的框架,用於管理各種有著不同性質(文本數據、圖表數據等)的數據集和數據源(批量數據或實時的流數據)的大數據處理的需求。
Spark 使用內存緩存來提升性能,因此進行交互式分析也足夠快速,緩存同時提升了迭代算法的性能,這使得 Spark 非常適合數據理論任務,特別是機器學習。
3)Spark 比 Hadoop 更加通用。Hadoop 只提供了 Map 和 Reduce 兩種處理操作,而Spark 提供的數據集操作類型更加豐富,從而可以支持更多類型的應用。
Spark 的計算模式也屬於 MapReduce 類型,但提供的操作不僅包括 Map 和 Reduce,還提供了包括 Map、Filter、FlatMap、Sample、GroupByKey、ReduceByKey、Union、Join、Cogroup、MapValues、Sort、PartionBy 等多種轉換操作,以及 Count、Collect、Reduce、Lookup、Save 等行為操作。
4)Spark 基於 DAG 的任務調度執行機制,比 Hadoop MapReduce 的迭代執行機制更優越。
Spark 各個處理結點之間的通信模型,不再像 Hadoop 一樣,只有 Shuffle 一種模式,程序開發者可以使用 DAG 開發複雜的多步數據管道,控制中間結果的存儲、分區等。
從中可以看出,Hadoop 不適合於做迭代計算,因為每次迭代都需要從磁碟中讀入數據,向磁碟寫中間結果,而且每個任務都需要從磁碟中讀入數據,處理的結果也要寫入磁碟,磁碟 I/O 開銷很大。
而 Spark 將數據載入內存後,後面的迭代都可以直接使用內存中的中間結果做計算,從而避免了從磁碟中頻繁讀取數據。
對於多維度隨機查詢也是一樣。在對 HDFS 同一批數據,做成百或上千維度查詢時,Hadoop 每做一個獨立的查詢,都要從磁碟中讀取這個數據;而 Spark只需要從磁碟中讀取一次後,就可以針對保留在內存中的中間結果進行反覆查詢。
Spark 在 2014 年打破了 Hadoop 保持的基準排序(Sort Bench mark)記錄,使用 206 個結點在 23 分鐘的時間裡完成了 100TB 數據的排序,而 Hadoop 則是使用了 2000 個結點在 72 分鐘才完成相同數據的排序。也就是說,Spark 只使用了百分之十的計算資源,就獲得了 Hadoop 3 倍的速度。
儘管與 Hadoop 相比,Spark 有較大優勢,但是並不能夠取代 Hadoop。
因為 Spark 是基於內存進行數據處理的,所以不適合於數據量特別大、對實時性要求不高的場合。另外,Hadoop 可以使用廉價的通用伺服器來搭建集群,而 Spark 對硬體要求比較高,特別是對內存和 CPU 有更高的要求。