基於zookeeper的Hadoop集羣
集羣規劃
hadoop1(master) | hadoop2 | hadoop3 | |
---|---|---|---|
NameNode | √ | √ | |
DataNode | √ | √ | √ |
ResourceManager | √ | √ | |
zookeeper | √ | √ | √ |
準備工作
1、確保服務器安裝了JDK
Hadoop需要java環境支持
輸入該命令
java -version
確認是否有jdk,如沒有請先安裝jdk
2、關閉防火牆
#centos7啓動firewall
systemctl start firewalld.service
#centos7重啓firewall
systemctl restart firewalld.service
#centos7停止firewall
systemctl stop firewalld.service
#centos7禁止firewall開機啓動
systemctl disable firewalld.service
#centos7查看防火牆狀態
firewall-cmd --state
3、關閉selinux
Hadoop主節點管理子節點是通過SSH實現的, SELinux不關閉的情況下無法實現,會限制ssh免密碼登錄
vi /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=enforcing
# SELINUXTYPE= can take one of these two values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
將 SELINUX=enforcing 改爲 SELINUX=disabled
保存, 執行以下命令使selinux 修改立即生效
setenforce 0
4、修改主機名與IP映射
vi /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=hadoop1
hostname填寫當前主機的名字
vi /etc/hosts
192.168.37.251 hadoop1
192.168.37.252 hadoop2
192.168.37.253 hadoop3
在hosts中填寫各個主機IP和主機名
5、創建hadoop用戶
hadoop集羣的用戶名要一樣
用root權限創建hadoop用戶和hadoop用戶組
groupadd hadoop
useradd -g hadoop hadoop
#修改用戶密碼
passwd hadoop
6、SSH免密登錄
爲了Hadoop主節點方便管理多個的從節點,配置SSH免密登錄
切換到hadoop用戶操作,輸入該命令生成非對稱公鑰和私鑰,這個在集羣中所有節點機器都必須執行
ssh-keygen -t rsa
回車後不管提示什麼,不要輸入任何東西,一直按回車,按三次即可完成
cd /home/hadoop/.ssh/
首先將Master節點的公鑰添加到authorized_keys
cat id_rsa.pub>>authorized_keys
其次將從節點的公鑰添加到authorized_keys,這裏我是在Hadoop1機器上操作的
ssh [email protected] cat /home/hadoop/.ssh/id_rsa.pub>> authorized_keys
ssh [email protected] cat /home/hadoop/.ssh/id_rsa.pub>> authorized_keys
設置修改/home/hadoop/.ssh/authorized_keys權限
chmod 700 /home/hadoop/.ssh
chmod 600 /home/hadoop/.ssh/authorized_keys
將Master節點的authorized_keys分發到其他slaves節點
scp -r /home/hadoop/.ssh/authorized_keys [email protected]:/home/hadoop/.ssh/
scp -r /home/hadoop/.ssh/authorized_keys [email protected]:/home/hadoop/.ssh/
用該命令驗證下ssh免密登錄是否成功
ssh hadoop@hadoop2
安裝zookeeper
1、下載zookeeper
官網下載地址:http://mirror.bit.edu.cn/apache/zookeeper/
2、解壓
tar -zxvf zookeeper-3.3.6.tar.gz
3、修改配置文件 zoo.cfg
將zookeeper壓縮文件解壓後,我們進入到 conf 目錄
將 zoo_sample.cfg 文件複製並重命名爲 zoo.cfg 文件
cp zoo_sample.cfg zoo.cfg
然後通過 vim zoo.cfg 命令對該文件進行修改
我們需要修改的第一個是 dataDir ,在指定的位置處創建好目錄,這是zookeeper數據存放位置
第二個紅框按如上格式填寫,只需要修改對應的IP,IP可以改爲對應的主機名
4、創建myid文件
在 上一步 dataDir 指定的目錄下,創建 myid 文件
然後在該文件添加上一步 server. 的對應數字
比如我們上面的配置:
server.0=192.168.146.200:2888:3888
server.1=192.168.146.201:2888:3888
server.2=192.168.146.202:2888:3888
那麼就必須在 192.168.146.200 機器的的 /usr/local/software/zookeeper-3.3.6/data 目錄下創建 myid 文件,然後在該文件中寫上 0 即可
後面的機器依次在相應目錄創建myid文件,寫上相應配置數字
5、配置環境變量
vi /etc/profile ,添加相應的配置信息:
#set zookeeper environment
export ZK_HOME=/usr/local/software/zookeeper-3.3.6
export PATH=$PATH:$ZK_HOME/bin
然後通過如下命令使得環境變量生效:
source /etc/profle
6、啓動zookeeper
啓動命令:
zkServer.sh start
停止命令:
zkServer.sh stop
重啓命令:
zkServer.sh restart
查看集羣節點狀態:
zkServer.sh status
我們分別對集羣三臺機器執行啓動命令。執行完畢後,分別查看集羣節點狀態:
出現如下即是集羣搭建成功:
安裝hadoop
1、下載hadoop
從官網或是鏡像站下載
http://hadoop.apache.org/
http://mirrors.hust.edu.cn/apache/
2、解壓縮
下載hadoop-2.7.5.tar.gz放置於/home/hadoop下並解壓,這裏我在hadoop1操作
tar –zxvf hadoop-2.7.5.tar.gz
3、修改配置文件
配置文件目錄:/home/hadoop/hadoop-2.7.5/etc/hadoop
修改 hadoop-env.sh文件,填寫jdk路徑
vi hadoop-env.sh
修改core-site.xml
vi core-site.xml
<configuration>
<!-- 指定hdfs的nameservice爲myha01 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://myha01/</value>
</property>
<!-- 指定hadoop臨時目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/data/hadoopdata/</value>
</property>
<!-- 指定zookeeper地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
</property>
<!-- hadoop鏈接zookeeper的超時時長設置 -->
<property>
<name>ha.zookeeper.session-timeout.ms</name>
<value>1000</value>
<description>ms</description>
</property>
</configuration>
zookeeper地址填寫 主機名:端口號,zookeeper的端口默認是2181
修改hdfs-site.xml
vi hdfs-site.xml
<configuration>
<!-- 指定副本數 -->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!-- 配置namenode和datanode的工作目錄-數據存儲目錄 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hadoop/data/hadoopdata/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/hadoop/data/hadoopdata/dfs/data</value>
</property>
<!-- 啓用webhdfs -->
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<!--指定hdfs的nameservice爲myha01,需要和core-site.xml中的保持一致
dfs.ha.namenodes.[nameservice id]爲在nameservice中的每一個NameNode設置唯一標示符。
配置一個逗號分隔的NameNode ID列表。這將是被DataNode識別爲所有的NameNode。
例如,如果使用"myha01"作爲nameservice ID,並且使用"nn1"和"nn2"作爲NameNodes標示符
-->
<property>
<name>dfs.nameservices</name>
<value>myha01</value>
</property>
<!-- myha01下面有兩個NameNode,分別是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.myha01</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.myha01.nn1</name>
<value>hadoop1:9000</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.myha01.nn1</name>
<value>hadoop1:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.myha01.nn2</name>
<value>hadoop2:9000</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.myha01.nn2</name>
<value>hadoop2:50070</value>
</property>
<!-- 指定NameNode的edits元數據的共享存儲位置。也就是JournalNode列表
該url的配置格式:qjournal://host1:port1;host2:port2;host3:port3/journalId
journalId推薦使用nameservice,默認端口號是:8485 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop1:8485;hadoop2:8485;hadoop3:8485/myha01</value>
</property>
<!-- 指定JournalNode在本地磁盤存放數據的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hadoop/data/journaldata</value>
</property>
<!-- 開啓NameNode失敗自動切換 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失敗自動切換實現方式 -->
<property>
<name>dfs.client.failover.proxy.provider.myha01</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔離機制方法,多個機制用換行分割,即每個機制暫用一行 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<!-- 使用sshfence隔離機制時需要ssh免登陸 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
<!-- 配置sshfence隔離機制超時時間 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
<property>
<name>ha.failover-controller.cli-check.rpc-timeout.ms</name>
<value>60000</value>
</property>
</configuration>
修改mapred-site.xml
vi mapred-site.xml
<configuration>
<!-- 指定mr框架爲yarn方式 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 指定mapreduce jobhistory地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop1:10020</value>
</property>
<!-- 任務歷史服務器的web地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop1:19888</value>
</property>
</configuration>
修改yarn-site.xml
vi yarn-site.xml
<configuration>
<!-- 開啓RM高可用 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 指定RM的cluster id -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yrc</value>
</property>
<!-- 指定RM的名字 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 分別指定RM的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop1</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop2</value>
</property>
<!-- 指定zk集羣地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>86400</value>
</property>
<!-- 啓用自動恢復 -->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!-- 制定resourcemanager的狀態信息存儲在zookeeper集羣上 -->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
</configuration>
修改slaves
vi slaves
hadoop1
hadoop2
hadoop3
4、將hadoop安裝包分發到其他集羣節點
每臺服務器中的hadoop安裝包的目錄必須一致, 配置還必須保持一致
scp -r /home/hadoop/hadoop-2.7.5 hadoop@hadoop2:/home/hadoop/
scp -r /home/hadoop/hadoop-2.7.5 hadoop@hadoop3:/home/hadoop/
5、配置Hadoop環境變量
如果使用hadoop用戶安裝,就修改用戶變量 vi /etc/profile
如果使用root用戶安裝,就修改系統變量 vi ~/.bashrc
export HADOOP_HOME=/home/hadoop/apps/hadoop-2.7.5
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:
root用戶使環境變量生效
source /etc/profile
hadoop用戶使環境變量生效
source ~/.bashrc
6、查看hadoop版本
hadoop version
hadoop集羣的初始化
1、確保你的zookeeper集羣已經正常啓動
查看zookeeper狀態
zkServer.sh status
2、在你配置的各個journalnode節點啓動該進程
按照之前的規劃,我的是在hadoop1、hadoop2、hadoop3上進行啓動,啓動命令如下
在sbin目錄下執行該命令
hadoop-daemon.sh start journalnode
3、格式化namenode
選取一個namenode(hadoop1)節點進行格式化
hadoop namenode -format
4、格式化zkfc
注意只能在nameonde節點進行
hdfs zkfc -formatZK
初次啓動hadoop集羣
1、啓動namenode
#啓動namenode
#hadoop1
/home/hadoop/hadoop-2.7.5/sbin/hadoop-daemon.sh start namenode
#同步備用namenode、啓動備用namenode
#hadoop2
/home/hadoop/hadoop-2.7.5/bin/hdfs namenode -bootstrapStandby
/home/hadoop/hadoop-2.7.5/sbin/hadoop-daemon.sh start namenode
2、啓動ZKFC
#hadoop1
/home/hadoop/hadoop-2.7.5/sbin/hadoop-daemon.sh start zkfc
#hadoop2
/home/hadoop/hadoop-2.7.5/sbin/hadoop-daemon.sh start zkfc
3、啓動datanode
#這一步會啓動所有的datanode
#hadoop1
/home/hadoop/hadoop-2.7.5/sbin/hadoop-daemons.sh start datanode
4、啓動yarn
#在hadoop1上啓動resouremanager
#hadoop1
/home/hadoop/hadoop-2.7.5/sbin/start-yarn.sh
#在hadoop2上啓動備用resouremanager
ssh hadoop2
/home/hadoop/hadoop-2.7.5/sbin/yarn-daemon.sh start resourcemanager
至此,Hadoop 基於zookeeper的高可用集羣就安裝成功,並且啓動了
5、啓動任務歷史服務器
#hadoop1
/home/hadoop/hadoop-2.7.5/sbin/mr-jobhistory-daemon.sh start historyserver
6、查看狀態
HDFS
hadoop@hadoop1 ~]$ hdfs haadmin -getServiceState nn1
standby
[hadoop@hadoop1 ~]$ hdfs haadmin -getServiceState nn2
active
YARN
[hadoop@hadoop1 ~]$ yarn rmadmin -getServiceState rm1
standby
[hadoop@hadoop1 ~]$ yarn rmadmin -getServiceState rm2
active
6、WEB界面進行查看
HDFS
hadoop1
hadoop2
YARN
standby節點會自動跳到avtive節點
任務歷史服務器web界面
jobhistory
重啓hadoop集羣
停止集羣
/home/hadoop/hadoop-2.7.5/sbin/stop-all.sh
#停止所有hadoop進程
/home/hadoop/hadoop-2.7.5/sbin/start-all.sh
#啓動所有hadoop進程
單獨停止或啓動某個進程
sbin/hadoop-daemons.sh start namenode 單獨啓動NameNode守護進程
sbin/hadoop-daemons.sh stop namenode 單獨停止NameNode守護進程
sbin/hadoop-daemons.sh start datanode 單獨啓動DataNode守護進程
sbin/hadoop-daemons.sh stop datanode 單獨停止DataNode守護進程
sbin/yarn-daemon.sh start resourcemanager 單獨啓動ResourceManager
sbin/yarn-daemon.sh stop resourcemanager 單獨停止ResourceManager
sbin/yarn-daemons.sh start nodemanager 單獨啓動NodeManager
sbin/yarn-daemons.sh stopnodemanager 單獨停止NodeManager
sbin/mr-jobhistory-daemon.sh start historyserver 手動啓動jobhistory
sbin/mr-jobhistory-daemon.sh stop historyserver 手動停止jobhistory
我遇到過的問題
整理以下我遇到的問題及解決辦法以供參考
1、hadoop集羣無法啓動
請先查看報錯和日誌信息,日誌在/home/hadoop/hadoop-2.7.5/logs/下。
我遇到的問題是hadoop 9000端口拒絕訪問。
請先查看9000端口監聽情況。
netstat -nlp |grep 9000
監聽的的如果不是本機ip:9000而是127.0.0.1:9000
解決:修改/etc/hosts 文件
vi /etc/hosts
若發現127.0.0.1 與機器名存在映射關係,需要刪除映射關係(如下圖紅色框所示),否則hadoop 會把機器名映射到127.0.0.1 上去。
2、hadoop集羣重啓後不正常
我的hadoop集羣爲3個節點,hadoop集羣重啓後,在資源管理的web界面出現了4個甚至7個Active Nodes,以及Unhealthy Nodes。
然後我再次使用stop-all.sh命令停止集羣,結果發現hadoop2的yarn web界面依然可以訪問。
可能停止集羣后,有些進程依然存在。
解決:先嚐試stop-all.sh命令停止集羣。
使用jps命令查看是否還有hadoop的相關進程。(jps命令用於查看java進程,必須安裝jdk才能使用)
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ACF1cdca-1588842771684)(新建文件夾/15.png)]
如還有hadoop相關進程存在,使用命令單獨停止該進程。
然後我按照上文初次啓動hadoop集羣的方法,再次啓動集羣,集羣成功的正常啓動了。
3、datanode沒有正常啓動
hadoop集羣啓動後,使用jps命令查看,發現沒有datanode。
可能的原因:namenode和datanode的數據不匹配。
hdfs-site.xml
<!-- namenode和datanode的工作目錄-數據存儲目錄 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hadoop/data/hadoopdata/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/hadoop/data/hadoopdata/dfs/data</value>
</property>
格式化namenode後,會在我們配置的/dfs/name/下生成數據,而它和/dfs/data/下的數據不匹配,導致datanode沒有正常啓動
界面出現了4個甚至7個Active Nodes,以及Unhealthy Nodes。
然後我再次使用stop-all.sh命令停止集羣,結果發現hadoop2的yarn web界面依然可以訪問。
可能停止集羣后,有些進程依然存在。
解決:先嚐試stop-all.sh命令停止集羣。
使用jps命令查看是否還有hadoop的相關進程。(jps命令用於查看java進程,必須安裝jdk才能使用)
如還有hadoop相關進程存在,使用命令單獨停止該進程。
然後我按照上文初次啓動hadoop集羣的方法,再次啓動集羣,集羣成功的正常啓動了。
3、datanode沒有正常啓動
hadoop集羣啓動後,使用jps命令查看,發現沒有datanode。
可能的原因:namenode和datanode的數據不匹配。
hdfs-site.xml
<!-- namenode和datanode的工作目錄-數據存儲目錄 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hadoop/data/hadoopdata/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/hadoop/data/hadoopdata/dfs/data</value>
</property>
格式化namenode後,會在我們配置的/dfs/name/下生成數據,而它和/dfs/data/下的數據不匹配,導致datanode沒有正常啓動
解決:刪除/dfs/data/下的所有文件,再次啓動datanode
安裝過程中如遇到什麼問題,請掃關注公衆號:架構師Plus