Hadoop叢集環境搭建
li_zliang
2021-09-22
1 叢集規劃
2 前提準備
3. 前置配置
3.1 安裝jdk
3.1.1 安裝檢查
3.1.2 環境變量
3.2 修改計算機名
3.3 配置免密登陸
3.3.1 ssh服務
3.3.2 生成秘鑰
3.3.3 免密登陸
3.3.4 登陸驗證
4. 叢集搭建
4.1 安裝hadoop(master主機)
4.2 配置環境變量(master主機,slave從機分發後)
4.3 建立檔案目錄(master主機)
4.4 配置配置檔案(master主機)
4.4.2 配置hadoop-env.sh
4.4.3 配置yarn-env.sh
4.4.4 配置core-site.xml
4.4.5 配置hdfs-site.xml
4.4.6 配置yarn-site.xml
4.4.7 配置mapred-site.xml
4.4.8 配置slaves
4.5 分發程式(master主機)
4.6 設定環境變量(slave從機)
5 關閉防火牆
6 啟動運作
6.1 初始化(master主機)
6.2 啟動叢集(master主機)
6.3 檢視叢集
6.4 驗證運作
7 其他
7.1 端口彙總
7.2 修改hdfs和yarn的pid目錄
7.3 關于副本數dfs.replication
1 叢集規劃
這裡搭建一個 3 節點的 Hadoop 叢集,三個主機的計算機名依次為hadoop-master、hadoop-slave1、hadoop-slave2;
其中三台主機均部署 DataNode 和 NodeManager 服務,但隻有hadoop-master上部署 NameNode 和 ResourceManager 服務。
nameNode:hadoop-master
dataNode:hadoop-master、hadoop-slave1、hadoop-slave2
resourceManger:hadoop-master
NodeManager:hadoop-master、hadoop-slave1、hadoop-slave2
2 前提準備
虛機環境
裡搭建一個 3 節點的 Hadoop 叢集;我這裡準備了三台CentOS 7;用VMware搭建;
計算機名分别 為A-CentOS7(master)、B-CentOS7(slave1)、C-CentOS7(Slave2);
JDK1.8
hadoop依賴JDK,提前準備open jdk安裝包;本文中隻有java運作環境jre,沒有開發環境jdk;還是建議提前安裝好JDK;
hadoop安裝包
https://www.apache.org自行下載下傳;hadoop-2.10.1.tar.gz
3. 前置配置
3.1 安裝jdk
3.1.1 安裝檢查
三台虛機均需要安裝JDK,這裡不再贅述; 可自行查閱;
如果安裝虛機時,安裝了基礎開發,預設已經安裝好了Open Jdk;查找已安裝的Open Jdk:
//已經配置了環境變量的情況下檢視
> echo $JAVA_HOME
//查詢java的執行路徑
> which java
> ls -lrt /usr/bin/java
> ls -lrt /etc/alternatives/java
注意java軟連接配接指向:
/etc/alternatives/java -> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-1.el7.x86_64/jre/bin/java
這裡隻有java運作環境jre,沒有開發環境jdk;後面環境變量,JAVA_HOME應該配置到jre:
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-1.el7.x86_64/jre/
注意,這裡Open Jdk隻有JRE環境,并沒有JDK環境,是以我們還是要安裝JDK的;
安裝步驟不再贅述;我這裡安裝為 /usr/local/java/jdk1.8.0_301;
3.1.2 環境變量
//配置環境變量
> vi /etc/profile
//檔案最後添加如下内容,路徑根據實際情況調整
//注意
export JAVA_HOME=/usr/local/java/jdk1.8.0_301
export JRE_HOME=/usr/local/java/jdk1.8.0_301/jre
export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$JAVA_HOME:$PATH
> source /etc/profile
> echo $JAVA_HOME
3.2 修改計算機名
三台主機計算機名依次修改為:hadoop-master、hadoop-slave1、hadoop-slave2;
> hostnamectl set-hostname hadoop-master
> reboot //重新開機後生效
> hostname
配置hosts:三個伺服器均配置,根據實際情況修改IP;
> vi /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
# ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 # 注釋掉
192.168.25.100 hadoop-master
192.168.25.102 hadoop-slave1
192.168.25.103 hadoop-slave2
3.3 配置免密登陸
3.3.1 ssh服務
一般伺服器上都已安裝ssh;
隻要ps -e | grep ssh,有sshd輸出即可;
3.3.2 生成秘鑰
每台主機上使用ssh-keygen指令生成公鑰私鑰對;
//生成秘鑰
> ssh-keygen -t rsa -P ""
//.ssh隐藏,ls是看不到的;
> cd /root/.ssh
注:回車後會在/root/.ssh/下生成兩個檔案:id_rsa和id_rsa.pub這兩個檔案是成對出現的;
3.3.3 免密登陸
第一步:(在hadoop-master上執行)将公鑰id_rsa.pub寫到 ~/.ssh/authorized_keys授權檔案中
> ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop-master
第二步:(在hadoop-master上執行)将公鑰複制為id_rsa_master.pub并放到/home下
> cp ~/.ssh/id_rsa.pub /home/id_rsa_master.pub
第三步:将id_rsa_master.pub檔案取下來,并放到hadoop-slave1和hadoop-slave2的/root/~ssh目錄下;
略,也是先放到/home下,再複制到/root/~ssh下,因為~ssh目錄是看不到的
> cp /home/id_rsa_master.pub /root/.ssh/
第四步:(在hadoop-slave1上執行)将公鑰id_rsa.pub寫到 ~/.ssh/authorized_keys授權檔案中
> cat ~/.ssh/id_rsa_master.pub >> ~/.ssh/authorized_keys
第五步:(在hadoop-slave2上執行)将公鑰id_rsa.pub寫到 ~/.ssh/authorized_keys授權檔案中
> cat ~/.ssh/id_rsa_master.pub >> ~/.ssh/authorized_keys
3.3.4 登陸驗證
在hadoop-master上操作,分别免密登陸hadoop-slave1和hadoop-slave2;
> ssh hadoop-slave1
> exit
> ssh hadoop-slave2
> exit
4. 叢集搭建
4.1 安裝hadoop(master主機)
将hadoop-2.10.1.tar.gz上傳至/home目錄,在/usr/local下建立hadoop目錄,将hadoop-2.10.1.tar.gz複制進去并解壓;
> mkdir /usr/local/hadoop
> cp /home/hadoop-2.10.1.tar.gz /usr/local/hadoop/
> cd /usr/local/hadoop
> tar -zvxf hadoop-2.10.1.tar.gz
// 注意我這裡解壓後hadoop-2.10.1目錄所有者變了,不知為什麼;這裡改為root
> chown -R root:root /usr/local/hadoop/hadoop-2.10.1
4.2 配置環境變量(master主機,slave從機分發後)
> vim /etc/profile
export HADOOP_HOME=/usr/local/hadoop/hadoop-2.10.1
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export PATH=${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:$PATH
> source /etc/profile
4.3 建立檔案目錄(master主機)
在hadoop-2.10.1下建立以下檔案夾:
- $hadoop_home/hdfs
- $hadoop_home/hdfs/tmp
- $hadoop_home/hdfs/name
- $hadoop_home/hdfs/data
> mkdir hdfs
> mkdir hdfs/tmp
> mkdir hdfs/name
> mkdir hdfs/data
4.4 配置配置檔案(master主機)
4.4.1 檢視配置
> cd /usr/local/hadoop/hadoop-2.10.1/etc/hadoop
> ls -l
4.4.2 配置hadoop-env.sh
修改JAVA_HOME
# 指定JDK的安裝位置
# export JAVA_HOME=$JAVA_HOME
export JAVA_HOME=/usr/local/java/jdk1.8.0_301
4.4.3 配置yarn-env.sh
修改JAVA_HOME
# 指定JDK的安裝位置
# export JAVA_HOME=/home/y/libexec/jdk1.6.0/
export JAVA_HOME=/usr/local/java/jdk1.8.0_301
4.4.4 配置core-site.xml
注意,實際配置時,将中文注釋都去掉,否則在後續初始化時出現編碼異常(java.lang.RuntimeException: com.ctc.wstx.exc.WstxIOException: Invalid UTF-8 start byte 0xb5);
<configuration>
<property>
<!--指定 namenode 的 hdfs 協定檔案系統的通信位址-->
<name>fs.defaultFS</name>
<value>hdfs://hadoop-master:9000</value>
</property>
<property>
<!--指定 hadoop 叢集存儲臨時檔案的目錄-->
<name>hadoop.tmp.dir</name>
<!--$hadoop_home/hdfs/tmp-->
<value>/usr/local/hadoop/hadoop-2.10.1/hdfs/tmp</value>
</property>
</configuration>
4.4.5 配置hdfs-site.xml
注意,實際配置時,将中文注釋都去掉,否則在後續初始化時出現編碼異常(java.lang.RuntimeException: com.ctc.wstx.exc.WstxIOException: Invalid UTF-8 start byte 0xb5);
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<!--namenode 節點資料(即中繼資料)的存放位置,可以指定多個目錄實作容錯,多個目錄用逗号分隔-->
<!--$hadoop_home/hdfs/name-->
<value>/usr/local/hadoop/hadoop-2.10.1/hdfs/name</value>
<final>true</final>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<!--datanode 節點資料(即資料塊)的存放位置-->
<!--$hadoop_home/hdfs/data-->
<value>/usr/local/hadoop/hadoop-2.10.1/hdfs/data</value>
<final>true</final>
</property>
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop-master:50070</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop-master:50090</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
</configuration>
4.4.6 配置yarn-site.xml
注意,實際配置時,将中文注釋都去掉,否則在後續初始化時出現編碼異常(java.lang.RuntimeException: com.ctc.wstx.exc.WstxIOException: Invalid UTF-8 start byte 0xb5);
<configuration>
<property>
<!--resourcemanager 的主機名-->
<name>yarn.resourcemanager.hostname</name>
<value>hadoop-master</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>hadoop-master:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>hadoop-master:8030</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>hadoop-master:8088</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>hadoop-master:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>hadoop-master:8033</value>
</property>
<property>
<!--配置 NodeManager 上運作的附屬服務;需要配置成 mapreduce_shuffle 後才可以在Yarn 上運作 MapReduce 程式;-->
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.auxservices.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
</configuration>
4.4.7 配置mapred-site.xml
複制mapred-site.xml.template檔案,并命名為mapred-site.xml;
cp mapred-site.xml.template mapred-site.xml
配置mapred-site.xml:
注意,實際配置時,将中文注釋都去掉,否則在後續初始化時出現編碼異常(java.lang.RuntimeException: com.ctc.wstx.exc.WstxIOException: Invalid UTF-8 start byte 0xb5);
<configuration>
<property>
<!--指定 mapreduce 作業運作在 yarn 上-->
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
4.4.8 配置slaves
配置所有從屬節點的主機名或 IP 位址,每行一個。所有從屬節點上的 DataNode 服務和NodeManager 服務都會被啟動;
把原本的localhost删掉,改為:
hadoop-master
hadoop-slave1
hadoop-slave2
4.5 分發程式(master主機)
将 Hadoop 安裝包分發到其他兩台伺服器;
# hadoop-slave1 和 hadoop-slave2分别建立目錄
> mkdir /usr/local/hadoop/
# 将安裝包分發到hadoop-slave1
> scp -r /usr/local/hadoop/hadoop-2.10.1 hadoop-slave1:/usr/local/hadoop/
# 将安裝包分發到hadoop-slave2
> scp -r /usr/local/hadoop/hadoop-2.10.1 hadoop-slave2:/usr/local/hadoop/
# 總之從機的hadoop_home路徑與主機保持一緻;
# 修改配置後重新分發,比如修改主機配置檔案後
scp -r /usr/local/hadoop/hadoop-2.10.1/etc/hadoop/* hadoop-slave1:/usr/local/hadoop/hadoop-2.10.1/etc/hadoop/
scp -r /usr/local/hadoop/hadoop-2.10.1/etc/hadoop/* hadoop-slave2:/usr/local/hadoop/hadoop-2.10.1/etc/hadoop/
4.6 設定環境變量(slave從機)
在hadoop-slave1和hadoop-slave2設定 Hadoop 的環境變量;同4.2;
5 關閉防火牆
關閉三個主機的防火牆:
> systemctl stop firewalld.service
> systemctl disable firewalld.service
> systemctl status firewalld.service
6 啟動運作
6.1 初始化(master主機)
首次啟動需要進行初始化,初始化成功不再初始化;在hadoop-master 上執行 namenode 初始化指令:
> hdfs namenode -format
注意如果出現編碼異常,則說明配置檔案中有中文字元;主機、從機的配置檔案都去掉中文注釋;
重新初始化:删除$HADOOP_HOME/hdfs/name、data、tmp的内容,然後再次format;
6.2 啟動叢集(master主機)
隻啟動主機上的服務即可,從機上的服務也會同時啟動;
> cd ${HADOOP_HOME}/sbin
第一種:
> ./start-all.sh
第二種:
> ./start-dfs.sh
> ./start-yarn.sh
6.3 檢視叢集
在每台伺服器上使用 jps 指令檢視服務程序:
在本機(windows)配置hosts:
192.168.25.100 hadoop-master
192.168.25.102 hadoop-slave1
192.168.25.103 hadoop-slave2
直接進入HDFS Web-UI 界面(節點管理GUI),端口為 50070
http://hadoop-master:50070
檢視 Yarn Web-UI界面(資源管理GUI),端口為 8088 :
http://hadoop-master:8088
6.4 驗證運作
hadoop jar /usr/local/hadoop/hadoop-2.10.1/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.10.1.jar pi 3 3
7 其他
7.1 端口彙總
端口 用途
9000 fs.defaultFS,如:hdfs://172.25.40.171:9000
9001 dfs.namenode.rpc-address,DataNode會連接配接這個端口
50070 dfs.namenode.http-address
50470 dfs.namenode.https-address
50100 dfs.namenode.backup.address
50105 dfs.namenode.backup.http-address
50090 dfs.namenode.secondary.http-address,如:172.25.39.166:50090
50091 dfs.namenode.secondary.https-address,如:172.25.39.166:50091
50020 dfs.datanode.ipc.address
50075 dfs.datanode.http.address
50475 dfs.datanode.https.address
50010 dfs.datanode.address,DataNode的資料傳輸端口
8480 dfs.journalnode.rpc-address
8481 dfs.journalnode.https-address
8032 yarn.resourcemanager.address
8088 yarn.resourcemanager.webapp.address,YARN的http端口
8090 yarn.resourcemanager.webapp.https.address
8030 yarn.resourcemanager.scheduler.address
8031 yarn.resourcemanager.resource-tracker.address
8033 yarn.resourcemanager.admin.address
8042 yarn.nodemanager.webapp.address
8040 yarn.nodemanager.localizer.address
8188 yarn.timeline-service.webapp.address
10020 mapreduce.jobhistory.address
19888 mapreduce.jobhistory.webapp.address
2888 ZooKeeper,如果是Leader,用來監聽Follower的連接配接
3888 ZooKeeper,用于Leader選舉
2181 ZooKeeper,用來監聽用戶端的連接配接
60010 hbase.master.info.port,HMaster的http端口
60000 hbase.master.port,HMaster的RPC端口
60030 hbase.regionserver.info.port,HRegionServer的http端口
60020 hbase.regionserver.port,HRegionServer的RPC端口
8080 hbase.rest.port,HBase REST server的端口
10000 hive.server2.thrift.port
9083 hive.metastore.uris
7.2 修改hdfs和yarn的pid目錄
略;
主要針對./stop-yarn.sh時出現 nodemanager did not stop gracefully after 5 seconds: killing with kill -9;
具體自行查閱;
7.3 關于副本數dfs.replication
以本文叢集為例,3個主機,3個dataNode;
nameNode:hadoop-master
dataNode:hadoop-master、hadoop-slave1、hadoop-slave2
resourceManger:hadoop-master
NodeManager:hadoop-master、hadoop-slave1、hadoop-slave2
1. hadoop-master上執行上傳(該檔案約有145M):hadoop fs -put /home/SQL.txt /
- 如果dfs.replication=1,在hadoop-master有該檔案145M;在hadoop-slave1 無;hadoop-slave2 無;
- 如果dfs.replication=2,在hadoop-master有該檔案145M;在hadoop-slave1上有約120M,hadoop-slave2約有25M;
- 如果dfs.replication=3,在hadoop-master有該檔案145M;在hadoop-slave1有該檔案145M;在hadoop-slave2有該檔案145M;
HDFS的機制是選擇離用戶端網絡距離最近的資料節點作為第一個資料節點,第一個資料節點上會有完整的表的資訊,根據副本資料,第一個資料節點會負責采用流水線的方式将資料塊傳到另外兩個伺服器上;
實驗的環境是在hadoop-master上作為用戶端上傳檔案的,是以無論備份數調成幾,本地都會上傳一份完整的資料;
2. 非叢集環境,用戶端連接配接叢集通路上傳檔案:
根據副本數量,打散分布,每個節點的大小不一;但所有節點檔案大小之和 肯定是 = 單個檔案大小 * 副本數量;
上述驗證,可通過控制台進行檢視;