技术分享丨关于 Hadoop 的那些事儿
介紹Hadoop的文章已經很多了,個人感覺這一篇還是寫得不錯的:
Hadoop以前是,現在仍然是大數據批處理領域的王者。Hadoop逐漸完善的生態體系,也讓Hadoop廣泛應用于各行業。
本文首先介紹Hadoop的架構和原理,側重于Map-Reduce計算部分。再以簡單示例帶大家入門。
一、Hadoop 介紹
Hadoop 是什么
Hadoop是一個開發和運行大規模數據分析程序的軟件平臺,是隸屬Apache的一個用java語言實現的開源軟件框架,在大量普通服務器組成的集群中對海量數據進行分布式計算。
-
a java based software framework for easily writing applications
-
which process vast amounts of data (multi-petabyte data-sets)in-parallel on large clusters (thousands of nodes) of commodity hardware
-
in a reliable, fault-tolerant manner.
Hadoop 生態圈
HDFS——Hadoop生態圈的基本組成部分是Hadoop分布式文件系統(HDFS)。HDFS是一種數據分布式保存機制,數據被保存在計算機集群上。HDFS為HBase等系統提供了基礎。
MapReduce——Hadoop的主要執行框架是MapReduce,它是一個分布式、并行處理的編程模型。MapReduce把任務分為map(映射)階段和reduce(化簡)。開發人員基于存儲在HDFS中數據,編寫Hadoop的MapReduce任務。由于MapReduce工作原理的特性, Hadoop能以并行的方式訪問數據,從而實現快速訪問數據。
Hbase——HBase是一個建立在HDFS之上,面向列的NoSQL數據庫,用于快速讀/寫大量數據。HBase使用Zookeeper進行管理,確保所有組件都正常運行。
Zookeeper——用于Hadoop的分布式協調服務。Hadoop的許多組件依賴于Zookeeper,它運行在計算機集群上面,用于管理Hadoop操作。
Oozie——Oozie是一個可擴展的工作體系,集成于Hadoop的堆棧,用于協調多個MapReduce作業的執行。它能夠管理一個復雜的系統,基于外部事件來執行,外部事件包括數據的定時和數據的產出。
Pig——它是MapReduce編程的復雜性的抽象。Pig平臺包括運行環境和用于分析Hadoop數據集的腳本語言(Pig Latin)。其編譯器將PigLatin翻譯成MapReduce程序序列。
Hive——Hive類似于SQL高級語言,用于運行基于Hadoop的查詢語句,Hive讓不熟悉MapReduce開發人員也能編寫數據查詢語句,然后這些語句被翻譯為Hadoop上面的MapReduce任務。像Pig一樣,Hive作為一個抽象層工具,吸引了很多熟悉SQL而不是Java編程的數據分析師。
Hadoop的生態圈還包括以下幾個框架,用來與其它企業融合:
Sqoop是一個連接工具,用于在關系數據庫、數據倉庫和Hadoop之間轉移數據。Sqoop利用數據庫技術描述架構,進行數據的導入/導出;利用MapReduce實現并行化運行和容錯技術。
Flume提供了分布式、可靠、高效的服務,用于收集、匯總大數據,并將單臺計算機的大量數據轉移到HDFS。它基于一個簡單而靈活的架構,并提供了數據流的流。它利用簡單的可擴展的數據模型,將企業中多臺計算機上的數據轉移到Hadoop。
Hadoop歷史
? Apache社區的開源分布式系統
? 2003, 2004 Google發布GFS/ MapReduce論文
? 2006, Doug Cutting創立Apache Hadoop
? 2008, release 0.19.0
? 2009, release 0.20.0 -> 0.20.20x (生產系統穩定版本)
? 201111, release 0.23.0 alpha -> 20120523 2.0.0 alpha
? 201112, 0.20.20x -> release 1.0.0
? 商業公司支持:Cloudera & Hortonworks
Who use Hadoop
Hadoop程序的研發流程
Hadoop的構架
第一代Hadoop架構如下:
HDFS介紹
HDFS基本操作
hadoop fs –ls /user/
顯示hdfs指定路徑下的文件和文件夾
hadoop fs –putmy_file /data/
將本地文件上傳到hdfs
hadoop fs –get/tmp /data/my_file
將hdfs上的文件下載到本地
hadoop fs –cat /tmp /data/my_file
查看dfs中的文本文件內容
hadoop fs –text /tmp /data/my_sequence_file
查看dfs中的sequence文件內容
hadoop fs –rm /tmp/data/my_file
將hdfs上的文件刪除
二、MapReduce 原理
MapReduce – 模型原理
原理是分治思想,把一件事情先分解處理,然后再把處理后的結果合并。Map階段就是分解處理,reduce階段合并:
分治思想
-
分解、求解
-
合并
MapReduce映射
-
分:map
-
合:reduce
舉個例子,有一堆的商品,共M種,需要數一下每種商品的個數。
傳統的做法是,找一個人,數所有的商品,得出結果,如果覺得不夠快,那就換一個數的更快的人(分布式計算出現以前的思路)。隨著商品數量的增加,單個人數商品的做法,已不太可行。
基于MR計算模型,可以采用的方案是:找N個人,每人分一堆商品,每人都各自統計自己的商品,M種中每種有多少;然后再找M個人,每個人負責一種商品,把前面N個人的統計結果進行匯總。
總之,數據可以切割的計算,都可以用 Hadoop 實現。
MapReduce – 調度框架
這張圖展示了MapReduce的調度框架,主要有這幾個角色:JobClient、JobTracker、TaskTracker,這里面的JT是一個單Master節點,TT是部署在每臺計算節點上的一個Service。
其中JobClient負責根據用戶指定的參數,生成一個MapReduce作業,然后把作業提交到JobTracker,JT負責把Job所有的Task調度到TT上。
MapReduce – 執行層
這個圖展示了一個Mapreduce的執行過程,是一個具體的執行單元內(Task)發生的事情。左邊是Map Task,map task的輸入是一個數據分片,叫一個split。
輸入數據由 MapReduce 框架解析成一條條記錄,這是一個按照用戶指定的規則(或者是默認規則)讀取數據的過程。
讀取出的數據,將他們一條條的傳給map處理,就是大家寫的mapper函數
經過mapper 處理后,又生成一條新記錄,寫在mapper所在機器的本地磁盤,分Partition寫入,不同Partition數據會交由不同reduce處理;
右邊是Reduce Task,Rt運行起來后先做的事情就是把屬于自己的那一份份數據給拉到自己本地來,這個過程叫shuffle,shuffle的具體過程很復雜,其中包括各種異常處理,性能優化點也比較多。
數據shuffle到reduce本地之后,和map類似,一條條交給reduce函數處理,然后按照用戶指定的格式寫到HDFS指定目錄。
MapReduce – 開發方式
1.基于java開發
--優勢:原生接口,功能完備,性能較高
2.Streaming開發
--優勢:不限語言,實現簡單
三、Streaming 作業舉例
Streaming 原理
Hadoop Streaming通過標準輸入將數據傳遞給用戶實現的map/reduce程序,map/reduce程序使用標準輸出將數據返回給Hadoop框架。
詞頻統計 – 示例
詞頻統計 – Shell實現
Streaming - 本地調試
Streaming最大的優點就是寫起來方便,Streaming作業的本地調試的方法如下:
把輸入數據用cat命令送到管道,管道另一頭接mapper程序,輸出重定向到文件,用sort命令把輸出數據排序。然后再把以排過序的數據通過管道送給reducer程序,最后保存結果得到輸出數據。
map
-
cat input | sh mapper.sh > map.out
sort
-
sort map.out > map.sort
reduce
-
cat map.sort | sh reducer.sh > reduce.out
四、第二代 Hadoop 架構
Hadoop1 存在的問題
Hadoop1存在的問題,主要有這么幾方面:
1、可用性,JobTracker是單點,升級中斷服務,正在運行的作業會失敗;
2、擴展性,因為JobTracker單點性能瓶頸,單機群最大規模也就是幾千臺
3、按槽位分task,集群整體資源利用率不高,因為每臺機器上運行多少個Task是固定的,但是每個Task消耗的資源,其實差異很大。
Hadoop2與Hadoop1的對比
Hadoop2 計算架構
Hadoop1計算部分,主要有兩個角色,JT和TT,其中JT是單點。
Hadoop2把單點的JT角色做了分布式化:
分布式化成包括RM 和AM兩個角色,其中RM是單點,而AM是每個job一個,不同job之間是獨立的AM。
這樣,作業級別的調度在RM,Task級別的調度在AM,大大減輕了RM的壓力:
RM:資源管理
AM:負責具體某一個作業的運行,申請Task資源,調度Task調度
AS:相當于之前的TT,但是每個機器上可以同時運行多個AS,每個AS同時只運行一個Task,理解為一個槽位。
Hadoo2的主要優勢有:
1、支持熱升級
-
中斷時間很短,對用戶基本透明
2、支持更大規模的集群
-
集群規模可超過萬臺
3、更高的集群資源利用率
-
淡化槽位概念,更細粒度資源<cpu, memory>
作者:馨寧
鏈接:https://zhuanlan.zhihu.com/p/20953323
來源:知乎
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀
總結
以上是生活随笔為你收集整理的技术分享丨关于 Hadoop 的那些事儿的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2016年科技阅读列表
- 下一篇: Visio画大括号、花括号