原文地址:https://www.inlighting.org/archives/install-hadoop-in-fully-distributed-mode
本篇文章主要介紹如何搭建完全分布式的 Hadoop 集群,介于 Hadoop 配置復雜,特此寫下此篇文章記錄。
基礎準備
這一次我使用三臺服務器組建一個 Hadoop 集群,三臺機器我通過虛擬機(Parallel Desktop)模擬,當然大家也可以使用 VirtualBox 或 VMWare 等軟件。
三臺機器配置信息如下:
CPU:雙核
內(nèi)存:2G
磁盤:12G
root 密碼:123456
系統(tǒng):Centos 8.0 (Minimal Install)

環(huán)境安裝
更新系統(tǒng)軟件(可選)
其實不更新也沒啥事估計。
允許 dnf update -y 。
從 Centos 8 開始內(nèi)置了 dnf 命令,所以這里我使用 dnf 命令代替了 yum 。
安裝 openjdk 1.8
執(zhí)行 dnf install java-1.8.0-openjdk-devel.x86_64 -y
安裝 vim
為了方便后面 Hadoop 配置文件的編輯,我們安裝一個 vim 。
執(zhí)行 dnf install vim -y
安裝 tar
安裝解壓軟件,用于解壓 tar 的壓縮文件。
執(zhí)行 dnf install tar.x86_64 -y
機器克隆
通過虛擬機管理軟件將這臺機器克隆 2 臺當做 slave 節(jié)點。
通信配置
我們要讓三臺機子組成一個小型局域網(wǎng)。
我這里三臺機子分配的虛擬 IP 為:
- Master : 10.211.55.11
- Slave1 : 10.211.55.12
- Slave2 : 10.211.55.13
hostname 編輯(非必須,只是為了命令行方便管理,不然都是千篇一律的 localhost )
我這里以 master 節(jié)點為例:
執(zhí)行 hostname 命令我能看到默認為 localhost.localdomain 。
執(zhí)行 hostnamectl set-hostname master ,重啟系統(tǒng)即可。
hosts 文件編輯
修改三臺機子的 /etc/hosts 文件,添加如下代碼:
10.211.55.11 master
10.211.55.12 slave1
10.211.55.13 slave2
靜態(tài) IP 配置(可選)
我這里主機默認的 IP 是通過 DHCP 服務獲取的,如果下次分配的地址變了,會導致 3 臺機子之間的通訊出現(xiàn)異常。所以這里我們配置 Centos 8 改為靜態(tài) IP 。
編輯 ifcfg-xxxx
xxxx 一般是你的網(wǎng)卡名,這里我輸入命令 vim /etc/sysconfig/network-scripts/ifcfg-ens18 編輯我的網(wǎng)卡配置信息。
修改 BOOTPROTO="static" ,在文件后面追加 IP 地址,網(wǎng)關等信息:
IPADDR=10.211.55.11
NETMASK=255.255.255.0
GATEWAY=10.211.55.255
保存后輸入命令 systemctl restart NetworkManager 重啟網(wǎng)絡(Centos 7 命令為 systemctl restart network)。
權(quán)限配置
系統(tǒng)安裝完默認使用 root 賬號, hadoop 如果在 root 下運行不安全,需要額外配置,為了省事,這里我們在三臺機子里均創(chuàng)建一個名為 hadoop 的用戶。
以某一節(jié)點為例:
執(zhí)行 adduser hadoop 即可創(chuàng)建 hadoop 用戶,執(zhí)行 passwd hadoop 為 hadoop 用戶創(chuàng)建密碼,這里密碼為 123456 。(第一次系統(tǒng)會提示 BAD PASSWORD,密碼強度不夠,你再輸入一次即可)。
SSH 免密登入
我們需要配置 master 主機到 slave1 , slave2 和其本身的 SSH 免密登入。
先執(zhí)行
su hadoop切換到 hadoop 用戶。在 Master 主機執(zhí)行
ssh-keygen -t rsa,一路回車,生成密鑰。分別執(zhí)行
ssh-copy-id hadoop@master,ssh-copy-id hadoop@slave1和ssh-copy-id hadoop@slave2將密鑰拷貝到三個節(jié)點。完成后我們可以輸入ssh hadoop@slave1進行測試。
注意本機 master 也需要免密設置,因為我們后面會將 master 既做管理節(jié)點,也做一個 slave 節(jié)點。
Hadoop 分布式架構(gòu)介紹
-
master 節(jié)點為母節(jié)點,負責調(diào)度兩個 slave 節(jié)點,同時其自己也充當一個 slave 節(jié)點。
- NameNode 運行在 master 節(jié)點上,負責 DataNode 的統(tǒng)一管理。
- SecondaryNode 運行在 master 節(jié)點上,輔助 NameNode 的運行。
- ResourceManager 運行在 master 節(jié)點上,負責 yarn 任務的調(diào)度。
-
slave 為奴隸節(jié)點(一般叫 worker),負責運算、存儲。
- DataNode 運行在 slave 上,一個數(shù)據(jù)節(jié)點,存儲數(shù)據(jù)。
- NodeManager 運行在 slave 上,負責執(zhí)行任務。
Hadoop 下載安裝
三臺機子均下載 hadoop文件到 /home/hadoop 目錄下,進行解壓(注意權(quán)限問題,權(quán)限都要屬于 hadoop 用戶,防止后面出現(xiàn)意想不到的問題)
命令行示例:
su hadoop
cd /home/hadoop
wget http://apache.mirror.colo-serv.net/hadoop/common/hadoop-3.2.1/hadoop-3.2.1.tar.gz
tar -zxvf hadoop-3.2.1.tar.gz
JAVA_HOME 配置
在 Centos 8 中 OpenJDK 8 的默認安裝路徑在 /usr/lib/jvm/java-1.8.0-openjdk 下,我們打開 ~/hadoop-3.2.1/etc/hadoop/hadoop-env.sh 修改一行的代碼為
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk

NameNode 配置
編輯 ~/hadoop-3.2.1/etc/hadoop/core-site.xml 的代碼如下:
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://master:9000</value>
</property>
</configuration>

HDFS 配置
編輯 ~/hadoop-3.2.1/etc/hadoop/hdfs-site.xml 代碼如下:
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hadoop/data/nameNode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/hadoop/data/dataNode</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
</configuration>

其中最后一項設置 dfs.replication 表示在 Hadoop 集群中一份文件要存在幾份備份,數(shù)字的設置不要大于真實存在機器的數(shù)量。
例如我有三個計算節(jié)點(slave),
dfs.replication的值不能大于 3。
設置 YARN
編輯 ~/hadoop-3.2.1/etc/hadoop/mapred-site.xml 代碼如下:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
</property>
</configuration>

編輯 ~/hadoop-3.2.1/etc/hadoop/yarn-site.xml 代碼如下:
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>

配置 Workers 節(jié)點
slave 這里的叫法為 worker ,編輯 ~/hadoop-3.2.1/etc/hadoop/workers 代碼如下:
master
slave1
slave2
我這里填寫了 master 節(jié)點,意味著 master 節(jié)點不光充當管理,自己也承擔了一個 worker 節(jié)點。

拷貝配置到各個 slave 節(jié)點
執(zhí)行命令:
scp hadoop-3.2.1/etc/hadoop/* slave1:/home/hadoop/hadoop-3.2.1/etc/hadoop/
scp hadoop-3.2.1/etc/hadoop/* slave2:/home/hadoop/hadoop-3.2.1/etc/hadoop/
將配置文件拷貝到另外兩個 slave 節(jié)點。
運行測試
關閉防火墻
首先要關閉三個節(jié)點的防火墻,同時禁止開機運行,防止在內(nèi)網(wǎng)通信時出現(xiàn)意想不到的問題,執(zhí)行如下命令:
systemctl stop firewalld
systemctl disable firewalld
HDFS 開啟
我們在 master 節(jié)點執(zhí)行下面命令,對 HDFS 進行初始化,./hadoop-3.2.1/bin/hdfs namenode -format 。
隨后執(zhí)行 ./hadoop-3.2.1/sbin/start-dfs.sh 開啟 hdfs 集群。
大家可以在 master 節(jié)點輸入 jps 命令看到已經(jīng)在運行的進程
4930 SecondaryNameNode
4579 NameNode
4739 DataNode
5050 Jps
在 slave 節(jié)點 jps 命令可以看到:
2834 DataNode
2895 Jps
在瀏覽器訪問 localhost:9870 可以看到 web 的控制界面(虛擬機的訪問需要開啟端口轉(zhuǎn)發(fā)):

Yarn 開啟
執(zhí)行 ./hadoop-3.2.1/sbin/start-yarn.sh 命令即可開啟,訪問地址 localhost:8088 可以看到如下界面:

上面我們可以看到 3 個節(jié)點在正常運行。
總結(jié)
至此,完成了 Hadoop 分布式的配置,為了盡可能精簡配置,很多參數(shù)都是使用默認的。其中在 hadoop 目錄下的 sbin 文件夾中提供了很多有用的腳本,例如 start-all.sh 能夠一鍵開啟 hdfs 和 yarn 。大家注意關閉系統(tǒng)時需要使用 stop-xx.sh 腳本關閉系統(tǒng)。