Linux下Hadoop2.6.0叢集環境的搭建

泰山不老生發表於2016-04-25

本文旨在提供最基本的,可以用於在生產環境進行Hadoop、HDFS分散式環境的搭建,對自己是個總結和整理,也能方便新人學習使用。

基礎環境

JDK的安裝與配置

現在直接到Oracle官網(http://www.oracle.com/)尋找JDK7的安裝包不太容易,因為現在官方推薦JDK8。找了半天才找到JDK下載列表頁的地址(http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html)。因為選擇Linux作業系統作為部署環境,所以選擇64位的版本。我選擇的是jdk-7u79-linux-x64.gz。
使用以下命令將jdk-7u79-linux-x64.gz下載到Linux下的/home/jiaan.gja/software目錄

wget http://download.oracle.com/otn-pub/java/jdk/7u79-b15/jdk-7u79-linux-x64.tar.gz

然後使用以下命令將jdk-7u79-linux-x64.gz解壓縮到/home/jiaan.gja/install目錄

tar zxvf jdk-7u79-linux-x64.gz -C ../install

回到/home/jiaan.gja目錄,配置java環境變數,命令如下:

cd ~
vim .bash_profile

在.bash_profile中加入以下內容:
java_1
立刻讓java環境變數生效,執行如下命令:

source .bash_profile

最後驗證java是否安裝配置正確:
java_2

Host

由於我搭建Hadoop叢集包含三臺機器,所以需要修改調整各臺機器的hosts檔案配置,命令如下:

vi /etc/hosts

如果沒有足夠的許可權,可以切換使用者為root。
如果禁止使用root許可權,則可以使用以下命令修改:

sudo vi /etc/hosts

三臺機器的內容統一增加以下host配置:
hostname_1

SSH

由於NameNode與DataNode之間通訊,使用了SSH,所以需要配置免登入。
首先登入Master機器,生成SSH的公鑰,命令如下:

ssh-keygen -t rsa

執行命令後會在當前使用者目錄下生成.ssh目錄,然後進入此目錄將id_rsa.pub追加到authorized_keys檔案中,命令如下:

cd .ssh
cat id_rsa.pub >> authorized_keys

最後將authorized_keys檔案複製到其它機器節點,命令如下:

scp authorized_keys jiaan.gja@Slave1:/home/jiaan.gja/.ssh
scp authorized_keys jiaan.gja@Slave2:/home/jiaan.gja/.ssh

檔案目錄

為了便於管理,給Master的hdfs的NameNode、DataNode及臨時檔案,在使用者目錄下建立目錄:
/home/jiaan.gja/hdfs/name
/home/jiaan.gja/hdfs/data
/home/jiaan.gja/hdfs/tmp
然後將這些目錄通過scp命令拷貝到Slave1和Slave2的相同目錄下。

Hadoop的安裝與配置

下載

首先到Apache官網(http://www.apache.org/dyn/closer.cgi/hadoop/common/)下載Hadoop,從中選擇推薦的下載映象(http://mirrors.hust.edu.cn/apache/hadoop/common/),我選擇hadoop-2.6.0的版本,並使用以下命令下載到Master機器的
/home/jiaan.gja/software目錄:

cd ~/software/
wget http://apache.fayea.com/hadoop/common/hadoop-2.6.0/hadoop-2.6.0.tar.gz

然後使用以下命令將hadoop-2.6.0.tar.gz解壓縮到/home/jiaan.gja/install目錄

tar zxvf hadoop-2.6.0.tar.gz -C ../install/

環境變數

回到/home/jiaan.gja目錄,配置hadoop環境變數,命令如下:

cd ~
vim .bash_profile

在.bash_profile中加入以下內容:
Hadoop_1
立刻讓hadoop環境變數生效,執行如下命令:

source .bash_profile

Hadoop的配置

進入hadoop-2.6.0的配置目錄:

cd ~/install/hadoop-2.6.0/etc/hadoop/

依次修改core-site.xml、hdfs-site.xml、mapred-site.xml及yarn-site.xml檔案。

core-site.xml

<configuration>
<property>
  <name>hadoop.tmp.dir</name>
  <value>file:/home/jiaan.gja/hdfs/tmp</value>
  <description>A base for other temporary directories.</description>
</property>
<property>
  <name>io.file.buffer.size</name>
  <value>131072</value>
</property>
<property>
  <name>fs.default.name</name>
  <value>hdfs://Master:9000</value>
</property>
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
</configuration>

hdfs-site.xml

<configuration>
<property>
  <name>dfs.replication</name>
  <value>2</value>
</property>
<property>
  <name>dfs.namenode.name.dir</name>
  <value>file:/home/jiaan.gja/hdfs/name</value>
  <final>true</final>
</property>
<property>
  <name>dfs.datanode.data.dir</name>
  <value>file:/home/jiaan.gja/hdfs/data</value>
  <final>true</final>
</property>
<property>
  <name>dfs.namenode.secondary.http-address</name>
  <value>Master:9001</value>
</property>
<property>
  <name>dfs.webhdfs.enabled</name>
  <value>true</value>
</property>
<property>
  <name>dfs.permissions</name>
  <value>false</value>
</property>
</configuration>

mapred-site.xml

<configuration>
<property>
  <name>mapreduce.framework.name</name>
  <value>yarn</value>
</property>
</configuration>

yarn-site.xml

<configuration>

<!-- Site specific YARN configuration properties -->
<property>
  <name>yarn.resourcemanager.address</name>
  <value>Master:18040</value>
</property>
<property>
  <name>yarn.resourcemanager.scheduler.address</name>
  <value>Master:18030</value>
</property>
<property>
  <name>yarn.resourcemanager.webapp.address</name>
  <value>Master:18088</value>
</property>
<property>
  <name>yarn.resourcemanager.resource-tracker.address</name>
  <value>Master:18025</value>
</property>
<property>
  <name>yarn.resourcemanager.admin.address</name>
  <value>Master:18141</value>
</property>
<property>
  <name>yarn.nodemanager.aux-services</name>
  <value>mapreduce.shuffle</value>
</property>
<property>
  <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
  <value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
</configuration>

由於我們已經配置了JAVA_HOME的環境變數,所以hadoop-env.sh與yarn-env.sh這兩個檔案不用修改,因為裡面的配置是:

export JAVA_HOME=${JAVA_HOME}

最後,將整個hadoop-2.6.0資料夾及其子資料夾使用scp複製到兩臺Slave的相同目錄中:

scp -r hadoop-2.6.0 jiaan.gja@Slave1:/home/jiaan.gja/install/
scp -r hadoop-2.6.0 jiaan.gja@Slave2:/home/jiaan.gja/install/

執行Hadoop

執行HDFS

格式化NameNode

執行命令:

hadoop namenode -format

執行過程如下圖:
Hadoop_2

最後的執行結果如下圖:
Hadoop_3

啟動NameNode

執行命令如下:

hadoop-daemon.sh start namenode

執行結果如下圖:
Hadoop_4
最後在Master上執行ps -ef | grep hadoop,得到如下結果:
Hadoop_6
在Master上執行jps命令,得到如下結果:
Hadoop_7
說明NameNode啟動成功。

啟動DataNode

執行命令如下:

hadoop-daemons.sh start datanode

執行結果如下:
Hadoop_5

在Slave1上執行命令,如下圖:
Hadoop_8
在Slave2上執行命令,如下圖:
Hadoop_9
說明Slave1和Slave2上的DataNode執行正常。
以上啟動NameNode和DataNode的方式,可以用start-dfs.sh指令碼替代:
Hadoop_14

執行YARN

執行Yarn也有與執行HDFS類似的方式。啟動ResourceManager使用以下命令:

yarn-daemon.sh start resourcemanager

批量啟動多個NodeManager使用以下命令:

yarn-daemons.sh start nodemanager

以上方式我們就不贅述了,來看看使用start-yarn.sh的簡潔的啟動方式:
Hadoop_15

在Master上執行jps:
Hadoop_16
說明ResourceManager執行正常。
在兩臺Slave上執行jps,也會看到NodeManager執行正常,如下圖:
Hadoop_17

測試Hadoop

測試HDFS

最後測試下親手搭建的Hadoop叢集是否執行正常,測試的命令如下圖所示:
Hadoop_10

測試YARN

可以訪問YARN的管理介面,驗證YARN,如下圖所示:
Hadoop_18

測試mapreduce

本人比較懶,不想編寫mapreduce程式碼。幸好Hadoop安裝包裡提供了現成的例子,在Hadoop的share/hadoop/mapreduce目錄下。執行例子:
Hadoop_19
Hadoop_21

配置執行Hadoop中遇見的問題

JAVA_HOME未設定?

我在啟動Hadoop時發現Slave2機器一直啟動不了,然後登入Slave2,在~/install/hadoop-2.6.0/logs目錄下檢視日誌,發現了以下錯誤:

Error: JAVA_HOME is not set and could not be found.

如果我執行echo $JAVA_HOME或者檢視.bash_profile檔案,都證明正確配置了JAVA_HOME的環境變數。無奈之下,只能將Slave2機器的hadoop-env.sh硬編碼為如下的配置:

# The java implementation to use.
export JAVA_HOME=/home/jiaan.gja/install/jdk1.7.0_79

然後問題就解決了。雖然解決了,但是目前不知道所以然,有好心的同仁,告訴我下。。。

Incompatible clusterIDs

由於配置Hadoop叢集不是一蹴而就的,所以往往伴隨著配置——>執行——>。。。——>配置——>執行的過程,所以DataNode啟動不了時,往往會在檢視日誌後,發現以下問題:
Hadoop_11
此問題是由於每次啟動Hadoop叢集時,會有不同的叢集ID,所以需要清理啟動失敗節點上data目錄(比如我建立的/home/jiaan.gja/hdfs/data)中的資料。

NativeCodeLoader的警告

在測試Hadoop時,細心的人可能看到截圖中的警告資訊:
Hadoop_12
我也是查閱網路資料,得知以下解決辦法:
1、下載hadoop-native-64-2.6.0.tar:
在網站http://dl.bintray.com/sequenceiq/sequenceiq-bin/可以找到下載的相應版本,由於我是2.6.0的Hadoop,所以選擇下載
2、停止Hadoop,執行命令如下:
Hadoop_13
下載完以後,解壓到hadoop的native目錄下,覆蓋原有檔案即可。操作如下:

tar xvf hadoop-native-64-2.6.0.tar -C /home/jiaan.gja/install/hadoop-2.6.0/lib/native/

令人失望的是,這種方式並不好使,看到最後的解決方案是需要下載Hadoop原始碼,重新編譯,但這種方式有些重,我不打算嘗試了。有沒有簡便的解決方案,還希望知道的同學告訴一下。

yarn.nodemanager.aux-services錯誤

在執行start-yarn.sh指令碼啟動YARN時,在Slave1和Slave2機器上執行jps命令未發現NodeManager程式,於是登入Slave機器檢視日誌,發現以下錯誤資訊:
Hadoop_20
參考網上的解決方式,是因為yarn.nodemanager.aux-services對應的值mapreduce.shuffle已經被替換為mapreduce_shuffle。有些參考用書上也錯誤的寫為另一個值mapreduce-shuffle。
鳴謝

我在試驗的過程中,遇到很多問題。但是很多問題在網路上都能找到,特此感謝在網際網路上分享經驗的同仁們。

後記:個人總結整理的《深入理解Spark:核心思想與原始碼分析》一書現在已經正式出版上市,目前京東、噹噹、天貓等網站均有銷售,歡迎感興趣的同學購買。
_

京東(現有滿150減50活動)):http://item.jd.com/11846120.html
噹噹:http://product.dangdang.com/23838168.html


相關文章