1. 程式人生 > >阿里雲ECS伺服器部署HADOOP叢集(一):Hadoop完全分散式叢集環境搭建

阿里雲ECS伺服器部署HADOOP叢集(一):Hadoop完全分散式叢集環境搭建

準備:

兩臺配置CentOS 7.3的阿里雲ECS伺服器;

hadoop-2.7.3.tar.gz安裝包;

jdk-8u77-linux-x64.tar.gz安裝包;

hostname及IP的配置:

更改主機名:

由於系統為CentOS 7,可以直接使用‘hostnamectl set-hostname 主機名’來修改,修改完畢後重新shell登入或者重啟伺服器即可。

1 hostnamectl set-hostname master
2 exit
3 ssh root@master
1 hostnamectl set-hostname slave1
2 exit
3 ssh root@slave1

設定本地域名:

設定本地域名這一步非常關鍵,ip的本地域名資訊配置不好,即有可能造成Hadoop啟動出現問題,又有可能造成在使用Hadoop的MapReduce進行計算時報錯。在ECS上搭建Hadoop叢集環境需參考以下兩篇文章:

阿里雲ECS搭建Hadoop叢集環境——啟動時報錯“java.net.BindException: Cannot assign requested address”問題的解決

阿里雲ECS搭建Hadoop叢集環境——計算時出現“java.lang.IllegalArgumentException: java.net.UnknownHostException”錯誤的解決

總結一下那就是,在“/etc/hosts”檔案中進行域名配置時要遵從2個原則:

  •  新加域名在前面: 將新新增的Master、Slave伺服器ip域名(例如“test7972”),放置在ECS伺服器原有本地域名(例如“iZuf67wb***************”)的前面。但是注意ECS伺服器原有本地      域名(例如“iZuf67wb***************”)不能被刪除,因為作業系統別的地方還會使用到。
  •  IP本機內網,其它外網: 在本機上的操作,都要設定成內網ip;其它機器上的操作,要設定成外網ip。

master

slave1

此處摘自 https://blog.csdn.net/dongdong9223/article/details/81275360

配置好後需要在各個節點上執行如下命令,測試是否相互 ping 得通,如果 ping 不通,後面就無法順利配置成功:

1 ping master -c 3
2 ping slave1 -c 3

例如我在 master 節點上 ping slave1 ,ping 通的話會顯示 time,顯示的結果如下圖所示:

各節點角色分配

master: NameNode  ResourceManager

slave1: DataNode NodeManager

免密碼登入配置

分別在 master 和 slave1 上做如下操作

1 ssh-keygen -t rsa
2 ssh-copy-id master
3 ssh-copy-id slave1

驗證

ssh master date;ssh slave1 date

配置JDK

解壓JDK安裝包到/usr/local/下

tar -zxvf jdk-8u77-linux-x64.tar.gz -C /usr/local/

將解壓目錄改為 jdk1.8

mv jdk1.8.0_77/ jdk1.8/

設定JAVA_HOME到系統環境變數

vim /etc/profile

在最後加入以下兩行程式碼

export JAVA_HOME=/usr/local/jdk1.8
export PATH=$PATH:$JAVA_HOME/bin

重新載入環境

source /etc/profile

這樣 master 的jdk就配置好了,可以用命令 java -version 測試下。

java -version

下面只需將 master 上配置好的檔案分發到 slave1 上即可。

將/usr/local/jdk1.8分發到 slave1 的/usr/local/下(建議壓縮後再分發)

scp -r /usr/local/jdk1.8/ slave1:/usr/local/

將/etc/profile分發到 slave1 的/etc/下

scp /etc/profile slave1:/etc/

  然後重新載入 slave1 環境便完成了 slave1 的jdk配置

source /etc/profile

hadoop叢集配置

1 cd ~
2 tar -zxvf hadoop-2.7.3.tar.gz -C /usr/local # 解壓到/usr/local中
3 cd /usr/local/
4 mv ./hadoop-2.7.3/ ./hadoop            # 將資料夾名改為hadoop

輸入如下命令來檢查 Hadoop 是否可用,成功則會顯示 Hadoop 版本資訊:

1 cd /usr/local/hadoop
2 ./bin/hadoop version

新增 HADOOP_HOME 到系統環境變數

vim /etc/profile

在後面新增如下兩行

1 export HADOOP_HOME=/usr/local/hadoop
2 export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

重新載入環境,並輸出變數 HADOOP_HOME 驗證

進入/user/local/hadoop/etc/hadoop/可以看到如下配置檔案

叢集/分散式模式需要修改 /usr/local/hadoop/etc/hadoop 中的6個配置檔案,更多設定項可點選檢視官方說明,這裡僅設定了我完成課堂作業所必須的設定項:hadoop-env.sh, slaves,  core-default.xml,  hdfs-default.xml,  mapred-default.xml,  yarn-default.xml 。

1.首先來配置 hadoop-env.sh ,只需要設定一下JAVA_HOME即可

注:之前在配置jdk中配置的是基於系統的JAVA_HOME變數,這裡需要配置基於Hadoop叢集的JAVA_HOME變數。

hadoop-env.sh 是Hadoop的環境變數配置指令碼。

所以應做以下修改 vim hadoop-env.sh

export JAVA_HOME=/usr/local/jdk1.8

2.配置 slave , 指定 slave 節點

sudo vi slaves

刪去原有的 localhost , 新增將作為 slave 節點的 slave1

3.配置 core-site.xml 

 1 <configuration>
 2 
 3     <property>
 4         <name>fs.defaultFS</name>
 5         <value>hdfs://master:9000</value>
 6         <description>The name of the default file system.</description>
 7     </property> 
 8 # 設定訪問hdfs的預設名,9000是預設埠
 9 
10     <property>
11         <name>hadoop.tmp.dir</name>
12         <value>/usr/local/hadoop/tmp</value>
13         <description>Abase for other temporary directories.</description>
14     </property>
15 # 在hdfs格式化的時候會自動建立相應的目錄 'tmp/'
16 
17     <property>
18         <name>fs.trash.interval</name>
19         <value>4320</value>
20         <description>Number of minutes after which the checkpoint gets deleted.</description>
21     </property>
22 # 設定回收站裡的檔案保留時間(單位:秒)
23 
24 </configuration>

4.配置 hdfs-site.xml 

 1 <configuration>
 2 
 3     <property>
 4         <name>dfs.namenode.name.dir</name>
 5         <value>/usr/local/hadoop/tmp/dfs/name</value>
 6     </property>
 7 
 8     <property>
 9         <name>dfs.datanode.data.dir</name>
10         <value>/usr/local/hadoop/tmp/dfs/data</value>
11     </property>
12 
13     <property>
14         <name>dfs.replication</name>
15         <value>1</value>
16     </property>
17 # 副本,因為有一個 slave 節點這裡設定為1(一般偽分佈模式設1個,三個或三個以上節點設3個)
18 
19     <property>
20         <name>dfs.permissions.enabled</name>
21         <value>false</value>
22         <description>If "true", enable permission checking in HDFS. If "false", permission checking is turned off, but all other behavior is unchanged. Switching from one parameter value to the other does not change the mode, owner or group of files or directories.</description>
23     </property>
24 
25 </configuration>    

5.配置 mapred-site.xml (這個檔案沒有直接提供,而是提供了模版檔案,需將模版檔案轉換為配置檔案) 

1 sudo mv mapred-site.xml.template mapred-site.xml
2 sudo vi mapred-site.xml
 1 <configuration>
 2 
 3     <property>
 4         <name>mapreduce.framework.name</name>
 5         <value>yarn</value>
 6         <description>The runtime framework for executing MapReduce jobs.Can be one of local, classic or yarn.</description>
 7     </property>
 8     <property>
 9         <name>mapreduce.jobtracker.http.address</name>
10         <value>master:50030</value>
11     </property>
12     <property>
13         <name>mapreduce.jobhisotry.address</name>
14         <value>master:10020</value>
15     </property>
16     <property>
17         <name>mapreduce.jobhistory.webapp.address</name>
18         <value>master:19888</value>
19     </property>
20     <property>
21         <name>mapreduce.jobhistory.done-dir</name>
22         <value>/jobhistory/done</value>
23     </property>
24     <property>
25         <name>mapreduce.jobhistory.intermediate-done-dir</name>
26         <value>/jobhisotry/done_intermediate</value>
27     </property>
28     <property>
29         <name>mapreduce.job.ubertask.enable</name>
30         <value>true</value>
31         <description>Whether to enable the small-jobs "ubertask" optimization,which runs "sufficiently small" jobs sequentially within a single JVM."Small" is defined by the following maxmaps, maxreduces, and maxbytes settings. Note that configurations for application masters also affect the "Small" definition - yarn.app.mapreduce.am.resource.mb must be larger than both mapreduce.map.memory.mb and mapreduce.reduce.memory.mb, and yarn.app.mapreduce.am.resource.cpu-vcores must be larger than both mapreduce.map.cpu.vcores and mapreduce.reduce.cpu.vcores to enable ubertask. Users may override this value.</description>
32     </property>
33 
34 </configuration>

6.配置 yarn-site.xml

 1 <configuration>
 2 
 3     <property>
 4         <name>yarn.resourcemanager.hostname</name>
 5         <value>master</value>
 6     </property>
 7     <property>
 8         <name>yarn.nodemanager.aux-services</name>
 9         <value>mapreduce_shuffle</value>
10         <description>A comma separated list of services where service name should only contain a-zA-Z0-9_ and can not start with numbers</description>
11     </property>
12     <property>
13         <name>yarn.resourcemanager.address</name>
14         <value>master:18040</value>
15     </property>
16     <property>
17         <name>yarn.resourcemanager.scheduler.address</name>
18         <value>master:18030</value>
19     </property>
20     <property>
21         <name>yarn.resourcemanager.resource-tracker.address</name>
22         <value>master:18025</value>
23     </property>
24     <property>
25         <name>yarn.resourcemanager.admin.address</name>
26         <value>master:18141</value>
27     </property>
28     <property>
29         <name>yarn.resourcemanager.webapp.address</name>
30         <value>master:18088</value>
31     </property>
32     <property>
33         <name>yarn.log-aggregation-enable</name>
34         <value>true</value>
35     </property>
36     <property>
37         <name>yarn.log-aggregation.retain-seconds</name>
38         <value>86400</value>
39     </property>
40     <property>
41         <name>yarn.log-aggregation.retain-check-interval-seconds</name>
42         <value>86400</value>
43     </property>
44     <property>
45         <name>yarn.nodemanager.remote-app-log-dir</name>
46         <value>/tmp/logs</value>
47     </property>
48     <property>
49         <name>yarn.nodemanager.remote-app-log-dir-suffix</name>
50         <value>logs</value>
51     </property>
52 
53 </configuration>

 到這裡 master 就已經配置好了,下面將該伺服器的配置分發到 slave1 上去(建議壓縮後再分發),在此使用壓縮後分發的方法

在 master 節點上執行

1 cd /usr/local
2 tar -zcvf ~/hadoop.master.tar.gz ./hadoop   
3 cd ~
4 scp ./hadoop.master.tar.gz slave1:/root/
5 scp /etc/profile slave1:/etc/

在 slave1 節點上執行

tar -zxvf ~/hadoop.master.tar.gz -C /usr/local

在 slave1 上重新載入環境並檢查驗證

source /etc/profile
echo $HADOOP_HOME

HDFS NameNode 格式化(只要在 master 上執行即可)

$HADOOP_HOME/bin/hdfs namenode -format

看到下面的輸出,表明hdfs格式化成功

INFO common.Storage: Storage directory /usr/local/hadoop/tmp/dfs/name has been successfully formatted.

啟動前檢查防火牆狀態

systemctl status firewalld

我這裡是已經關閉的,若未關閉,可以參考下圖(來自http://dblab.xmu.edu.cn/blog/install-hadoop-cluster/)

阿里雲伺服器還需要在伺服器安全組裡配置防火牆,需將配置檔案裡的相關埠全部新增,否則會出現 web 頁面打不開,以及 DataNode 啟動但 Live datenode 為 0 等問題

啟動 Hadoop 叢集

$HADOOP_HOME/sbin/start-all.sh

 

  • 第一次啟動 hadoop 時會出現 ssh 提示,提示是否要連入 0.0.0.0 節點,輸入 yes 即可
  • 若出現 hadoop 啟動時 datanode 沒有啟動,可以參考阿里雲ECS搭建Hadoop叢集環境——“啟動Hadoop時,datanode沒有被啟動”問題的解決來解決

啟動 job history server

在 master 上執行

$HADOOP_HOME/sbin/mr-jobhistory-daemon.sh start historyserver

成功後在兩個節點上驗證

在 master 上 執行 

jps

可以看到 ResourceManager、SecondaryNameNode、NameNode、JobHistoryServer 四個程序全部啟動

在 slave1 上執行

jps

可以看到 NodeManager、DataNode 兩個程序全部啟動

缺少任一程序都表示出錯。另外還需要在 Master 節點上通過命令 hdfs dfsadmin -report 檢視 DataNode 是否正常啟動,如果 Live datanodes 不為 0 ,則說明叢集啟動成功。例如我這邊一共有 1 個 Datanodes:

全部配置完成之後檢視 web 頁面

hdfs: http://master:50070/

hdfs Datanode 節點資訊

hdfs 的情況

hdfs 的檔案情況

 yarn:http://master:18088/

 

阿里雲ECS伺服器部署HADOOP集群系列:

  • 阿里雲ECS伺服器部署HADOOP叢集(二):HBase完全分散式叢集搭建(使用外接ZooKeeper)
  • 阿里雲ECS伺服器部署HADOOP叢集(三):ZooKeeper 完全分散式叢集搭建
  • 阿里雲ECS伺服器部署HADOOP叢集(四):Hive本地模式的安裝
  • 阿里雲ECS伺服器部署HADOOP叢集(五):Pig 安裝
  • 阿里雲ECS伺服器部署HADOOP叢集(六):Flume 安裝
  • 阿里雲ECS伺服器部署HADOOP叢集(七):Sqoop 安裝

 

 

 

 

 

 

 

&nb