CentOS7下Hadoop3.2.1集羣的安裝與部署(上)

本篇文章將詳細介紹如何在CentOS7服務器上安裝並配置Hadoop3.2.1高可用集羣。

          Hadoop-HA集羣的節點規劃如下:

IP Address

Host Name

Node Type

User Name

172.16.250.234

DN1/JN1

DataNode/JournalNode

hadoop

172.16.250.237

DN2/JN2/RM1

DataNode/JournalNode/ResourceManager

hadoop

172.16.250.238

DN3/JN3/RM2

DataNode/JournalNode/ResourceManager

hadoop

172.16.250.239

NN1

Active NameNode

hadoop

172.16.250.240

NN2

Standby NameNode

hadoop

安裝準備

修改主機名(root權限)

由於安裝集羣用到的服務器數量比較多,在這裏先修改一下每一臺機器的主機名方便區分。

以172.16.250.234服務器爲例,將其主機名改爲 hadoop34。

[root@localhost ~]# hostname             # 查看當前的 hostnmae
localhost
[root@localhost ~]# hostnamectl set-hostname hadoop34   # 永久修改hostname(立即生效)
[root@localhost ~]# hostname                           # 檢查修改
hadoop34

修改HOSTS配置(root權限)

按照集羣的規劃在 /etc/hosts 文件中添加相應的IP地址與主機名映射。

vi /etc/hosts

在文件中添加集羣所有主機的 IP 和HostName的對應關係,IP 與主機名之間使用一個 TAB 鍵分隔,多個主機名之間同樣使用 TAB 鍵進行分隔。

172.16.250.233 hadoop33
172.16.250.234 hadoop34 DN1     JN1
172.16.250.237 hadoop37 DN2     JN2     RM1
172.16.250.238 hadoop38 DN3     JN3     RM2
172.16.250.239 hadoop39 NN1
172.16.250.240 hadoop40 NN2

禁用SELinux(root權限)

爲了避免由於SELinux安全問題導致安裝失敗,暫時先將其關閉,以後再根據需要進行開啓。

在CentOS中禁用SELinux使用如下命令:

[root@localhost ~]# getenforce                                         # 查看當前的 SELinux 狀態
Enforcing
# setenforce 1 可以設置 SELinux 爲 enforcing 模式
[root@localhost ~]# setenforce 0                                       # 將 SELinux 的狀態臨時設置爲 Permissive 模式(立即生效)
[root@localhost ~]# getenforce                                         # 檢查修改
Permissive
[root@localhost ~]# vim /etc/selinux/config                            
# 編輯 config 文件將 SELINUX=enforcing 修改爲 SELINUX=disabled(重啓生效)
[root@localhost ~]# cat /etc/selinux/config                            # 檢查修改
 
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these two values:
#     targeted - Targeted processes are protected,
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted 
 
[root@localhost ~]# sestatus                                  # 查看 SELinux 當前的詳細狀態
SELinux status:                 enabled
SELinuxfs mount:                /selinux
Current mode:                   permissive
Mode from config file:          disabled
Policy version:                 24
Policy from config file:        targeted

注意:使用 getenforce 命令獲取當前 SELinux 的運行狀態爲 permissive 或者 disabled 時均表示關閉

關閉防火牆(root權限)

同樣地,爲了避免由於防火牆策略導致安裝失敗,也暫時將其關閉,CentOS下關閉防火牆使用如下命令:

# Centos7 中使用 systemctl 命令來管理服務,命令格式如下
# systemctl [start 開啓]|[stop 停止]|[restart 重啓]|[status 狀態][enable 開機啓動]| [disable 禁止開機啓動] 服務名稱
[root@localhost ~]# systemctl start firewalld              # 開啓防火牆
[root@localhost ~]# systemctl status firewalld             # 查看防火牆狀態
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: active (running) since Wed 2018-08-08 09:18:09 CST; 24s ago           
         # active (running) 表示防火牆開啓
     Docs: man:firewalld(1)
 Main PID: 21501 (firewalld)
   CGroup: /system.slice/firewalld.service
           └─21501 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
 
Aug 08 09:18:07 localhost.localdomain systemd[1]: Starting firewalld - dynamic firewall daemon...
Aug 08 09:18:09 localhost.localdomain systemd[1]: Started firewalld - dynamic firewall daemon.
[root@localhost ~]# systemctl disable firewalld            # 永久關閉防火牆(重啓生效)
[root@localhost ~]# systemctl stop firewalld               # 臨時關閉防火牆(立即生效)
[root@localhost ~]# systemctl status firewalld             # 檢查修改
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
         # inactive (dead) 表示防火牆關閉
     Docs: man:firewalld(1)
 
Aug 08 09:18:07 localhost.localdomain systemd[1]: Starting firewalld - dynamic firewall daemon...
Aug 08 09:18:09 localhost.localdomain systemd[1]: Started firewalld - dynamic firewall daemon.
Aug 08 09:19:24 localhost.localdomain systemd[1]: Stopping firewalld - dynamic firewall daemon...
Aug 08 09:19:24 localhost.localdomain systemd[1]: Stopped firewalld - dynamic firewall daemon.

下載Hadoop安裝包

下載地址:https://www.apache.org/dyn/closer.cgi/hadoop/common

本例中,我下載的是當前最新的穩定版本 hadoop-3.2.1.tar.gz 。

安裝JDK

無論是HDFS,還是接下來要安裝的Zookeeper集羣,它們的運行都依賴於JDK環境,所以,需要先安裝JDK。

CentOS下JDK安裝與配置:https://blog.csdn.net/pengjunlee/article/details/53932094

提示:JDK安裝包解壓過程中,若出現 Operation not permitted 錯誤提示,表示hadoop用戶對目標目錄沒有操作權限,可以使用如下命令修改目錄的所屬用戶及所屬組。

chown -R hadoop:hadoop /usr/local/

安裝Zookeeper

由於兩個NameNode需要使用Zookeeper來實現故障時主備自動切換,所以在這裏需要先提前安裝並啓動Zookeeper。

Zookeeper介紹及安裝過程:https://blog.csdn.net/pengjunlee/article/details/81637024

SSH免密碼登錄

在 Hadoop 集羣中的各個節點之間需要使用 SSH 頻繁地進行通信,爲了避免每次的通信都要求輸入密碼,需要對各個節點進行 SSH 免密碼登錄配置。

配置sshd(root權限)

編輯 /etc/ssh/sshd_config 文件,使用命令:vi /etc/ssh/sshd_config ,去掉以下3行的 “#” 註釋:

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

修改並保存文件,然後重啓 sshd 服務,使用命令:systemctl restart sshd.service

生成祕鑰

從 root 用戶切換到hadoop,可使用命令:su hadoop。然後, 執行命令 ssh-keygen -t rsa 來生成祕鑰。無需指定口令密碼,直接回車,命令執行完畢後會在 hadoop 用戶的家目錄中(/home/hadoop/.ssh)生成兩個文件:

  • id_rsa: 私鑰
  • id_rsa.pub:公鑰

將公鑰導入到認證文件

在NN1節點(172.16.250.239)上執行如下命令,將自己的公鑰導入到認證文件:

cat /home/hadoop/.ssh/id_rsa.pub >> /home/hadoop/.ssh/authorized_keys

除NN1以外的其他節點使用如下命令將他們的公鑰都導入到NN1的認證文件,以將NN2的公鑰都導入到NN1認證文件爲例:

ssh hadoop@NN2 cat /home/hadoop/.ssh/id_rsa.pub >> /home/hadoop/.ssh/authorized_keys

其他3個DataNode節點也挨個導入一下,以DN1爲例:

ssh hadoop@DN1 cat /home/hadoop/.ssh/id_rsa.pub >> /home/hadoop/.ssh/authorized_keys

導入完成之後,NN1節點上的 authorized_keys 文件內容如下:

此時,NN1節點上的known_hosts文件內容如下:

提示:如果known_hosts中缺少哪一臺主機的記錄就自行ssh登錄一下那臺機器。

將認證文件複製到其他主機

接下來,我們還需要將NN1節點中的authorized_keys、known_hosts兩個文件複製到其他節點。以複製文件到NN2節點爲例,在NN1節點上執行命令如下:

scp /home/hadoop/.ssh/authorized_keys hadoop@NN2:/home/hadoop/.ssh/authorized_keys
scp /home/hadoop/.ssh/known_hosts hadoop@NN2:/home/hadoop/.ssh/known_hosts

設置認證文件訪問權限

修改各個節點中authorized_keys、known_hosts兩個文件的讀寫權限。

chmod 700 /home/hadoop/.ssh
chmod 600 /home/hadoop/.ssh/authorized_keys

建議到了這一步挨個測試一下,看看各個節點間是否能夠ssh免密碼登錄成功。

搭建Hadoop集羣

安裝Hadoop

使用如下操作命令將下載好的 hadoop-3.2.1.tar.gz 解壓至安裝目錄 /usr/local:

tar zxvf hadoop-3.2.1.tar.gz -C /usr/local/

編輯 /home/hadoop/.bash_profile 配置文件,增加 Hadoop 相關環境變量:

export HADOOP_HOME=/usr/local/hadoop-3.2.1
PATH=$PATH:$HOME/.local/bin:$HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

修改完成之後,別忘了執行 source /home/hadoop/.bash_profile 命令來使配置生效,然後使用 hadoop version 命令來查看 Hadoop 的版本信息,確認Hadoop安裝成功。

配置集羣

重複執行上述步驟,將Hadoop安裝到集羣的所有機器上,接下來在其中的任意一臺上進行配置修改。

core-site.xml

<configuration>
        <!-- The name of the default file system -->
        <property>
                <name>fs.defaultFS</name>
                <value>hdfs://hadoop-cluster</value>
        </property>
        <property>
                <name>ha.zookeeper.quorum.hadoop-cluster</name>
                <value>hadoop34:2181,hadoop39:2181,hadoop40:2181</value>
        </property>
        <property>
                <name>hadoop.tmp.dir</name>
                <value>/home/hadoop/data/tmp</value>
        </property>
</configuration>

hdfs-site.xml

<configuration>
        <property>
                <name>dfs.nameservices</name>
                <value>hadoop-cluster</value>
        </property>
        <property>
                <name>dfs.ha.namenodes.hadoop-cluster</name>
                <value>nn1,nn2</value>
        </property>
        <property>
                <name>dfs.namenode.rpc-address.hadoop-cluster.nn1</name>
                <value>NN1:8020</value>
        </property>
        <property>
                <name>dfs.namenode.rpc-address.hadoop-cluster.nn2</name>
                <value>NN2:8020</value>
        </property>
        <property>
                <name>dfs.namenode.http-address.hadoop-cluster.nn1</name>
                <value>NN1:50070</value>
        </property>
        <property>
                <name>dfs.namenode.http-address.hadoop-cluster.nn2</name>
                <value>NN2:50070</value>
        </property>
        <property>
                <name>dfs.namenode.shared.edits.dir</name>
                <value>qjournal://JN1:8485;JN2:8485;JN3:8485/hadoop-cluster</value>
        </property>
        <property>
                <name>dfs.namenode.name.dir</name>
                <value>file:///usr/local/hadoop-3.2.1/data/namespace,file:///home/hadoop//data/namespace</value>
                <description>Path on the local filesystem where the NameNode stores</description>
        </property>
        <property>
                <name>dfs.datanode.data.dir</name>
                <value>file:///usr/local/hadoop-3.2.1/data/dataspace,file:///home/hadoop/data/dataspace</value>
                <description>Path on the local filesystem where the DataNode stores Data</description>
        </property>
        <property>
                <name>dfs.journalnode.edits.dir</name>
                <value>/home/hadoop/journalspace</value>
        </property>
        <property>
                <name>dfs.ha.automatic-failover.enabled.hadoop-cluster</name>
                <value>true</value>
        </property>
        <property>
                <name>dfs.client.failover.proxy.provider.hadoop-cluster</name>
                <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
        </property>
        <property>
                <name>dfs.ha.fencing.methods</name>
                <value>sshfence</value>
        </property>
        <property>
                <name>dfs.ha.fencing.ssh.private-key-files</name>
                <value>/home/hadoop/.ssh/id_rsa</value>
        </property>
        <property>
                <name>dfs.ha.fencing.ssh.connect-timeout</name>
                <value>30000</value>
        </property>
</configuration>

mapred-site.xml

<configuration>
        <property>
                <name>mapreduce.framework.name</name>
                <value>yarn</value>
                <final>true</final>
                <description>The runtime framework for executing MapReduce jobs</description>
        </property>
        <property>
                <name>mapreduce.jobhistory.address</name>
                <value>NN2:10020</value>
                <description>MapReduce JobHistory Server IPC host:port</description>
        </property>
        <property>
                <name>mapreduce.jobhistory.webapp.address</name>
                <value>NN2:19888</value>
                <description>MapReduce JobHistory Server Web UI host:port</description>
        </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>

yarn-site.xml

<configuration>
        <property>
                <name>yarn.resourcemanager.ha.enabled</name>
                <value>true</value>
        </property>
        <property>
                <name>yarn.resourcemanager.cluster-id</name>
                <value>yarn-cluster</value>
        </property>
        <property>
                <name>yarn.resourcemanager.ha.rm-ids</name>
                <value>rm1,rm2</value>
        </property>
        <property>
                <name>yarn.resourcemanager.hostname.rm1</name>
                <value>RM1</value>
        </property>
        <property>
                <name>yarn.resourcemanager.hostname.rm2</name>
                <value>RM2</value>
        </property>
        <property>
                <name>yarn.resourcemanager.webapp.address.rm1</name>
                <value>RM1:8088</value>
        </property>
        <property>
                <name>yarn.resourcemanager.webapp.address.rm2</name>
                <value>RM2:8088</value>
        </property>
        <property>
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
                <description>A comma separated list of services</description>
        </property>
        <property>
                <name>yarn.resourcemanager.recovery.enabled</name>
                <value>true</value>
                <description>Enable RM to recover state after starting. If true, then yarn.resourcemanager.store.class must be specified</description>
        </property>
        <property>
                <name>yarn.resourcemanager.store.class</name>
                <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
                <description>The class to use as the persistent store.</description>
        </property>
        <property>
                <name>yarn.resourcemanager.zk-address</name>
                <value>hadoop33:2181,hadoop34:2181,hadoop37:2181</value>
                <description>Comma separated list of Host:Port pairs.</description>
        </property>
</configuration>

workers

DN1
DN2
DN3

hadoop-env.sh

export JAVA_HOME=/usr/local/jdk1.8.0_211

配置文件全部修改完成之後,將修改後的配置分發到集羣的其他節點上。

scp -r /usr/local/hadoop-3.2.1/etc/hadoop/* nn2:/usr/local/hadoop-3.2.1/etc/hadoop/

啓動Hadoop集羣

啓動JournalNode

首先,需要逐個啓動三個JournalNode節點,使用jps命令查看是否啓動成功。

hdfs --daemon start journalnode

格式化Active NameNode

第一次啓動HDFS需要先進行格式化 NameNode,在 NN1上執行如下命令:

hdfs namenode -format

啓動Active NameNode 

格式化完成之後,在 NN1上執行如下命令:

hdfs --daemon start namenode

同步數據到Standby NameNode

 在 NN2上執行如下命令,將nn1的元數據信息同步到NN2:

hdfs namenode -bootstrapStandby

啓動其餘節點

start-dfs.sh

啓動ZKFC 

在NN1 上執行如下操作,先在ZooKeeper上創建一個znode用來存儲自動故障轉移相關數據,再啓動 ZKFC 守護進程。 

hdfs zkfc -formatZK
hdfs --daemon start zkfc

啓動YARN

在NN1上執行如下命令啓動 Yarn 。

start-yarn.sh

快捷啓動命令

# 啓動hdfs集羣
start-dfs.sh
# 停止hdfs集羣
stop-dfs.sh
# 啓動yarn
start-yarn.sh
# 停止yarn
stop-yarn.sh

 

發佈了247 篇原創文章 · 獲贊 512 · 訪問量 1255萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章