1. 程式人生 > >Hadoop系列之完全分散式環境搭建及測試驗證

Hadoop系列之完全分散式環境搭建及測試驗證

前置條件:

  1. 已製作好CentOS 虛擬機器模板。
  2. 該模板安裝好Oracle JDK,且 JAVA_HOME 值為/usr/java/jdk1.8.0_171-amd64/jre。

準備三臺虛擬機器

  1. 搭建完全 Hadoop 分散式最少需要三臺伺服器,假設三臺伺服器的 IP 地址如下:

 192.168.159.194 hadoop01

192.168.159.195 hadoop02

192.168.159.196 hadoop03

  1. 配置要求:建議每臺虛擬機器的配置最低為 2 核 4G,如果記憶體確實有限,可以將 hadoop02 和 hadoop03 的記憶體降為 2G,但 hadoop01 的記憶體不能低於 4G,因為根據後面的安排,

hadoop01 作為主節點,上面部署的服務較多。

概述

完全分散式包含多個節點,按功能可劃分為:

  1. 主節點(master):如 NameNode 和ResourceManager
  2. 備節點(slave):如 DataNode和NodeManager
  3. 輔助服務:如 Web App Proxy Server 和 MapReduce Job History server

部署架構

配置檔案

可分為三類:

  1. 只讀的預設配置檔案,包括

hadoop-2.7.3/share/doc/hadoop/hadoop-project-dist/hadoop-common/core-default.xml

hadoop-2.7.3/share/doc/hadoop/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml

hadoop-2.7.3/share/doc/hadoop/hadoop-yarn/hadoop-yarn-common/yarn-default.xml

hadoop-2.7.3/share/doc/hadoop/hadoop-mapreduce-client/hadoop-mapreduce-client- core/mapred-default.xml

  1. site 相關的配置,包括:

hadoop-2.7.3/etc/hadoop/core-site.xml

hadoop-2.7.3/etc/hadoop/hdfs-site.xml

hadoop-2.7.3/etc/hadoop/yarn-site.xml

hadoop-2.7.3/etc/hadoop/mapred-site.xml

控制指令碼檔案,在 hadoop-2.7.3/etc/hadoop/*-env.sh

說明:以下操作在 hadoop01 上進行。

第一步:作業系統配置

  1. 修改/etc/hostname 的內容為 hadoop01
  2. 修改/etc/hosts 的內容為

  備註:配置這裡主要是想通過域名或者IP地址找到相應的機器

127.0.0.1 localhost

192.168.159.194  hadoop01

192.168.159.195  hadoop02

192.168.159.196  hadoop03

  1. 重啟作業系統[[email protected] ~]# init 6

第二步:Hadoop 安裝包下載

第三步:解壓 hadoop 包

將 hadoop-2.7.3.tar.gz 上傳到/root 目錄下。

[[email protected] ~]# cd /opt/

[[email protected] opt]# tar zxf ~/hadoop-2.7.3.tar.gz

[[email protected] opt]# cd hadoop-2.7.3/

建立 hadoop 需要的目錄

[[email protected] ~]# mkdir -p /opt/hadoop-2.7.3/data/namenode

[[email protected] ~]# mkdir -p /opt/hadoop-2.7.3/data/datanode

第四步:配置Hadoop

配置 hadoop-env.sh

編輯 etc/hadoop/hadoop-env.sh,修改 JAVA_HOME 的值如下: # The java implementation to use.

備註:這樣做是避免,Hadoop配置檔案中讀不到$JAVA_HOME而報錯。

export JAVA_HOME=/usr/java/jdk1.8.0_171-amd64/jre

配置core-site.xml

編輯 etc/hadoop/core-site.xml,修改如下:

<configuration>

<property>

<name>fs.defaultFS</name>

<value>hdfs://hadoop01:9000</value>

</property>

<property>

<name>hadoop.tmp.dir</name>

<value>/opt/hadoop-2.7.3/hadoop-tmp</value>

</property>

</configuration>

說明:hadoop.tmp.dir 預設值為"/tmp/hadoop-${user.name}"。Linux 作業系統重啟後,這個目錄會被清空,這可能導致資料丟失,因此需要修改。

fs.defaultFS:定義master的URI和埠

配置 hdfs-site.xml

編輯 etc/hadoop/hdfs-site.xml,修改如下:

<configuration>

<property>

<name>dfs.replication</name>

<value>3</value>

</property>

<property>

<name>dfs.namenode.name.dir</name>

<value>/opt/hadoop-2.7.3/data/namenode</value>

</property>

<property>

<name>dfs.datanode.data.dir</name>

<value>/opt/hadoop-2.7.3/data/datanode</value>

</property>

</configuration>

dfs.replication:配置檔案複製數量

dfs.namenode.name.dirNN所使用的元資料儲存

dfs.datanode.data.dir:儲存dn節點資料的路徑

配置 mapred-site.xml

[[email protected] hadoop-2.7.3]# cd etc/hadoop/

[[email protected] hadoop]# mv mapred-site.xml.template mapred-site.xml

[[email protected] hadoop]# cd ../../

編輯 etc/hadoop/mapred-site.xml,修改如下:

<configuration>

<property>

<name>mapreduce.framework.name</name>

<value>yarn</value>

</property>

<property>

<!-- MapReduce JobHistory Server IPC host:port -->

<name>mapreduce.jobhistory.address</name>

<value>hadoop01:10020</value>

</property>

<property>

<!-- MapReduce JobHistory Server Web UI host:port -->

<name>mapreduce.jobhistory.webapp.address</name>

<value>hadoop01:19888</value>

</property>

</configuration>

mapreduce.framework.nameyarn :啟用yarn 作為資源管理框架

mapreduce.jobhistory.address:MapReduce JobHistory伺服器IPC主機:埠

mapreduce.jobhistory.webapp.address:配置web地址

  1. 配置 yarn-site.xml

編輯 etc/hadoop/yarn-site.xml,修改如下:

<configuration>

<property>

<!-- The hostname of the RM. Default value:0.0.0.0 -->

<name>yarn.resourcemanager.hostname</name>

<value>hadoop01</value>

</property>

<property>

<!-- A comma separated list of services where service name should only contain a-zA- Z0-9_ and can not start with numbers -->

<name>yarn.nodemanager.aux-services</name>

<value>mapreduce_shuffle</value>

</property>

</configuration>

yarn.resourcemanager.hostname:配置主機名

yarn.nodemanager.aux-services:NodeManager上執行的附屬服務。需配置成mapreduce_shuffle,才可執行MapReduce程式

配置 etc/hadoop/slaves

  該檔案指定哪些伺服器節點是datanode節點。刪除locahost,新增所有datanode節點的主機名

編輯 etc/hadoop/slaves,修改如下:

hadoop01

hadoop02

hadoop03

配置 hadoop 的環境變數

編輯/etc/profile,在檔案末尾加上如下內容:

export HADOOP_HOME=/opt/hadoop-2.7.3

export HADOOP_MAPRED_HOME=$HADOOP_HOME

export HADOOP_COMMON_HOME=$HADOOP_HOME export HADOOP_HDFS_HOME=$HADOOP_HOME

export YARN_HOME=$HADOOP_HOME

export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop

export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

說明:需要執行” . /etc/profile”讓環境變數生效。

注意:下面第五步的操作需要依次在 hadoop01、hadoop02 和 hadoop03 上執行。

第五步:配置 SSH 無密登入及同步配置

hadoop01 上的操作

生成私鑰和公鑰對[[email protected]~]# ssh-keygen -t rsa

本機免登入

[[email protected] ~]# cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

執行如下命令驗證 SSH 本機免登入配置,如下:

[[email protected] ~]# ssh localhost [[email protected] ~]# ssh hadoop01

hadoop01 到 hadoop02 的免登入

[[email protected] ~]#ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop02

執行如下命令驗證 SSH 到hadoop02 免登入配置,如下:

[[email protected] ~]# ssh hadoop02

hadoop01 到 hadoop03 的免登入

[[email protected] ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop03

執行如下命令驗證 SSH 到hadoop03 免登入配置,如下:

[[email protected] ~]# ssh hadoop03

同 步 /etc/hosts 到 hadoop02 和 hadoop03

[[email protected] ~]# scp /etc/hosts hadoop02:/etc/hosts

[[email protected] ~]# scp /etc/hosts hadoop03:/etc/hosts

同 步 /etc/profile 到 hadoop02 和 hadoop03

[[email protected] ~]# scp /etc/profile hadoop02:/etc/profile

[[email protected] ~]# scp /etc/profile hadoop03:/etc/profile

同步 hadoop 包及配置到 hadoop02 和 hadoop03

[[email protected] ~]# scp -r /opt/hadoop-2.7.3/ hadoop02:/opt/hadoop-2.7.3/

[[email protected] ~]# scp -r /opt/hadoop-2.7.3/ hadoop03:/opt/hadoop-2.7.3/

hadoop02 上的操作

  1. 修改/etc/hostname 的內容為 hadoop02
  2. 重 啟 hadoop02 [[email protected] ~]# init 6

hadoop03 上的操作

  1. 修改/etc/hostname 的內容為 hadoop03
  2. 重 啟 hadoop03 [[email protected] ~]# init 6

第六步:格式化HDFS 檔案系統

注意:本步操作在hadoop01 上進行。

[[email protected] ~]# hdfs namenode -format

如果執行成功,會在日誌末尾看到格式化成功的提示,如下:

INFO common.Storage: Storage directory /opt/hadoop-2.7.3/hadoop-tmp/dfs/name has been successfully formatted.

第七步:啟動HDFS

[[email protected] ~]# start-dfs.sh

hadoop01: starting namenode, logging to /opt/hadoop-2.7.3/logs/hadoop-root- namenode-hadoop01.out

hadoop01: starting datanode, logging to /opt/hadoop-2.7.3/logs/hadoop-root-datanode- hadoop01.out

hadoop03: starting datanode,  logging to /opt/hadoop-2.7.3/logs/hadoop-root-datanode- hadoop03.out

hadoop02: starting datanode, logging to /opt/hadoop-2.7.3/logs/hadoop-root-datanode- hadoop02.out

注意:這裡在 hadoop01 上啟動了 NameNode、DataNode 和 SecondaryNameNode,在

hadoop02 和 hadoop03 上分別啟動了 DataNode。

檢視 haoop01 上啟動的程序

[[email protected] ~]# jps

4950 SecondaryNameNode

4653 NameNode

4751 DataNode

上面的啟動命令啟動了 HDFS 的管理節點 NameNode 和資料節點 DataNode,以及

NameNode 的輔助節點,即 SecondaryNameNode。

檢視 hadoop02 上啟動的程序

[[email protected] ~]#  jps

1290 DataNode

檢視 hadoop03 上啟動的程序

[[email protected] ~]#  jps

1261 DataNode

第 八 步 : 啟 動 YARN [[email protected] ~]# start-yarn.sh

  starting yarn daemons

starting resourcemanager, logging to /opt/hadoop-2.7.3/logs/yarn-root-resourcemanager- hadoop01.out

hadoop01: starting nodemanager, logging to /opt/hadoop-2.7.3/logs/yarn-root- nodemanager-hadoop01.out

hadoop03: starting nodemanager, logging to /opt/hadoop-2.7.3/logs/yarn-root- nodemanager-hadoop03.out

hadoop02: starting nodemanager, logging to /opt/hadoop-2.7.3/logs/yarn-root- nodemanager-hadoop02.out

[[email protected] ~]#

注意:這裡在 hadoop01 啟動了 ResourceManager 和 NodeManager,在 hadoop02 和

hadoop03 上分別啟動了 NodeManager。

檢視 haoop01 上啟動的程序

[[email protected] ~]# jps

4950 SecondaryNameNode

4653 NameNode

5342 ResourceManager

4751 DataNode

5439 NodeManager

檢視 hadoop02 上啟動的程序

[[email protected] ~]# jps

1591 NodeManager

1290 DataNode

檢視 hadoop03 上啟動的程序[[email protected] ~]# jps

1563 NodeManager

1261 DataNode

第九步:啟動 historyserver

[[email protected] dfs]# mr-jobhistory-daemon.sh

start historyserver

starting historyserver, logging to /opt/hadoop-2.7.3/logs/mapred-root-historyserver- hadoop01.out

確認程序已啟動[[email protected] ~]# jps

4950 SecondaryNameNode

4653 NameNode

5342 ResourceManager

4751 DataNode

5439 NodeManager

17947 JobHistoryServer

粗體部分為新啟動的程序

第十步:檢視 Hadoop 叢集的各個Web 介面

  1. 檢視 NameNode 的 Web 介面http://192.168.159.194:50070

檢視ResourceManager 的 Web 介面http://192.168.159.194:8088

檢視 Job History Server 的web 頁面http://192.168.159.194:19888/

第十一步:建立 HDFS 目錄,以便執行MapReduce 任務

[[email protected] ~]# hdfs dfs -mkdir -p /user/root

注意:這裡的 root,如果你是其他使用者就換成相應的使用者名稱。

第十二步:拷貝輸入檔案到分散式檔案系統

[[email protected] ~]# cd /opt/hadoop-2.7.3/

[[email protected] hadoop-2.7.3]# hdfs dfs -put etc/hadoop input

這裡舉例拷貝et/hadoop 目錄下的檔案到HDFS 中。

檢視拷貝結果

[[email protected] hadoop-2.7.3]# hdfs dfs -ls input

第十三步:執行 Hadoop自帶的 WordCount 例子

[[email protected] ~]# cd /opt/hadoop-2.7.3/

[[email protected] hadoop-2.7.3]# bin/hadoop jar share/hadoop/mapreduce/hadoop- mapreduce-examples-2.7.3.jar grep input output 'dfs[a-z.]+'

說明:

  1. 這個例子是計算某個目錄下所有檔案中包含某個字串的次數,這裡是匹配'dfs[a-z.]+' 的次數;
  2. 中間有報如下錯誤, 可忽略。"18/05/14 00:03:54 WARN io.ReadaheadPool: Failed readahead on ifile EBADF: Bad file descriptor"

各個節點上程序的變化

hadoop01 上新增程序:YarnChild、MRAppMaster 和 RunJar

hadoop02 和 hadoop03 上有多個新增的 YarnChild 程序。

第十四步:將結果從分散式檔案系統拷貝到本地

[[email protected] hadoop01 hadoop-2.7.3]# hdfs dfs -get output output

[[email protected] hadoop01 hadoop-2.7.3]# cat output/*

6 dfs.audit.logger

4 dfs.class

3 dfs.server.namenode.

2 dfs.period

2 dfs.audit.log.maxfilesize

2 dfs.audit.log.maxbackupindex

1 dfsmetrics.log

1 dfsadmin

1 dfs.servers

1 dfs.replication

1 dfs.file

或者直接檢視

[[email protected] hadoop-2.7.3]# hdfs dfs -cat output/*

這裡可以看到每個包含dfs 的關鍵詞在 etc/hadoop 的所有檔案中出現的次數的統計。

第十五步:驗證結果

用 linux 命令來統計一下"dfs.class"的次數,結果為 4 次,與 mapreduce 統計的一致。

[[email protected] hadoop-2.7.3]#grep -r 'dfs.class' etc/hadoop/

etc/hadoop/hadoop- metrics.properties:dfs.class=org.apache.hadoop.metrics.spi.NullContext etc/hadoop/hadoop- metrics.properties:#dfs.class=org.apache.hadoop.metrics.file.FileContext etc/hadoop/hadoop-metrics.properties:# dfs.class=org.apache.hadoop.metrics.ganglia.GangliaContext etc/hadoop/hadoop-metrics.properties:# dfs.class=org.apache.hadoop.metrics.ganglia.GangliaContext31 [[email protected] hadoop-2.7.3]#

第十六步:停止叢集

  1. 停止 historyserver

[[email protected] ~]# mr-jobhistory-daemon.sh stop historyserver

  1. 停止 YARN

[[email protected] hadoop-2.7.3]# stop-yarn.sh

  1. 停止 HDFS

[[email protected] hadoop-2.7.3]# stop-dfs.sh