Hive
之前我們說了MapReduce計算模型,但是只有懂Java的才能擼代碼干這個事,不懂Java的想用Hadoop的計算模型是不是就沒法搞了呢?比如HDFS里的海量數據,數據分析師想弄點數據出來,咋辦?所以就要用到Hive,它提供了SQL式的訪問方式供人使用。
Hive是由Facebook 開源,最初用于解決海量結構化的日志數據統計問題的ETL(Extraction-Transformation-Loading) 工具,Hive是構建在Hadoop上的數據倉庫平臺,設計目標是可以用傳統SQL操作Hadoop上的數據,讓熟悉SQL編程的人員也能擁抱Hadoop(注意。是數據倉庫。不是數據庫啊。)
使用HQL作為查詢接口
使用HDFS作為底層存儲
使用MapReduce作為執行層
所以說Hive就是基于Hadoop的一個數據倉庫工具,是為簡化MapReduce編程而生的,非常適合數據倉庫的統計分析,通過解析SQL轉化成MapReduce,組成一個DAG(有向無環圖)來執行。
Flume
Flume是Cloudera提供的一個高可用的,高可靠的,分布式的海量日志采集、聚合和傳輸的系統,Flume支持在日志系統中定制各類數據發送方,用于收集數據;同時,Flume提供對數據進行簡單處理,并寫到各種數據接受方(可定制)的能力。
當前Flume有兩個版本Flume 0.9X版本的統稱Flume-og,Flume1.X版本的統稱Flume-ng,由于Flume-ng經過重大重構,與Flume-og有很大不同,使用時請注意區分。
Flume就是一個數據管道,支持很多源(source),sink(目標),和透視寶的suro很像,比如拉取nginx日志可以拿這個工具簡單一配就可用。當然每臺nginx服務器上都要配置并啟動一個flume.
下面給大家看看配置文件(把kafka的數據寫入hdfs的配置),配置很簡單.完全免去了自己寫一個kafka的consumer再調用hdfs的API寫數據的工作量.
YARN
YARN是Hadoop 2.0中的資源管理系統,它的基本設計思想是將MRv1中的JobTracker拆分成了兩個獨立的服務:一個全局的資源調度器ResourceManager和每個應用程序特有的應用程序管理器ApplicationMaster,該調度器是一個 "純調度器",不再參與任何與具體應用程序邏輯相關的工作,而僅根據各個應用程序的資源需求進行分配,資源分配的單位用一個資源抽象概念 "Container" 來表示,Container 封裝了內存和 CPU。此外,調度器是一個可插拔的組件,用戶可根據自己的需求設計新的調度器,YARN 自身提供了 Fair Scheduler 和 Capacity Scheduler。
應用程序管理器負責管理整個系統中所有應用程序,包括應用程序的提交、與調度器協商資源以啟動 ApplicationMaster、監控 ApplicationMaster 運行狀態并在失敗時重新啟動等。
Ambari
Ambari是一個集群的安裝和管理工具,我們之前用的是Apache的Hadoop,運維同學用源碼包安裝,一個個配置文件去改,再分發到各個節點,中間哪一步搞錯了,整個集群就啟動不起來。所以有幾個廠商提供Hadoop的這種安裝和管理平臺,主要是CDH和HDP,國內的很多人都用CDH的,它是Cloudera公司的,如果用它的管理界面安裝,集群節點超過一定數量就要收費了。
Ambari是Apache的頂級開源項目,可以免費使用,現在用的人也很多。Ambari使用Ganglia收集度量指標,用Nagios支持系統報警,當需要引起管理員的關注時(比如,節點停機或磁盤剩余空間不足等問題),系統將向其發送郵件。
ZooKeeper
隨著計算節點的增多,集群成員需要彼此同步并了解去哪里訪問服務和如何配置,ZooKeeper正是為此而生的。ZooKeeper 顧名思義就是動物園管理員,它是用來管大象(Hadoop) 、蜜蜂(Hive) 和 小豬(Pig) 的管理員, Apache Hbase和 Apache Solr 以及LinkedIn sensei等項目中都采用到了 Zookeeper。ZooKeeper是一個分布式的,開放源碼的分布式應用程序協調服務,以Fast Paxos算法為基礎實現同步服務,配置維護和命名服務等分布式應用。
其他組件
以上介紹的都是Hadoop用來計算和查詢的比較常用和主流的組件,上面那副生態圖中的其他幾個組件簡單了解一下就好:
Pig是一種編程語言,它簡化了Hadoop常見的工作任務,Pig為大型數據集處理提供了更高層次的抽象,與MapReduce相比,Pig提供了更豐富的數據結構,一般都是多值和嵌套的數據結構。
Mahout是Hadoop提供做機器學習用的,支持的算法也比較少,但是一些常用的 k-means 聚類、分類還是有的,他是用MapReduce做的,但是MapReduce不太擅長這個東西,所以Mahout的作者也轉投spark ML陣營了。
Sqoop是數據庫ETL工具,用于將關系型數據庫的數據導入到 Hadoop 及其相關的系統中,如 Hive和HBase。Sqoop 的核心設計思想是利用 MapReduce 加快數據傳輸速度,也就是說 Sqoop 的導入和導出功能是通過 MapReduce 作業實現的,所以它是一種批處理方式進行數據傳輸,難以實現實時數據的導入和導出。比如很多以前的業務數據都存在MySQL,隨著數據量越來越大,要把數據導到Hbase,就可以拿Sqoop直接操作。
本文所介紹的東西都是用于離線計算的,而之前發布的《面臨大數據挑戰透視寶如何使用Druid實現數據聚合》則是關于實時計算的框架Druid的。大數據常用的流計算框架主要有Storm,Spark Streaming,Flink,Flink雖然是2014年加入Hadoop的,但至今在生產環境上用的人還不多,似乎大家都持觀望態度。
說一下流計算(Druid,Spark Streaming)和批處理(MapReduce,Hive)有啥區別,比如電商網站的個性化廣告投放,當我們訪問了亞馬遜搜索筆記本電腦之后,他就會給你推薦很多筆記本電腦鏈接,你的請求和興趣愛好被亞馬遜服務器實時接收,流計算分析之后當時就會推薦給你可能會購買的東西。如果這個東西拿批處理去做,服務端收集完了,過半個小時才算出你可能要買電腦,這時候再給你推薦電腦明顯就不合適了,因為這時候你可能在搜索電炒鍋……
最后再說一下大數據的工作流,比如有兩個MapReduce的任務是有依賴的,必須第一個完成了才能執行第二個,這就需要一個調度工具來調度。MapReduce也提供調度的API,但是代碼要寫很多,上面的代碼截圖只是一部分,這個依賴我寫了大概150行。所以這時候出現了工作流,用工作流來管理我們的各個job,我目前知道的有oozie和azkaban,oozie的配置比較靈活,推薦大家使用。