1. 程式人生 > >Hadoop----叢集搭建指南(下卷)

Hadoop----叢集搭建指南(下卷)

前言


什麼是Hadoop?

Apache Hadoop is a framework for running applications on large cluster built of commodity hardware. The Hadoop framework transparently provides applications both reliability and data motion. Hadoop implements a computational paradigm named Map/Reduce, where the application is divided into many small fragments of work, each of which may be executed or re-executed on any node in the cluster. In addition, it provides a distributed file system (HDFS) that stores data on the compute nodes, providing very high aggregate bandwidth across the cluster. Both MapReduce and the Hadoop Distributed File System are designed so that node failures are automatically handled by the framework.

本文是用於搭建hadoop叢集的學習性文章,主要對hadoop的一些基礎知識進行解釋,中間穿插著hadoop的安裝配置過程。

環境問題:

  • 系統:Centos 6.5 64位 minamal版本
  • hadoop版本:2.7.1
  • java版本:1.8

可能不具備通用性,僅供參考。

安裝概覽


安裝完系統,調通叢集內的網路(ssh),配置好java環境,再進行hadoop的安裝。

安裝hadoop時,集中精力配置namenode節點這一臺機器,修改相關的配置檔案,然後使用同步檔案(scp)到其他機器上去,hadoop叢集搭建即可完成。

值得一提,叢集間必須網路通暢,否則無法完成分散式部署。有關問題參見—-叢集搭建指南(中卷)。

另外,在生成環境中,hadoop的安裝均在普通賬戶下(比如:deploy)完成。所以,新手請注意將java及hadoop安裝在開發賬戶下(是deploy賬戶的話,位置一般是:/home/deploy/jdk1.8.0_111, /home/deploy/hadoop-2.7.1)。再通過修改賬戶目錄下的 ~/.bash_profile檔案修改環境變數。

安裝步驟


對於5個節點的叢集(hadoop1-hadoop5),配置節點hadoop1即可。hadoop叢集有很多特性,這裡僅設定低配版的hadoop,不新增太多配置屬性值,以減輕學習壓力。

This document does not cover advanced topics such as Security or High Availability.

儘管只新增部分屬性值,也需要配7個檔案:

  • core-site.xml
  • hdfs-site.xml
  • yarn-site.xml
  • mapred-site.xml
  • hadoop-env.sh
  • yarn-env.sh
  • slaves

7個檔案的解釋,參見:hadoop基礎知識->1. 配置檔案說明。

配置前,假設是:

  • 在deploy賬戶下進行配置
  • hadoop檔案在:/home/deploy/hadoop-2.7.1/
  • java檔案在:/home/deploy/jdk1.8.0_111

在/home/deploy/hadoop-2.7.1/目錄下,新建資料夾:tmp, hdfs, hdfs/data, hdfs/name

完成後,檔案結構是這樣:

這裡寫圖片描述

接下來準備配置,如果在配置過程中發現沒有該檔案,可以自己新建。如果檔案已有內容,可以全部刪除/註釋,然後新增下述配置。另外,本節給出的多有示例配置的埠都可自己定義,不必追求一致。

core-site.xml

命令:vi /home/deploy/hadoop-2.7.1/etc/hadoop/core-site.xml

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop1:9091</value>
        <final>true</final>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>file:/home/deploy/hadoop-2.7.1/tmp</value>
        <description>Abasefor oteh temporary directories.</description>
    </property>
</configuration>

hdfs-site.xml

命令:vi /home/deploy/hadoop-2.7.1/etc/hadoop/hdfs-site.xml

<configuration>
    <!--配置NameNode-->
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:/home/deploy/hadoop-2.7.1/hdfs/name</value>
    </property>

    <!--配置DataNode-->
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/home/deploy/hadoop-2.7.1/hdfs/data</value>
    </property>

    <!--配置Secondary Namenode -->
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>hadoop1:9095</value>
    </property>

    <!--修改預設的HDFS配置-->
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>
    <property>
        <name>dfs.webhdfs.enabled</name>
        <value>true</value>
    </property>

</configuration>

yarn-site.xml

命令:vi /home/deploy/hadoop-2.7.1/etc/hadoop/yarn-site.xml

<configuration>
    <!--下述配置NodeManger-->
    <property>
         <name>yarn.nodemanager.aux-services</name>
         <value>mapreduce_shuffle</value>
    </property>
    <property>
         <name>yarn.nodemanager.resource.memory-mb</name>
         <value>1024</value>
    </property>
    <property>
         <name>yarn.nodemanager.resource.cpu-vcores</name>
         <value>1</value>
    </property>

    <!--下述配置ResourceManager -->    
    <property>
         <name>yarn.resourcemanager.webapp.address</name>
         <value>hadoop1:9099</value>
    </property>
    <property>
         <name>yarn.resourcemanager.hostname</name>
         <value>hadoop1</value>
    </property>
</configuration>

mapred-site.xml

命令:vi /home/deploy/hadoop-2.7.1/etc/hadoop/mapred-site.xml

<configuration>
    <!--配置MaoReduce應用-->
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

hadoop-env.sh

命令:vi /home/deploy/hadoop-2.7.1/etc/hadoop/hadoop-env.sh

找到export JAVA_HOME的地方,將原來的內容註釋,換成:
export JAVA_HOME=/home/deploy/jdk1.8.0_111

yarn-env.sh

命令:vi /home/deploy/hadoop-2.7.1/etc/hadoop/yarn-env.sh

找到export JAVA_HOME的地方,將原來的內容註釋,換成:
export JAVA_HOME=/home/deploy/jdk1.8.0_111

slaves

命令:vi /home/deploy/hadoop-2.7.1/etc/hadoop/slaves

新增你所有datanode節點的hostname,假設有5個節點,名稱是hadoop1-5(hadoop1作為namenode),則新增內容:

hadoop2
hadoop3
hadoop4
hadoop5

啟動hadoop叢集


配置完所有的檔案,在該機器(假設是hadoop1)上使用scp命令到其他4臺機器上。
命令:

scp -r /home/deploy/hadoop-2.7.1/*  deploy@hadoop2:/home/deploy/hadoop-2.7.1/
scp -r /home/deploy/hadoop-2.7.1/*  deploy@hadoop3:/home/deploy/hadoop-2.7.1/
scp -r /home/deploy/hadoop-2.7.1/*  deploy@hadoop4:/home/deploy/hadoop-2.7.1/
scp -r /home/deploy/hadoop-2.7.1/*  deploy@hadoop5:/home/deploy/hadoop-2.7.1/

這樣叢集的配置檔案就都一樣了。然後,在hadoop1上執行命令,將叢集格式化成一個分散式檔案系統,執行:/home/deploy/hadoop-2.7.1/bin/hdfs namenode -format

(注:該命令只能執行一次,多次執行的話,需清空前一次執行產生的hdfs/data/、hdfs/name/和tmp/資料夾下生成的檔案。但是這樣,老叢集的資料就會丟失。相關問題已網上的解答為準。)

接下來啟動叢集:
bash /home/deploy/hadoop-2.7.1/sbin/start-all.sh

檢視相關的UI Web介面:
這裡寫圖片描述

按這裡的配置,Namenode程式的視覺化介面在hadoop1:50070/(使用的預設埠),如圖:

這裡寫圖片描述

Secondery Namenode程式的視覺化介面在hadoop1:9095/(使用的自定義埠), 如圖:
這裡寫圖片描述

ResourceManager程式的視覺化介面在hadoop1:9099/(使用的自定義埠),如圖:
這裡寫圖片描述

最後,關閉叢集:bash /home/deploy/hadoop-2.7.1/sbin/stop-all.sh

hadoop基礎知識


1. 配置檔案說明

簡單的配置無安全性的hadoop叢集,需要修改:

  • core-site.xml
  • hdfs-site.xml
  • yarn-site.xml
  • mapred-site.xml
  • hadoop-env.sh
  • yarn-env.sh
  • slaves

這7個檔案均在同一目錄:hadoop安裝包名/etc/hadoop/。

To configure the Hadoop cluster you will need to configure the environment in which the Hadoop daemons execute as well as the configuration parameters for the Hadoop daemons.

Hadoop由HDFS、Yarn、MapReduce等組成,hadoop的後臺程式,其實就是他們的後臺程式。

HDFS後臺程式有NameNode,SecondaryNode和DataNode。YARN後臺程式有ResourceManager,NodeManager和WebAppProxy。如果MapReduce框架被啟用了,MapReduce Job History Server將會執行。(安裝完hadoop後,使用jps命令可以看到這些後臺程式的名稱。)

1.1 配置hadoop後臺程式的環境

管理員可以使用hadoop-env.sh,也可選擇性使用mapred-env.sh和yarn-env.sh指令碼定製haddoop後臺程式的環境。

至少,必須指定JAVA_HOME,以確保正確定義每一個遠端節點。

可以配置的選擇,在下圖:
這裡寫圖片描述

1.2 配置hadoop後臺程式

這部分處理在給定的配置檔案中需要被指定的重要引數。

  • etc/hadoop/core-site.xml

這裡寫圖片描述

  • etc/hadoop/hdfs-site.xml

配置NameNode:

這裡寫圖片描述

配置DataNode:

這裡寫圖片描述

  • etc/hadoop/yarn-site.xml

配置ResourceManager和NodeManager:

這裡寫圖片描述

配置ResourceManager:

這裡寫圖片描述

配置NodeManager:

這裡寫圖片描述

配置History Server:

這裡寫圖片描述

配置NodeManagers的健康監控:

這裡寫圖片描述

  • etc/hadoop/mapred-site.xml

配置MapReduce應用:

這裡寫圖片描述

配置MapReduce JobHistory Server:
這裡寫圖片描述

  • slaves

List all slave hostnames or IP addresses in your etc/hadoop/slaves file, one per line. Helper scripts (described below) will use the etc/hadoop/slaves file to run commands on many hosts at once. It is not used for any of the Java-based Hadoop configuration. In order to use this functionality, ssh trusts (via either passphraseless ssh or some other means, such as Kerberos) must be established for the accounts used to run Hadoop.

2. Hadoop Map/Reduce框架

2.1 Programming model and execution framework

Map/Reduce是一種程式設計正規化,用於將大型分散式計算表達為對鍵/值對資料集的分散式操作序列。Hadoop Map/Reduce框架利用一組機器,並在叢集中的所有節點上執行使用者定義的Map/Reduce作業。一個Map/Reduce計算包含兩個階段:map階段和reduce階段。

這裡寫圖片描述

在map階段,框架將輸入資料集拆分為大量片段,並將每個片段分配給map任務。框架還在其操作的節點叢集上分佈許多map任務。每個map任務從其分配的片段消耗鍵/值對,併產生一組中間鍵/值對。 對於每個輸入的鍵/值對(K,V),map任務將呼叫戶自定義的map函式。該函式將輸入變換為不同的鍵/值對(K’,V’)。

map階段過後,Map/Reduce框架通過鍵對中間資料集進行排序,併產一組(K‘,V’*)元組,使得與特定鍵相關聯的所有值一起出現。它還將元組的集合(這組(K’,V’)元組)分割成等於reduce任務的數目的多個片段。

在reduce階段,每個reduce任務消耗分配給他的(K’,V’*)元組的片段。對於每個這樣的元組,它呼叫使用者自定義的reduce函式,其將元組變換為輸出值鍵/值對(K,V)。框架又一次在節點叢集上分配許多reduce任務,並處理將合適的中間資料片段運送到每個reduce任務的事情。

這裡寫圖片描述

關於hadoop的任務(tasks),有三個特點:

  • 每個階段的任務以容錯方式(a fault-tolerant manner)執行,如果節點(多個節點)在計算中間失敗,則分配給它(它們)的任務在其餘節點之間重新分佈
  • 任務較多(有許多map和reduce)時,能夠實現良好的負載平衡
  • 允許失敗的任務以最小的執行時間開銷重新執行

2.2 Architecture

Hadoop Map/Reduce框架是主(master)/從(slave)架構。它有一個主伺服器或jobtracker和幾個從伺服器或tasktrackers。jobtracker是使用者和框架之間的互動點。使用者向jobtracker提交map/reduce作業,將作業(job/jobs)放在待處理作業的佇列中,並按先到先服務(first-come/first-served)的方式執行。jobtracker管理map和reduce任務到tasktracker的分配。tasktracker根據jobtracker的指令執行任務,並處理map和reduce階段之間的資料移動。

2.3 Map/Reduce框架小結

網上有很多以上原理的過程圖,在hadoop官網上沒有找到,但言語上描述的相當清楚。如有需求,自行網上找圖。

3. Hadoop DFS

3.1 介紹

Hadoop的分散式檔案系統旨在:能夠在跨大型叢集中的機器上可靠地儲存非常大的檔案。它的靈感來自Google檔案系統。Hadoop DFS將每個檔案儲存為一個塊序列,檔案中除最後一個塊之外的所有塊都具有相同的大小。屬於檔案的塊將被複制以實現容錯。塊大小(block size)和複製因子(replication factor)可以按檔案配置。HDFS中的檔案是“一次寫入”,並且在任何時間都有一個寫入程式。

3.2 Architecture

像Hadoop Map/Reduce一樣,HDFS遵循主/從架構。HDFS的安裝包含一個Namenode,即一個主伺服器,用於管理檔案系統名稱空間並控制客戶端對檔案的訪問。此外,還有一些Datanodes,管理儲存附加到他們執行的節點。Namenode進行檔案系統名稱空間操作,例如:通過RPC介面開啟、關閉、重新命名等檔案和目錄。它還確定塊(block)到Datanodes的對映。Datanodes負責從檔案系統客戶端提供讀取和寫入請求,它們還根據Namenode的指令執行塊建立、刪除和複製。

這裡寫圖片描述

結語


筆者目前是資料倉庫、Python、Hadoop的技術棧,以前是一名前端開發人員。2年開發經驗,還有許多要學習的地方。有興趣和我一起提高IT技術的同學,歡迎加入微信群–小谷的IT圈。掃碼進入:

這裡寫圖片描述

參考資料