天天看點

01_Hadoop叢集環境搭建

作者:妮唯伊

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 服務。

01_Hadoop叢集環境搭建

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/

01_Hadoop叢集環境搭建

注意,這裡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輸出即可;

01_Hadoop叢集環境搭建

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

01_Hadoop叢集環境搭建

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下建立以下檔案夾:

  1. $hadoop_home/hdfs
  2. $hadoop_home/hdfs/tmp
  3. $hadoop_home/hdfs/name
  4. $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

01_Hadoop叢集環境搭建

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

01_Hadoop叢集環境搭建

注意如果出現編碼異常,則說明配置檔案中有中文字元;主機、從機的配置檔案都去掉中文注釋;

重新初始化:删除$HADOOP_HOME/hdfs/name、data、tmp的内容,然後再次format;

6.2 啟動叢集(master主機)

隻啟動主機上的服務即可,從機上的服務也會同時啟動;

> cd ${HADOOP_HOME}/sbin

第一種:

> ./start-all.sh

第二種:

> ./start-dfs.sh

> ./start-yarn.sh

01_Hadoop叢集環境搭建
01_Hadoop叢集環境搭建

6.3 檢視叢集

在每台伺服器上使用 jps 指令檢視服務程序:

01_Hadoop叢集環境搭建
01_Hadoop叢集環境搭建
01_Hadoop叢集環境搭建

在本機(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

01_Hadoop叢集環境搭建

檢視 Yarn Web-UI界面(資源管理GUI),端口為 8088 :

http://hadoop-master:8088

01_Hadoop叢集環境搭建

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 /

  1. 如果dfs.replication=1,在hadoop-master有該檔案145M;在hadoop-slave1 無;hadoop-slave2 無;
  2. 如果dfs.replication=2,在hadoop-master有該檔案145M;在hadoop-slave1上有約120M,hadoop-slave2約有25M;
  3. 如果dfs.replication=3,在hadoop-master有該檔案145M;在hadoop-slave1有該檔案145M;在hadoop-slave2有該檔案145M;

HDFS的機制是選擇離用戶端網絡距離最近的資料節點作為第一個資料節點,第一個資料節點上會有完整的表的資訊,根據副本資料,第一個資料節點會負責采用流水線的方式将資料塊傳到另外兩個伺服器上;

實驗的環境是在hadoop-master上作為用戶端上傳檔案的,是以無論備份數調成幾,本地都會上傳一份完整的資料;

2. 非叢集環境,用戶端連接配接叢集通路上傳檔案:

根據副本數量,打散分布,每個節點的大小不一;但所有節點檔案大小之和 肯定是 = 單個檔案大小 * 副本數量;

上述驗證,可通過控制台進行檢視;

01_Hadoop叢集環境搭建

繼續閱讀