Hadoop系列之完全分散式環境搭建及測試驗證
前置條件:
- 已製作好CentOS 虛擬機器模板。
- 該模板安裝好Oracle JDK,且 JAVA_HOME 值為/usr/java/jdk1.8.0_171-amd64/jre。
準備三臺虛擬機器
- 搭建完全 Hadoop 分散式最少需要三臺伺服器,假設三臺伺服器的 IP 地址如下:
192.168.159.194 hadoop01
192.168.159.195 hadoop02
192.168.159.196 hadoop03
- 配置要求:建議每臺虛擬機器的配置最低為 2 核 4G,如果記憶體確實有限,可以將 hadoop02 和 hadoop03 的記憶體降為 2G,但 hadoop01 的記憶體不能低於 4G,因為根據後面的安排,
hadoop01 作為主節點,上面部署的服務較多。
概述
完全分散式包含多個節點,按功能可劃分為:
- 主節點(master):如 NameNode 和ResourceManager
- 備節點(slave):如 DataNode和NodeManager
- 輔助服務:如 Web App Proxy Server 和 MapReduce Job History server
部署架構
配置檔案
可分為三類:
- 只讀的預設配置檔案,包括
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
- 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 上進行。
第一步:作業系統配置
- 修改/etc/hostname 的內容為 hadoop01
- 修改/etc/hosts 的內容為
備註:配置這裡主要是想通過域名或者IP地址找到相應的機器
127.0.0.1 localhost
192.168.159.194 hadoop01
192.168.159.195 hadoop02
192.168.159.196 hadoop03
- 重啟作業系統[[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.dir:NN所使用的元資料儲存
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.name:yarn :啟用yarn 作為資源管理框架
mapreduce.jobhistory.address:MapReduce JobHistory伺服器IPC主機:埠
mapreduce.jobhistory.webapp.address:配置web地址
- 配置 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 上的操作
- 修改/etc/hostname 的內容為 hadoop02
- 重 啟 hadoop02 [[email protected] ~]# init 6
hadoop03 上的操作
- 修改/etc/hostname 的內容為 hadoop03
- 重 啟 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 介面
- 檢視 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.]+'
說明:
- 這個例子是計算某個目錄下所有檔案中包含某個字串的次數,這裡是匹配'dfs[a-z.]+' 的次數;
- 中間有報如下錯誤, 可忽略。"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]#
第十六步:停止叢集
- 停止 historyserver
[[email protected] ~]# mr-jobhistory-daemon.sh stop historyserver
- 停止 YARN
[[email protected] hadoop-2.7.3]# stop-yarn.sh
- 停止 HDFS
[[email protected] hadoop-2.7.3]# stop-dfs.sh