1. 程式人生 > >Hadoop大資料平臺架構與實踐

Hadoop大資料平臺架構與實踐

一、什麼是Apache Hadoop?

1.1 定義和特性

  • 可靠的、可擴充套件的、分散式計算開源軟體。
  • Apache Hadoop軟體庫是一個框架,允許使用簡單的程式設計模型,在計算機叢集分散式地處理大型資料集。
  • 它可以從單個伺服器擴充套件到數千臺機器,每個機器都提供本地計算和儲存。
  • 每一臺計算機都容易出現故障,庫本身的目的是檢測和處理應用層的故障,因此在一組計算機上提供高可用性服務,而不是依靠硬體來提供高可用性。

1.2 主要模組:

  • Hadoop Distributed File System(HDFS): 一個分散式檔案系統,它提供對應用程式資料的高吞吐量訪問。
  • Hadoop YARN: 作業排程和叢集資源管理的框架。
  • Hadoop MapReduce: 基於YARN的大型資料集並行處理系統。

二、Hadoop安裝(以hadoop-1.2.1為例)

2.1 準備條件

  • Linux作業系統
  • 安裝JDK以及配置相關環境變數

2.2 安裝

將hadoop-1.2.1.tar.gz解壓到指定目錄,如:/opt/hadoop-1.2.1/

2.3 配置hadoop環境變數

在/etc/profile中配置如下資訊:

export JAVA_HOME=/opt/jdk1.8.0_131
export JRE_HOME=/opt/jdk1.8.0_131/jre
export HADOOP_HOME=/opt/hadoop-1.2.1
export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JRE_HOME/Lib
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$HADOOP_HOME/bin:$PATH

2.4 修改四個配置檔案

這四個配置檔案均在/opt/hadoop-1.2.1/conf/目錄下。

# The java implementation to use.  Required.
export JAVA_HOME=/opt/jdk1.8.0_131
  • (b)修改core-site.xml,設定hadoop.tmp.dir,dfs.name.dir,fs.default.name:
<configuration>
  <property>
    <name>hadoop.tmp.dir</name>     <!-- hadoop臨時工作目錄 -->
    <value>/home/jochen/hadoop</value>
  </property>

  <property>
    <name>dfs.name.dir</name>       <!-- hadoop源資料目錄 -->
    <value>/home/jochen/hadoop/name</value>
  </property>

  <property>
    <name>fs.default.name</name>    <!-- 檔案系統namenode => 地址:埠號 -->
    <value>hdfs://localhost:9000</value>
  </property>
</configuration>
  • ©修改mapred-site.xml,設定mapred.job.tracker:
<configuration>
  <property>
    <name>mapred.job.tracker</name>
    <value>localhost:9001</value>
  </property>
</configuration>
  • (d)修改hdfs-site.xml,設定dfs.data.dir:
<configuration>
  <property>
    <name>dfs.data.dir</name>       <!-- dfs檔案塊存放目錄 -->
    <value>/home/jochen/hadoop/data</value>
  </property>
</configuration>

2.5 格式化

執行命令:

$ hadoop namenode -format

正確執行的結果如下所示:

Warning: $HADOOP_HOME is deprecated.

17/05/19 23:46:05 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG:   host = ubuntu/127.0.0.1
STARTUP_MSG:   args = [-format]
STARTUP_MSG:   version = 1.2.1
STARTUP_MSG:   build = https://svn.apache.org/repos/asf/hadoop/common/branches/branch-1.2 -r 1503152; compiled by 'mattf' on Mon Jul 22 15:23:09 PDT 2013
STARTUP_MSG:   java = 1.8.0_131
************************************************************/
17/05/19 23:46:05 INFO util.GSet: Computing capacity for map BlocksMap
17/05/19 23:46:05 INFO util.GSet: VM type       = 64-bit
17/05/19 23:46:05 INFO util.GSet: 2.0% max memory = 932184064
17/05/19 23:46:05 INFO util.GSet: capacity      = 2^21 = 2097152 entries
17/05/19 23:46:05 INFO util.GSet: recommended=2097152, actual=2097152
17/05/19 23:46:05 INFO namenode.FSNamesystem: fsOwner=jochen
17/05/19 23:46:05 INFO namenode.FSNamesystem: supergroup=supergroup
17/05/19 23:46:05 INFO namenode.FSNamesystem: isPermissionEnabled=true
17/05/19 23:46:05 INFO namenode.FSNamesystem: dfs.block.invalidate.limit=100
17/05/19 23:46:05 INFO namenode.FSNamesystem: isAccessTokenEnabled=false accessKeyUpdateInterval=0 min(s), accessTokenLifetime=0 min(s)
17/05/19 23:46:05 INFO namenode.FSEditLog: dfs.namenode.edits.toleration.length = 0
17/05/19 23:46:05 INFO namenode.NameNode: Caching file names occuring more than 10 times
17/05/19 23:46:05 INFO common.Storage: Image file /home/jochen/hadoop/dfs/name/current/fsimage of size 112 bytes saved in 0 seconds.
17/05/19 23:46:06 INFO namenode.FSEditLog: closing edit log: position=4, editlog=/home/jochen/hadoop/dfs/name/current/edits
17/05/19 23:46:06 INFO namenode.FSEditLog: close success: truncate to 4, editlog=/home/jochen/hadoop/dfs/name/current/edits
17/05/19 23:46:06 INFO common.Storage: Storage directory /home/jochen/hadoop/dfs/name has been successfully formatted.
17/05/19 23:46:06 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at ubuntu/127.0.0.1
************************************************************/

2.6 啟動

$ cd /opt/hadoop-1.2.1/bin
$ ./start-all.sh

2.7 檢視當前執行的java程序

在Terminal輸入命令,出現如下結果表示hadoop安裝成功:

$ jps
12785 JobTracker
1161 Jps
23626 TaskTracker
23275 DataNode
21659 NameNode
23436 SecondaryNameNode

三、HDFS簡介

3.1 HDFS基本概念

HDFS設計架構

在這裡插入圖片描述

  • 塊(Block):
    • HDFS的檔案被分成塊進行儲存
    • HDFS塊的預設大小為64MB
    • 塊是檔案儲存處理的邏輯單元
  • 管理節點(NameNode),存放檔案元資料:
    • 檔案與資料塊的對映表
    • 資料塊與資料節點的對映表
  • DataNode:
    • DataNode是HDFS的工作節點
    • 存放資料塊

3.2 資料管理策略與容錯

  • 資料塊副本:每個資料塊至少3個副本,分佈在兩個機架內的多個節點

  • 心跳檢測:DataNode定期向NameNode傳送心跳訊息
    在這裡插入圖片描述

  • 二級NameNode:二級NameNode定期同步元資料映像檔案和修改日誌,NameNode發生故障時,二級NameNode替換為主NameNode
    在這裡插入圖片描述

3.3 HDFS中檔案的讀寫操作

HDFS讀取檔案的流程

在這裡插入圖片描述

HDFS寫入檔案的流程

在這裡插入圖片描述

3.4 HDFS的特點

  • 資料冗餘,硬體容錯
  • 流式的資料訪問(一次寫入、多次讀取)
  • 適合儲存大檔案
  • 適用性和侷限性
    • 適合資料批量讀寫,吞吐量高
    • 不適合互動式應用,低延遲很難滿足
    • 適合一次寫入多次讀取,順序讀寫
    • 不支援多使用者併發寫相同檔案

3.5 HDFS使用

HDFS命令列操作:

hadoop fs -ls dirpath           // 列出某目錄下的檔案和目錄
hadoop fs -mkdir dirname        // 在HDFS中新建目錄
hadoop fs -put filepath dirpath // 將本地檔案上傳到HDFS
hadoop fs -get filepath dirpath // 從HDFS下載檔案到本地
hadoop fs -cat filepath         // 檢視檔案內容
hadoop dfsadmin -report         // 檢視HDFS資訊

四、MapReduce簡介

4.1 MapReduce的原理

分而治之,一個大任務分成多個小的子任務(map),並行執行後,合併結果(reduce)
在這裡插入圖片描述

4.2 MapReduce的執行流程

基本概念
  • Job(作業) & Task(任務)
    一個Job可以分成多個Task(MapTask & ReduceTask)
  • JobTracker(作業管理節點)
    客戶端提交Job,JobTracker將其放入候選佇列中,在適當的時候進行排程,將Job拆分成多個MapTask和ReduceTask,分發給TaskTracker執行。JobTracker的角色:
    • 作業排程
    • 分配任務、監控任務執行進度
    • 監控TaskTracker的狀態
  • TaskTracker(任務管理節點)
    通常TaskTracker和HDFS的DataNode屬於同一組物理節點,實現了移動計算代替移動資料,保證讀取資料開銷最小。TaskTracker的角色:
    • 執行任務
    • 彙報任務狀態
MapReduce的體系結構

在這裡插入圖片描述

MapReduce作業執行過程

在這裡插入圖片描述

MapReduce的容錯機制
  • 重複執行
    預設為最多4次後放棄
  • 推測執行
    原因:所有Map端運算完成,才開始執行Reduce端。
    作用:保證整個任務的計算,不會因為某一兩個TaskTracker的故障,導致整個任務執行效率很低。

五、YARN - Hadoop 資源管理器

  • YARN的基本思想是將資源管理和作業排程/監控的功能拆分到不同的守護程序。這種思想需要有一個全域性的資源管理器(RM)和(每個應用程式都要有的)應用程式管理器(AM)。
  • 資源管理器(RM)和節點管理器(NodeManager)形成了資料計算框架。資源管理器(RM)是在系統中所有應用程式間仲裁資源的最終權威。節點管理器(NodeManager)是每臺機器的框架代理,負責容器的管理,監控他們的資源使用情況(cpu、記憶體、磁碟、網路),並向資源管理器(RM)/排程器報告該情況。
  • 每個應用程式的應用程式管理器(AM)實際上是一個特定的框架的庫,它的任務是與資源管理器(RM)協商資源,並與節點管理器(NodeManager)一起工作來執行和監視任務。
  • 資源管理器(RM)有兩個主要元件:排程程式和應用程式管理器(AM)。
    • 排程程式負責將資源分配給各種執行的應用程式。排程程式是純粹的排程器,因為它不執行應用程式的狀態監視或跟蹤。另外,它也不能保證重新啟動失敗的任務,無論是由於應用程式失敗還是硬體故障。
    • 應用程式管理器(AM)負責接收提交的工作,協商執行應用程式的第一個容器,並並提供在失敗時重新啟動應用程式管理器(AM)容器的服務。每個應用程式管理器(AM)負責從排程程式中協商適當的資源容器,跟蹤它們的狀態並監視程序。
  • YARN 還支援資源預定的概念,保留資源以確保重要工作的可預見性執行。預訂系統會對資源進行跟蹤,對預訂進行控制,並動態地指導底層的排程程式,以確保預訂是滿的。
    在這裡插入圖片描述