技術分享丨關於 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>

五、分享交流

1、想要參加「技術沙龍-周五課堂」的小夥伴請加群:

Reboot 周五分享群 368573673

2、報名請聯繫:

Ada:279312229

小夏:979950755

運維開發交流QQ群: 238757010

歡迎大家關注公共號,高品質運維開發

關於Reboot:

專註於互聯網運維開發分享、交流,讓更多的運維工程師更加專註於自動化,為國內公有雲開發、監控、運維貢獻自己的力量。這裡聚集著國內一線互聯網工程師,樂於分享與交流 。發現文章不錯的話請關注我們。

我的博客:Reboot運維開發
推薦閱讀:

Hadoop的MapReduce階段為什麼要進行排序呢,這樣的排序對後續操作有什麼好處么?

TAG:Hadoop | HDFS | MapReduce |