最近在本身的筆記本電腦上搭建了Apache Hadoop分佈式集羣,採用了最新的穩定版本2.8,並配置了NameNode、ResourceManager的HA高可用,方便平常對Hadoop的研究與測試工做。詳細的搭建過程以下:html
一、安裝docker,建立docker容器,用於搭建hadoop節點java
docker真是個好東西啊,當要在本身的筆記本上搭建分佈式集羣時,因爲CPU、內存、磁盤有限,沒法在VMware上虛擬出太多節點,這時使用docker建立幾個容器,就能輕鬆搭建一個分佈式集羣了。node
(1)先在VMware上安裝centos6.9,做爲宿主機,而後安裝docker,具體過程見我另外一篇博文:Centos6.9安裝dockerlinux
(2)而後再docker hub中拉取centos鏡像,用於建立分佈式集羣的節點,推薦在docker中安裝centos6(docker中的centos7有坑,被坑過,嗚嗚),具體過程見我另外一篇博文:docker中安裝centos6web
(3)centos鏡像準備好後,就開始建立docker容器,用於搭建hadoop的節點docker
# 建立4個節點,用於搭建hadoop docker run -it --name hadoopcentos1 centos:6 /bin/bash docker run -it --name hadoopcentos2 centos:6 /bin/bash docker run -it --name hadoopcentos3 centos:6 /bin/bash docker run -it --name hadoopcentos4 centos:6 /bin/bash # 啓動容器 docker start hadoopcentos1 docker start hadoopcentos2 docker start hadoopcentos3 docker start hadoopcentos4
注意:這時要把宿主機的防火牆關掉、selinux設爲不可用shell
# 關掉防火牆 chkconfig iptables off service iptables stop # 設置 selinux 爲不可用,在config文件中修改SELINUX配置項 vi /etc/selinux/config SELINUX=disabled
二、規劃hadoop集羣apache
本次共建立了4個hadoop節點,並實現NameNode HA、ResourceManager HA,節點規劃以下bootstrap
hadoop集羣節點規劃centos
Docker 容器 | ip地址 | 主機名 | 節點進程 |
---|---|---|---|
hadoopcentos1 | 172.17.0.1 | hd1 | NameNode(active)、JournalNode、Zookeeper、ZKFC |
hadoopcentos2 | 172.17.0.2 | hd2 | NameNode(standby)、JournalNode、Zookeeper、ZKFC、NodeManager、DataNode |
hadoopcentos3 | 172.17.0.3 | hd3 | ResourceManager(active)、JournalNode、Zookeeper、NodeManager、DataNode |
hadoopcentos4 | 172.17.0.4 | hd4 | ResourceManager(standby)、NodeManager、DataNode |
NameNode HA部署在hd一、hd2,ResourceManager HA部署在hd三、hd4,其它進程見上表
三、配置Docker容器基本環境
因爲在Docker中拉取的centos 6鏡像是精簡版本,不少指令沒有,所以,先安裝一些軟件,配置基本環境
進入Docker容器,例如hadoopcentos1
docker exec -it hadoopcentos1 bin/bash
更換yum國內源(每一個節點)
curl http://mirrors.aliyun.com/repo/Centos-6.repo > /etc/yum.repos.d/CentOS-Base-6-aliyun.repo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak yum clean all yum makecache
安裝相關的軟件(每一個節點)
yum install -y net-tools which openssh-clients openssh-server iproute.x86_64
編輯sshd_config文件,將其中的UsePAM改爲no
vi /etc/ssh/sshd_config
啓動ssh(每一個節點)
chkconfig sshd on service sshd start
建立用於安裝apache hadoop的組、帳號
groupadd ahadoop useradd -m -g ahadoop ahadoop
配置主機名映射表
vi /etc/hosts 172.17.0.1 hd1.hdsite hd1 172.17.0.2 hd2.hdsite hd2 172.17.0.3 hd3.hdsite hd3 172.17.0.4 hd4.hdsite hd4 172.17.0.1 31d48048cb1e 172.17.0.2 1620d6ed305d 172.17.0.3 ed3702f8924e 172.17.0.4 ee8319514df6
其中,最後4行的隨機字符串,就是docker容器自動生成的主機名了,每生成一個docker容器就會自動生成一個主機名
四、安裝 JDK
從oracle的官網上面下載 JDK 1.8 Linux x64
建立java目錄,並解壓安裝(使用root用戶,方便之後別的程序也能夠用)
mkdir /usr/java cd /usr/java tar -zxvf jdk-8u131-linux-x64.tar.gz
五、下載 apache hadoop
從apache hadoop的官網上面下載最新的穩定版本 apache hadoop 2.8
切換到 ahadoop 用戶,將hadoop 2.8放於 /home/ahadoop 目錄中,並解壓
su ahadoop cd /home/ahadoop tar -zxvf hadoop-2.8.0.tar.gz
六、配置zookeeper
要實現hadoop namenode HA高可用,且實現故障的自動切換,則要藉助於zookeeper
注意:若是隻是實現namenode HA高可用,是能夠不用zookeeper的,只要配置hadoop的journalnode節點便可實現高可用。而配置zookeeper集羣,主要是爲了監控心跳,實現故障時自動切換,這纔是咱們配置HA高可用的重要目標。
(1)下載zookeeper
到apache zookeeper官方下載最新版本的 zookeeper-3.4.10.tar.gz
(2)配置zookeeper
配置以前,建議閱讀下apache zookeeper官方的配置安裝介紹
zookeeper集羣只能配置奇數個節點,例如三、五、7……,至少要3個及以上,這跟zookeeper的保障機制有關,要確保大多數節點可用,即(n-1)/2,所以節點數必須是奇數
解壓zookeeper(hd1,hd2,hd3)
cd /home/ahadoop tar -zxvf zookeeper-3.4.10.tar.gz
建立zookeeper數據文件(hd1,hd2,hd3),其中不一樣的節點使用myid進行區分,通常使用一、二、3……
mkdir /home/ahadoop/zookeeper-data echo '1' > /home/ahadoop/zookeeper-data/myid echo '2' > /home/ahadoop/zookeeper-data/myid echo '3' > /home/ahadoop/zookeeper-data/myid
配置zoo.cfg配置文件
vi /home/ahadoop/zookeeper-3.4.10/conf/zoo.cfg dataDir=/home/ahadoop/zookeeper-data # 修改zookeeper數據目錄 clientPort=2181 # 默認端口 server.1=hd1:2888:3888 server.2=hd2:2888:3888 server.3=hd3:2888:3888
其中 server.一、server.二、server.3 裏面的 server.x 最後的序號則是不一樣節點的myid文件裏面的id
到此,zookeeper已經配置完畢,使用 zkServer.sh start 命令在每一個節點啓動zookeeper(hd1,hd2,hd3)
使用 zkServer.sh status 便可查看節點的狀態,最後的Mode表示該節點在集羣中的角色,一個zookeeper集羣只有一個leader,其它都是follower
[ahadoop@31d48048cb1e ~]$ zkServer.sh start & [1] 6855 [ahadoop@31d48048cb1e ~]$ ZooKeeper JMX enabled by default Using config: /home/ahadoop/zookeeper-3.4.10/bin/../conf/zoo.cfg Starting zookeeper ... STARTED [1]+ Done zkServer.sh start [ahadoop@1620d6ed305d ~]$ [ahadoop@1620d6ed305d ~]$ [ahadoop@1620d6ed305d ~]$ zkServer.sh status ZooKeeper JMX enabled by default Using config: /home/ahadoop/zookeeper-3.4.10/bin/../conf/zoo.cfg Mode: leader
七、配置hadoop的配置文件
配置hadoop集羣前,建議先閱讀下apache hadoop官網的集羣配置說明,雖然是英文文檔,可是簡單易懂,有助於進一步瞭解hadoop集羣知識,官方的配置介紹以下(p.s. 參照官網裏面的配置說明進行配置,發現有小部分錯誤,直到實際配置時才發現,下面會介紹):
apache hadoop namenode HA(基於QJM)配置官方介紹
apache hadoop resourcemanager HA 配置官方介紹
(1)建立相應的文件夾(每一個節點)
mkdir /home/ahadoop/hadoop-data mkdir /home/ahadoop/hadoop-data/name mkdir /home/ahadoop/hadoop-data/data mkdir /home/ahadoop/hadoop-data/checkpoint mkdir /home/ahadoop/hadoop-data/tmp mkdir /home/ahadoop/hadoop-data/log mkdir /home/ahadoop/hadoop-data/journalnode
主文件夾爲hadoop-data,其中:
name:存放namenode的數據
data:存放datanode的數據
checkpoint:存在namenode的checkpoint數據
tmp:臨時文件
log:存放日誌
journalnode:存在jounalnode的數據
(2)配置core-site.xml配置文件
官方提供了默認的 core-default.xml 配置文件可供參考,但內容不少,咱們可根據須要進行配置
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://hdcluster</value> </property> <property> <name>dfs.journalnode.edits.dir</name> <value>/home/ahadoop/hadoop-data/journalnode</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/home/ahadoop/hadoop-data/tmp</value> </property> <property> <name>fs.trash.interval</name> <value>1440</value> </property> <property> <name>io.file.buffer.size</name> <value>65536</value> </property> <property> <name>ha.zookeeper.quorum</name> <value>hd1:2181,hd2:2181,hd3:2181</value> </property> </configuration>
其中,
fs.defaultFS:表示集羣namenode的地址,對於namenode HA來講,須要取一個cluster id來做區分,以便於區分跟hadoop聯邦的其它namenode,這裏取hdcluster做爲該集羣的ID
dfs.journalnode.edits.dir、hadoop.tmp.dir:表示journalnode的數據文件路徑、臨時文件路徑
fs.trash.interval:表示回收站的保留時間(分鐘),也即hdfs的文件刪除後,在回收站裏面保留的時長
io.file.buffer.size:表示讀取文件的字節數(byte)
ha.zookeeper.quorum:表示zookeeper集羣的主機與端口
(3)配置hdfs-site.xml配置文件
官方提供了默認的 hdfs-default.xml 配置文件 可供參考,根據須要進行配置以下
<configuration> <property> <name>dfs.replication</name> <value>3</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>/home/ahadoop/hadoop-data/name</value> </property> <property> <name>dfs.blocksize</name> <value>67108864</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>/home/ahadoop/hadoop-data/data</value> </property> <property> <name>dfs.namenode.checkpoint.dir</name> <value>/home/ahadoop/hadoop-data/checkpoint</value> </property> <property> <name>dfs.namenode.handler.count</name> <value>10</value> </property> <property> <name>dfs.datanode.handler.count</name> <value>10</value> </property> <property> <name>dfs.nameservices</name> <value>hdcluster</value> </property> <property> <name>dfs.ha.namenodes.hdcluster</name> <value>nn1,nn2</value> </property> <property> <name>dfs.namenode.rpc-address.hdcluster.nn1</name> <value>hd1:9000</value> </property> <property> <name>dfs.namenode.rpc-address.hdcluster.nn2</name> <value>hd2:9000</value> </property> <property> <name>dfs.namenode.http-address.hdcluster.nn1</name> <value>hd1:50070</value> </property> <property> <name>dfs.namenode.http-address.hdcluster.nn2</name> <value>hd2:50070</value> </property> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://hd1:8485;hd2:8485;hd3:8485/hdcluster</value> </property> <property> <name>dfs.client.failover.proxy.provider.hdcluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <property> <name>dfs.ha.automatic-failover.enabled.hdcluster</name> <value>true</value> </property> <property> <name>dfs.ha.fencing.methods</name> <value>shell(/bin/true)</value> </property> </configuration>
其中:
dfs.replication:表示hdfs的數據塊備份數量,默認是3
dfs.namenode.name.dir,dfs.datanode.data.dir,dfs.namenode.checkpoint.dir:表示namenode、datanode、checkpoint的數據路徑
dfs.blocksize:表示數據塊的大小,默認爲64M,可根據須要改成128M,甚至256M
dfs.namenode.handler.count、dfs.datanode.handler.count:表示在namenode、datanode的進程數
dfs.nameservices:表示集羣namenode的ID,這裏命名爲hdcluster,注意要跟 core-size.xml 裏面的配置項 fs.defaultFS 中的集羣ID一致
dfs.ha.namenodes.hdcluster:表示namenode的id,這裏有兩個namenode節點,所以使用nn1,nn2命名
dfs.namenode.rpc-address.hdcluster.nn1,dfs.namenode.rpc-address.hdcluster.nn2:表示nn一、nn2的遠程調用主機和端口
dfs.namenode.http-address.hdcluster.nn1,dfs.namenode.http-address.hdcluster.nn2:表示 nn一、nn2的所在節點http服務和端口
dfs.namenode.shared.edits.dir:表示namenode共享的元數據路徑,在配置HA時,使用journalnode來保存元數據,維持namenode元數據的一致性
dfs.client.failover.proxy.provider.hdcluster:表示HDFS客戶端鏈接到Active NameNode的一個java類(默認)
dfs.ha.automatic-failover.enabled.hdcluster:表示當namenode ha的active namenode出現故障時,是否自動切換(固然要設置爲true了,^^)
dfs.ha.fencing.methods:表示故障時自動切換使用的方法
【敲黑板,注意了同窗們,如下是重點】官方給的例子配置值是sshfence,但經試驗,使用這種方式根本就不會自動切換,而是namenode active故障時,namenode standby仍舊是standby,只有咱們登錄到namenode active故障節點,再將故障的namenode從新恢復啓動後,原先的namenode standby纔會自動切換爲namenode active,(心中忽然萬馬奔騰啊……),這根本不是咱們配置高可用的目的啊
經研究,fencing的方法目前有兩種:sshfence和shell。其中:
(4)配置mapred-site.xml
官方提供了默認的 mapred-default.xml 配置文件 可供參考,咱們的配置以下
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
該配置表示使用yarn框架
(5)配置yarn-site.xml
官方提供了默認的 yarn-default.xml 配置文件 可供參考,再結合 ResourceManager HA 的官方介紹,配置以下
<configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <property> <name>yarn.resourcemanager.cluster-id</name> <value>hdcluster</value> </property> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>hd3</value> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>hd4</value> </property> <property> <name>yarn.resourcemanager.webapp.address.rm1</name> <value>hd3:8088</value> </property> <property> <name>yarn.resourcemanager.webapp.address.rm2</name> <value>hd4:8088</value> </property> <property> <name>yarn.resourcemanager.zk-address</name> <value>hd1:2181,hd2:2181,hd3:2181</value> </property> </configuration>
其中,
yarn.nodemanager.aux-services:NodeManager上運行的附屬服務,需配置成mapreduce_shuffle,纔可運行MapReduce程序,不然會報錯
yarn.resourcemanager.ha.enabled:表示啓動resourcemanager HA高可用
yarn.resourcemanager.cluster-id:表示resourcemanager的集羣ID,不要與別的集羣混淆便可,這裏命名爲hdcluster
yarn.resourcemanager.ha.rm-ids:表示resourcemanager的節點id,這裏有兩個節點,使用rm1,rm2做爲ID
yarn.resourcemanager.hostname.rm1,yarn.resourcemanager.hostname.rm2:表示rm1,rm2的主機,這裏取hd三、hd4
yarn.resourcemanager.webapp.address.rm1,yarn.resourcemanager.webapp.address.rm2:表示rm1,rm2的網頁訪問地址和端口,也即經過該地址和端口可訪問做業狀況
yarn.resourcemanager.zk-address:表示使用zookeeper來協助管理resourcemanager主備的zookeeper集羣主機與端口
(6)配置slave節點主機
配置hadoop分佈式集羣的slaves節點主機列表,也即datanode運行的節點,這裏取hd二、hd三、hd4
vi /home/ahadoop/hadoop-2.8.0/etc/hadoop/slaves # 配置slave主機 hd2 hd3 hd4
(7)配置log4j日誌 log4j.properties
根據須要修改log4j的日誌保存路徑,以及日誌輸出的粒度
vi /home/ahadoop/hadoop-2.8.0/etc/hadoop/log4j.properties # 修改日誌的路徑 hadoop.log.dir=/home/ahadoop/hadoop-data/log
(8)配置bash的環境變量
編輯.bash_profile文件,配置環境變量,方便平常執行命令
vi /home/ahadoop/.bash_profile # 在 .bash_profile 末尾增長如下配置 export JAVA_HOME=/usr/java/jdk1.8.0_131 export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$PATH:$JAVA_HOME/bin export HADOOP_HOME=/home/ahadoop/hadoop-2.8.0 export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin export ZOOKEEPER_HOME=/home/ahadoop/zookeeper-3.4.10 export PATH=$PATH:$ZOOKEEPER_HOME/bin
配置後,使用source命令使其生效
source /home/ahadoop/.bash_profile
八、格式hadoop namenode,並啓動hadoop分佈式集羣
經過以上的配置文件,已完成了hadoop集羣的配置。在首次運行hadoop集羣時,須先進行namenode的格式化,而後再啓動整個集羣。
注意:只有第一次運行,才須要格式化namenode哦,之後就不用了,不然一格式化將會清空整個集羣的元數據和數據塊
hadoop的sbin目錄裏面提供了便捷的啓動腳本
在本測試中,即是使用hdfs、yarn來啓動節點
首次使用hadoop分佈式集羣時,須要格式化namenode,並同步ha狀態到zookeeper,啓動的順序以下:
# 首次格式化啓動順序 # 啓動 zookeeper(hd1,hd2,hd3) zkServer.sh start & # 啓動 journalnode(hd1,hd2,hd3) hdfs journalnode & # 格式化 namenode(hd1) hdfs namenode -format # 初始化 HA 狀態到 zk(hd1) hdfs zkfc -formatZK & # 啓動 namenode active(hd1) hdfs namenode & # 同步 namenode(hd2) hdfs namenode -bootstrapStandby # 啓動 namenode standby(hd2) hdfs namenode & # 啓動ZookeeperFailoverController(hd1,hd2) hdfs zkfc & # 啓動 datanode(hd2,hd3,hd4) hdfs datanode & # 啓動 resourcemanager(hd3,hd4) yarn resourcemanager & # 啓動 nodemanager(hd2,hd3,hd4) yarn nodemanager &
啓動後,使用jps在各個節點,查看進程的啓動狀況
# hd1 [ahadoop@31d48048cb1e ~]$ jps 8976 NameNode 8803 JournalNode 9172 Jps 9092 DFSZKFailoverController 8750 QuorumPeerMain # hd2 [ahadoop@1620d6ed305d ~]$ jps 7428 QuorumPeerMain 7636 NameNode 8021 Jps 7719 DFSZKFailoverController 7784 DataNode 7884 NodeManager 7487 JournalNode # hd3 [ahadoop@ed3702f8924e ~]$ jps 4320 QuorumPeerMain 4451 DataNode 4900 Jps 4772 NodeManager 4373 JournalNode 4540 ResourceManager # hd4 [ahadoop@ee8319514df6 ~]$ jps 4578 NodeManager 4707 Jps 4489 DataNode 4508 ResourceManager
至今,整個集羣就成功啓動了
若是之後使用時,就不用再格式化namenode了(不然數據會完蛋),那麼正常狀況下,集羣啓動的順序爲
# 平常使用的啓動順序 # 啓動 zookeeper(hd1,hd2,hd3) zkServer.sh start & # 啓動 journalnode(hd1,hd2,hd3) hdfs journalnode & # 啓動 namenode active(hd1) hdfs namenode & # 啓動 namenode standby(hd2) hdfs namenode & # 啓動ZookeeperFailoverController(hd1,hd2) hdfs zkfc & # 啓動 datanode(hd2,hd3,hd4) hdfs datanode & # 啓動 resourcemanager(hd3,hd4) yarn resourcemanager & # 啓動 nodemanager(hd2,hd3,hd4) yarn nodemanager &
九、hadoop集羣測試
集羣啓動後,在瀏覽器輸入如下網址查看namenode、resourcemanager的狀態
輸入網址 http://172.17.0.1:50070 查看 namenode(active)節點信息
輸入網址 http://172.17.0.2:50070 查看 namenode(standby)節點信息
輸入網址 http://172.17.0.3:8088 查看 resourcemanager 節點信息
使用官網的例子,測試集羣的map-reduce
這個例子是使用了hadoop自帶的map-reduce jar包,對etc/hadoop的xml配置文件裏面的配置項進行數量統計(相似於經典的wordcount測試)
具體步驟以下:
# 建立 hdfs 目錄 hdfs dfs -mkdir /user hdfs dfs -mkdir /user/ahadoop hdfs dfs -mkdir input # 上傳 etc/hadoop 的 xml 配置文件 hdfs dfs -put /home/ahadoop/hadoop-2.8.0/etc/hadoop/*.xml input # 執行自帶的 map reduce jar程序 hadoop jar /home/ahadoop/hadoop-2.8.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.0.jar grep input output 'dfs[a-z.]+' # 獲取執行結果 hdfs dfs -get output output # 查看執行結果 cat output/*
執行後,結果以下
從上圖可看出,使用map reduce統計了配置項的數量結果
十、hadoop 集羣的 HA 測試
hadoop 集羣的 HA 高可用性是本次搭建集羣的重要目標,下面將對 hadoop 集羣的 namenode ha、resourcemanager ha 進行測試
(1)namenode ha 測試
目前 hd1 的 namenode 是 active 狀態,hd2 的 namenode 是 standby 狀態,簡單粗暴地對 hd1 的 namenode 進行 kill 掉,也就是使 hd1 的 namenode 發生故障,這時再看 hd2 的 namenode ,會發現已自動切換爲 active 狀態
說明 namenode ha 故障自動切換成功
(2)resourcemanager ha 測試
hd三、hd4的resourcemanager ha,打開網頁後並無看到 active、standby 狀態,這時若是 hd3 是 active狀態,輸入 http://172.17.0.3:8088 可看到resourcemanger頁面。而輸入 http://172.17.0.4:8088 時,則會自動切換回 htttp://172.17.0.3:8088 頁面。
這裏經過後臺可查看兩個resourcemanager的狀態,命令以下
# 查看 resourcemanager 狀態 [ahadoop@ed3702f8924e ~]$ yarn rmadmin -getServiceState rm1 active [ahadoop@ed3702f8924e ~]$ yarn rmadmin -getServiceState rm2 standby
在測試resourcemanager ha時,將active節點的resourcemanager進行kill掉,這時再查看rm2狀態,會發現已經變量 active 狀態
[ahadoop@ed3702f8924e ~]$ yarn rmadmin -getServiceState rm2 active
可經過如下指令進行 active、standby 狀態切換(--forcemanual 表示強制)
# 切換 resourcemanager 主備 # 切換爲 standby 狀態 yarn rmadmin -transitionToStandby --forcemanual rm2 # 切換爲 active 狀態 yarn rmadmin -transitionToActive --forcemanual rm1
注意,這裏若是是active狀態的強制切換爲standby,是能夠成功切換,也就是說兩個節點都是standby狀態。但若是已經有一個active狀態的,這時再將另外一個standby狀態切換爲active狀態,則沒法進行切換,系統提示已經有一個active狀態的節點了。
[ahadoop@ee8319514df6 ~]$ yarn rmadmin -transitionToActive --forcemanual rm2 You have specified the --forcemanual flag. This flag is dangerous, as it can induce a split-brain scenario that WILL CORRUPT your HDFS namespace, possibly irrecoverably. It is recommended not to use this flag, but instead to shut down the cluster and disable automatic failover if you prefer to manually manage your HA state. You may abort safely by answering 'n' or hitting ^C now. Are you sure you want to continue? (Y or N) Y 17/06/18 16:53:01 WARN ha.HAAdmin: Proceeding with manual HA state management even though automatic failover is enabled for org.apache.hadoop.yarn.client.RMHAServiceTarget@3444d69d 17/06/18 16:53:02 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable transitionToActive: Node rm1 is already active Usage: rmadmin [-transitionToActive [--forceactive] <serviceId>]
十一、hadoop分佈式集羣簡單搭建
上面的配置是針對namenode ha、resourcemanager ha進行配置,會比較複雜,若是隻是要簡單地搭建一個hadoop分佈式集羣,暫時不用配置namenode ha、resourcemanager ha的,則配置會簡單不少,如下給出hadoop分佈式集羣簡單搭建的相關配置,以下
(1)core-site.xml
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://hd1:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/home/ahadoop/hadoop-data/tmp</value> </property> <property> <name>fs.trash.interval</name> <value>1440</value> </property> <property> <name>io.file.buffer.size</name> <value>65536</value> </property> </configuration>
(2)hdfs-site.xml
<configuration> <property> <name>dfs.replication</name> <value>3</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>/home/ahadoop/hadoop-data/name</value> </property> <property> <name>dfs.blocksize</name> <value>67108864</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>/home/ahadoop/hadoop-data/data</value> </property> <property> <name>dfs.namenode.checkpoint.dir</name> <value>/home/ahadoop/hadoop-data/checkpoint</value> </property> <property> <name>dfs.namenode.handler.count</name> <value>10</value> </property> <property> <name>dfs.datanode.handler.count</name> <value>10</value> </property> </configuration>
(3)mapred-site.xml
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
(4)yarn-site.xml
<configuration> <property> <name>yarn.resourcemanager.hostname</name> <value>hd3</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration>
(5)slaves
hd2 hd3 hd4
(6).bash_profile
# 設置環境變量 vi /home/ahadoop/.bash_profile export JAVA_HOME=/usr/java/jdk1.8.0_131 export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$PATH:$JAVA_HOME/bin export HADOOP_HOME=/home/ahadoop/hadoop-2.8.0 export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
(7)格式化namenode,啓動hadoop集羣
# 格式化 namenode(hd1) hdfs namenode -format # 啓動 namenode(hd1) hdfs namenode & # 啓動 secondarynamenode(hd2) hdfs secondarynamenode & # 啓動 datanode(hd二、hd三、hd4) hdfs datanode & # 啓動 resourcemanager(hd2) yarn resoucemanager & # 啓動 nodemanager(hd二、hd三、hd4) hdfs nodemanager &
(8)訪問namenode、resourcemanager頁面
訪問 namenode 頁面
http://172.17.0.1:50070
訪問 resourcemanager 頁面
http://172.17.0.2:8088
十二、apache hadoop官方配置文檔的一些問題
(1)官網給的namenode ha配置說明文檔,裏面關於自動切換故障的配置,官網給的配置是(hdfs-site.xml)
<property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property>
而實際在配置時,後面還要加上集羣ID,本測試的集羣ID是hdcluster,所以正常的配置是
<property> <name>dfs.ha.automatic-failover.enabled.hdcluster</name> <value>true</value> </property>
(2)關於啓動命令的問題
官網給的hadoop集羣配置的說明文檔,裏面關於節點進程的啓動命令爲:
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start namenode [hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start datanode [yarn]$ $HADOOP_HOME/bin/yarn --daemon start resourcemanager [yarn]$ $HADOOP_HOME/bin/yarn --daemon start nodemanager
但實際沒法執行(也有多是3.0 beta版的指令,沒試過),執行會提示
[ahadoop@31d48048cb1e ~]$ hdfs --daemon start namenode Unrecognized option: --daemon Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit.
不支持 --daemon 這個參數,所以,實際在啓動這些節點進程時,啓動命令爲
[hdfs]$ $HADOOP_HOME/bin/hdfs namenode [hdfs]$ $HADOOP_HOME/bin/hdfs datanode [yarn]$ $HADOOP_HOME/bin/yarn resourcemanager [yarn]$ $HADOOP_HOME/bin/yarn nodemanager
歡迎關注本人的微信公衆號「大數據與人工智能Lab」(BigdataAILab),獲取更多資訊