您好,登錄后才能下訂單哦!
這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)Apache Hadoop 2.8 完全分布式集群搭建過程是怎樣的,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
最近在自己的筆記本電腦上搭建了Apache Hadoop分布式集群,采用了最新的穩(wěn)定版本2.8,并配置了NameNode、ResourceManager的HA高可用,方便日常對(duì)Hadoop的研究與測(cè)試工作。詳細(xì)的搭建過程如下:
1、安裝docker,創(chuàng)建docker容器,用于搭建hadoop節(jié)點(diǎn)
docker真是個(gè)好東西啊,當(dāng)要在自己的筆記本上搭建分布式集群時(shí),由于CPU、內(nèi)存、磁盤有限,無法在VMware上虛擬出太多節(jié)點(diǎn),這時(shí)使用docker創(chuàng)建幾個(gè)容器,就能輕松搭建一個(gè)分布式集群了。
(1)先在VMware上安裝centos6.9,作為宿主機(jī),然后安裝docker,具體過程見我另一篇博文:Centos6.9安裝docker
(2)然后再docker hub中拉取centos鏡像,用于創(chuàng)建分布式集群的節(jié)點(diǎn),推薦在docker中安裝centos6(docker中的centos7有坑,被坑過,嗚嗚),具體過程見我另一篇博文:docker中安裝centos6
(3)centos鏡像準(zhǔn)備好后,就開始創(chuàng)建docker容器,用于搭建hadoop的節(jié)點(diǎn)
# 創(chuàng)建4個(gè)節(jié)點(diǎn),用于搭建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 # 啟動(dòng)容器 docker start hadoopcentos1 docker start hadoopcentos2 docker start hadoopcentos3 docker start hadoopcentos4
注意:這時(shí)要把宿主機(jī)的防火墻關(guān)掉、selinux設(shè)為不可用
# 關(guān)掉防火墻 chkconfig iptables off service iptables stop # 設(shè)置 selinux 為不可用,在config文件中修改SELINUX配置項(xiàng) vi /etc/selinux/config SELINUX=disabled
2、規(guī)劃hadoop集群
本次共創(chuàng)建了4個(gè)hadoop節(jié)點(diǎn),并實(shí)現(xiàn)NameNode HA、ResourceManager HA,節(jié)點(diǎn)規(guī)劃如下
hadoop集群節(jié)點(diǎn)規(guī)劃
Docker 容器 | ip地址 | 主機(jī)名 | 節(jié)點(diǎn)進(jìn)程 |
---|---|---|---|
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部署在hd1、hd2,ResourceManager HA部署在hd3、hd4,其它進(jìn)程見上表
3、配置Docker容器基本環(huán)境
由于在Docker中拉取的centos 6鏡像是精簡(jiǎn)版本,很多指令沒有,因此,先安裝一些軟件,配置基本環(huán)境
進(jìn)入Docker容器,例如hadoopcentos1
docker exec -it hadoopcentos1 bin/bash
更換yum國(guó)內(nèi)源(每個(gè)節(jié)點(diǎn))
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
安裝相關(guān)的軟件(每個(gè)節(jié)點(diǎn))
yum install -y net-tools which openssh-clients openssh-server iproute.x86_64
編輯sshd_config文件,將其中的UsePAM改成no
vi /etc/ssh/sshd_config
啟動(dòng)ssh(每個(gè)節(jié)點(diǎn))
chkconfig sshd on service sshd start
創(chuàng)建用于安裝apache hadoop的組、賬號(hào)
groupadd ahadoop useradd -m -g ahadoop ahadoop
配置主機(jī)名映射表
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行的隨機(jī)字符串,就是docker容器自動(dòng)生成的主機(jī)名了,每生成一個(gè)docker容器就會(huì)自動(dòng)生成一個(gè)主機(jī)名
4、安裝 JDK
從oracle的官網(wǎng)上面下載 JDK 1.8 Linux x64
創(chuàng)建java目錄,并解壓安裝(使用root用戶,方便以后別的程序也可以用)
mkdir /usr/java cd /usr/java tar -zxvf jdk-8u131-linux-x64.tar.gz
5、下載 apache hadoop
從apache hadoop的官網(wǎng)上面下載最新的穩(wěn)定版本 apache hadoop 2.8
切換到 ahadoop 用戶,將hadoop 2.8放于 /home/ahadoop 目錄中,并解壓
su ahadoop cd /home/ahadoop tar -zxvf hadoop-2.8.0.tar.gz
6、配置zookeeper
要實(shí)現(xiàn)hadoop namenode HA高可用,且實(shí)現(xiàn)故障的自動(dòng)切換,則要借助于zookeeper
注意:如果只是實(shí)現(xiàn)namenode HA高可用,是可以不用zookeeper的,只要配置hadoop的journalnode節(jié)點(diǎn)即可實(shí)現(xiàn)高可用。而配置zookeeper集群,主要是為了監(jiān)控心跳,實(shí)現(xiàn)故障時(shí)自動(dòng)切換,這才是我們配置HA高可用的重要目標(biāo)。
(1)下載zookeeper
到apache zookeeper官方下載最新版本的 zookeeper-3.4.10.tar.gz
(2)配置zookeeper
配置之前,建議閱讀下apache zookeeper官方的配置安裝介紹
zookeeper集群只能配置奇數(shù)個(gè)節(jié)點(diǎn),例如3、5、7……,至少要3個(gè)及以上,這跟zookeeper的保障機(jī)制有關(guān),要確保大多數(shù)節(jié)點(diǎn)可用,即(n-1)/2,因此節(jié)點(diǎn)數(shù)必須是奇數(shù)
解壓zookeeper(hd1,hd2,hd3)
cd /home/ahadoop tar -zxvf zookeeper-3.4.10.tar.gz
創(chuàng)建zookeeper數(shù)據(jù)文件(hd1,hd2,hd3),其中不同的節(jié)點(diǎn)使用myid進(jìn)行區(qū)分,一般使用1、2、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數(shù)據(jù)目錄 clientPort=2181 # 默認(rèn)端口 server.1=hd1:2888:3888 server.2=hd2:2888:3888 server.3=hd3:2888:3888
其中 server.1、server.2、server.3 里面的 server.x 最后的序號(hào)則是不同節(jié)點(diǎn)的myid文件里面的id
到此,zookeeper已經(jīng)配置完畢,使用 zkServer.sh start 命令在每個(gè)節(jié)點(diǎn)啟動(dòng)zookeeper(hd1,hd2,hd3)
使用 zkServer.sh status 即可查看節(jié)點(diǎn)的狀態(tài),最后的Mode表示該節(jié)點(diǎn)在集群中的角色,一個(gè)zookeeper集群只有一個(gè)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
7、配置hadoop的配置文件
配置hadoop集群前,建議先閱讀下apache hadoop官網(wǎng)的集群配置說明,雖然是英文文檔,但是簡(jiǎn)單易懂,有助于進(jìn)一步了解hadoop集群知識(shí),官方的配置介紹如下(p.s. 參照官網(wǎng)里面的配置說明進(jìn)行配置,發(fā)現(xiàn)有小部分錯(cuò)誤,直到實(shí)際配置時(shí)才發(fā)現(xiàn),下面會(huì)介紹):
apache hadoop 單節(jié)點(diǎn)配置官方介紹
apache hadoop 集群配置官方介紹
apache hadoop namenode HA(基于QJM)配置官方介紹
apache hadoop resourcemanager HA 配置官方介紹
(1)創(chuàng)建相應(yīng)的文件夾(每個(gè)節(jié)點(diǎn))
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的數(shù)據(jù)
data:存放datanode的數(shù)據(jù)
checkpoint:存在namenode的checkpoint數(shù)據(jù)
tmp:臨時(shí)文件
log:存放日志
journalnode:存在jounalnode的數(shù)據(jù)
(2)配置core-site.xml配置文件
官方提供了默認(rèn)的 core-default.xml 配置文件可供參考,但內(nèi)容很多,我們可根據(jù)需要進(jìn)行配置
<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的地址,對(duì)于namenode HA來說,需要取一個(gè)cluster id來作區(qū)分,以便于區(qū)分跟hadoop聯(lián)邦的其它namenode,這里取hdcluster作為該集群的ID
dfs.journalnode.edits.dir、hadoop.tmp.dir:表示journalnode的數(shù)據(jù)文件路徑、臨時(shí)文件路徑
fs.trash.interval:表示回收站的保留時(shí)間(分鐘),也即hdfs的文件刪除后,在回收站里面保留的時(shí)長(zhǎng)
io.file.buffer.size:表示讀取文件的字節(jié)數(shù)(byte)
ha.zookeeper.quorum:表示zookeeper集群的主機(jī)與端口
(3)配置hdfs-site.xml配置文件
官方提供了默認(rèn)的 hdfs-default.xml 配置文件 可供參考,根據(jù)需要進(jìn)行配置如下
<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的數(shù)據(jù)塊備份數(shù)量,默認(rèn)是3
dfs.namenode.name.dir,dfs.datanode.data.dir,dfs.namenode.checkpoint.dir:表示namenode、datanode、checkpoint的數(shù)據(jù)路徑
dfs.blocksize:表示數(shù)據(jù)塊的大小,默認(rèn)為64M,可根據(jù)需要改為128M,甚至256M
dfs.namenode.handler.count、dfs.datanode.handler.count:表示在namenode、datanode的進(jìn)程數(shù)
dfs.nameservices:表示集群namenode的ID,這里命名為hdcluster,注意要跟 core-size.xml 里面的配置項(xiàng) fs.defaultFS 中的集群ID一致
dfs.ha.namenodes.hdcluster:表示namenode的id,這里有兩個(gè)namenode節(jié)點(diǎn),因此使用nn1,nn2命名
dfs.namenode.rpc-address.hdcluster.nn1,dfs.namenode.rpc-address.hdcluster.nn2:表示nn1、nn2的遠(yuǎn)程調(diào)用主機(jī)和端口
dfs.namenode.http-address.hdcluster.nn1,dfs.namenode.http-address.hdcluster.nn2:表示 nn1、nn2的所在節(jié)點(diǎn)http服務(wù)和端口
dfs.namenode.shared.edits.dir:表示namenode共享的元數(shù)據(jù)路徑,在配置HA時(shí),使用journalnode來保存元數(shù)據(jù),維持namenode元數(shù)據(jù)的一致性
dfs.client.failover.proxy.provider.hdcluster:表示HDFS客戶端連接到Active NameNode的一個(gè)java類(默認(rèn))
dfs.ha.automatic-failover.enabled.hdcluster:表示當(dāng)namenode ha的active namenode出現(xiàn)故障時(shí),是否自動(dòng)切換(當(dāng)然要設(shè)置為true了,^^)
dfs.ha.fencing.methods:表示故障時(shí)自動(dòng)切換使用的方法
【敲黑板,注意了同學(xué)們,以下是重點(diǎn)】官方給的例子配置值是sshfence,但經(jīng)試驗(yàn),使用這種方式根本就不會(huì)自動(dòng)切換,而是namenode active故障時(shí),namenode standby仍舊是standby,只有我們登陸到namenode active故障節(jié)點(diǎn),再將故障的namenode重新恢復(fù)啟動(dòng)后,原先的namenode standby才會(huì)自動(dòng)切換為namenode active,(心中突然萬馬奔騰啊……),這根本不是我們配置高可用的目的啊
經(jīng)研究,fencing的方法目前有兩種:sshfence和shell。其中:
sshfence方法:是指通過ssh登陸到active namenode節(jié)點(diǎn)殺掉namenode進(jìn)程,所以還需要設(shè)置ssh無密碼登陸,還要保證有殺掉namenode進(jìn)程的權(quán)限
shell方法:是指運(yùn)行一個(gè)shell腳本/命令來防止兩個(gè)namenode同時(shí)處于active,腳本需要自己寫。但其實(shí)QJM模式本身就有fencing功能,能保證只有一個(gè)namenode能往journalnode上寫edits文件,所以是不需要設(shè)置fencing的方法就能實(shí)現(xiàn)的。但是,在發(fā)生failover的時(shí)候,原來的active namenode可能還在接受客戶端的讀請(qǐng)求,這樣客戶端很可能讀到一些過時(shí)的數(shù)據(jù)(因?yàn)樾碌腶ctive namenode的數(shù)據(jù)已經(jīng)實(shí)時(shí)更新了)。因此,還是建議設(shè)置fencing方法。如果確實(shí)不想設(shè)置fencing方法,可以設(shè)置一個(gè)能返回成功(沒有fencing作用)的方法,如“shell(/bin/true)”。這個(gè)純粹為了fencing方法能夠成功返回,并不需要真的有fencing作用。這樣可以提高系統(tǒng)的可用性,即使在fencing機(jī)制失敗的時(shí)候還能保持系統(tǒng)的可用性。
(4)配置mapred-site.xml
官方提供了默認(rèn)的 mapred-default.xml 配置文件 可供參考,我們的配置如下
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
該配置表示使用yarn框架
(5)配置yarn-site.xml
官方提供了默認(rèn)的 yarn-default.xml 配置文件 可供參考,再結(jié)合 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上運(yùn)行的附屬服務(wù),需配置成mapreduce_shuffle,才可運(yùn)行MapReduce程序,否則會(huì)報(bào)錯(cuò)
yarn.resourcemanager.ha.enabled:表示啟動(dòng)resourcemanager HA高可用
yarn.resourcemanager.cluster-id:表示resourcemanager的集群ID,不要與別的集群混淆即可,這里命名為hdcluster
yarn.resourcemanager.ha.rm-ids:表示resourcemanager的節(jié)點(diǎn)id,這里有兩個(gè)節(jié)點(diǎn),使用rm1,rm2作為ID
yarn.resourcemanager.hostname.rm1,yarn.resourcemanager.hostname.rm2:表示rm1,rm2的主機(jī),這里取hd3、hd4
yarn.resourcemanager.webapp.address.rm1,yarn.resourcemanager.webapp.address.rm2:表示rm1,rm2的網(wǎng)頁訪問地址和端口,也即通過該地址和端口可訪問作業(yè)情況
yarn.resourcemanager.zk-address:表示使用zookeeper來協(xié)助管理resourcemanager主備的zookeeper集群主機(jī)與端口
(6)配置slave節(jié)點(diǎn)主機(jī)
配置hadoop分布式集群的slaves節(jié)點(diǎn)主機(jī)列表,也即datanode運(yùn)行的節(jié)點(diǎn),這里取hd2、hd3、hd4
vi /home/ahadoop/hadoop-2.8.0/etc/hadoop/slaves # 配置slave主機(jī) hd2 hd3 hd4
(7)配置log4j日志 log4j.properties
根據(jù)需要修改log4j的日志保存路徑,以及日志輸出的粒度
vi /home/ahadoop/hadoop-2.8.0/etc/hadoop/log4j.properties # 修改日志的路徑 hadoop.log.dir=/home/ahadoop/hadoop-data/log
(8)配置bash的環(huán)境變量
編輯.bash_profile文件,配置環(huán)境變量,方便日常執(zhí)行命令
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
8、格式hadoop namenode,并啟動(dòng)hadoop分布式集群
通過以上的配置文件,已完成了hadoop集群的配置。在首次運(yùn)行hadoop集群時(shí),須先進(jìn)行namenode的格式化,然后再啟動(dòng)整個(gè)集群。
注意:只有第一次運(yùn)行,才需要格式化namenode哦,以后就不用了,否則一格式化將會(huì)清空整個(gè)集群的元數(shù)據(jù)和數(shù)據(jù)塊
hadoop的sbin目錄里面提供了便捷的啟動(dòng)腳本
最簡(jiǎn)單的有start-all.sh、stop-all.sh腳本,可直接啟動(dòng)/終止整個(gè)hadoop集群,使用這兩個(gè)命令,必須實(shí)現(xiàn)集群節(jié)點(diǎn)ssh免密碼登錄,如在hd1主機(jī)執(zhí)行這些命令,則須實(shí)現(xiàn)hd1免密碼登錄到hd2、hd3、hd4。在生產(chǎn)環(huán)境中,不推薦使用start-all.sh、stop-all.sh來維護(hù)整個(gè)集群,可能啟動(dòng)/終止過程會(huì)出現(xiàn)什么問題,影響到整個(gè)集群。在個(gè)人測(cè)試環(huán)節(jié),則請(qǐng)便,怎么6、怎么來。
另外,還提供了start-dfs.sh、stop-dfs.sh來啟動(dòng)/終止hdfs,start-yarn.sh、stop-yarn.sh來啟動(dòng)/終止yarn,同樣需要實(shí)現(xiàn)集群節(jié)點(diǎn)的ssh免密碼登錄,在生產(chǎn)環(huán)境,也不推薦使用這種方式。在個(gè)人測(cè)試環(huán)節(jié),則請(qǐng)便,怎么6、怎么來。
第三,還提供了hadoop-daemon.sh,yarn-daemon.sh來啟動(dòng)/終止hdfs、yarn,使用方法如下,當(dāng)執(zhí)行hadoop-daemon.sh start namenode,則是啟動(dòng)namenode(secondaryname、datanode、journalnode等類似),使用stop則是終止;當(dāng)執(zhí)行yarn-daemon.sh start resourcemanager,則是啟動(dòng)resourcemanager(nodemanager類似),使用stop則是終止。使用這種啟動(dòng)方式,需要各個(gè)節(jié)點(diǎn),逐一啟動(dòng)相應(yīng)的進(jìn)程,無須實(shí)現(xiàn)ssh免密碼登錄。這種方式的好處在于,某個(gè)節(jié)點(diǎn)的進(jìn)程啟動(dòng)/終止,如果有問題,不會(huì)影響到整個(gè)集群,但管理員必須對(duì)整個(gè)集群的節(jié)點(diǎn)功能分布非常清楚。
第四,hadoop新版本還提供了hdfs、yarn的進(jìn)程啟動(dòng)/終止方式(位于hadoop的bin目錄),使用方法如下,hdfs namenode,則是啟動(dòng)namenode(secondaryname、datanode、journalnode等類似),那如果要終止呢???kill吧,kill 相應(yīng)的進(jìn)程會(huì)自動(dòng)調(diào)用終止程序;yarn resourcemanager,則是啟動(dòng)resourcemanager(nodemanager類似),如果要終止,同樣kill就好。使用這種方式,對(duì)于初學(xué)者來說,可以更好的搞清楚整個(gè)集群節(jié)點(diǎn)的啟動(dòng)順序。
在本測(cè)試中,便是使用hdfs、yarn來啟動(dòng)節(jié)點(diǎn)
首次使用hadoop分布式集群時(shí),需要格式化namenode,并同步ha狀態(tài)到zookeeper,啟動(dòng)的順序如下:
# 首次格式化啟動(dòng)順序 # 啟動(dòng) zookeeper(hd1,hd2,hd3) zkServer.sh start & # 啟動(dòng) journalnode(hd1,hd2,hd3) hdfs journalnode & # 格式化 namenode(hd1) hdfs namenode -format # 初始化 HA 狀態(tài)到 zk(hd1) hdfs zkfc -formatZK & # 啟動(dòng) namenode active(hd1) hdfs namenode & # 同步 namenode(hd2) hdfs namenode -bootstrapStandby # 啟動(dòng) namenode standby(hd2) hdfs namenode & # 啟動(dòng)ZookeeperFailoverController(hd1,hd2) hdfs zkfc & # 啟動(dòng) datanode(hd2,hd3,hd4) hdfs datanode & # 啟動(dòng) resourcemanager(hd3,hd4) yarn resourcemanager & # 啟動(dòng) nodemanager(hd2,hd3,hd4) yarn nodemanager &
啟動(dòng)后,使用jps在各個(gè)節(jié)點(diǎn),查看進(jìn)程的啟動(dòng)情況
# 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
至今,整個(gè)集群就成功啟動(dòng)了
如果以后使用時(shí),就不用再格式化namenode了(否則數(shù)據(jù)會(huì)完蛋),那么正常情況下,集群?jiǎn)?dòng)的順序?yàn)?/p>
# 日常使用的啟動(dòng)順序 # 啟動(dòng) zookeeper(hd1,hd2,hd3) zkServer.sh start & # 啟動(dòng) journalnode(hd1,hd2,hd3) hdfs journalnode & # 啟動(dòng) namenode active(hd1) hdfs namenode & # 啟動(dòng) namenode standby(hd2) hdfs namenode & # 啟動(dòng)ZookeeperFailoverController(hd1,hd2) hdfs zkfc & # 啟動(dòng) datanode(hd2,hd3,hd4) hdfs datanode & # 啟動(dòng) resourcemanager(hd3,hd4) yarn resourcemanager & # 啟動(dòng) nodemanager(hd2,hd3,hd4) yarn nodemanager &
9、hadoop集群測(cè)試
集群?jiǎn)?dòng)后,在瀏覽器輸入以下網(wǎng)址查看namenode、resourcemanager的狀態(tài)
輸入網(wǎng)址 http://172.17.0.1:50070 查看 namenode(active)節(jié)點(diǎn)信息
輸入網(wǎng)址 http://172.17.0.2:50070 查看 namenode(standby)節(jié)點(diǎn)信息
輸入網(wǎng)址 http://172.17.0.3:8088 查看 resourcemanager 節(jié)點(diǎn)信息
使用官網(wǎng)的例子,測(cè)試集群的map-reduce
這個(gè)例子是使用了hadoop自帶的map-reduce jar包,對(duì)etc/hadoop的xml配置文件里面的配置項(xiàng)進(jìn)行數(shù)量統(tǒng)計(jì)(類似于經(jīng)典的wordcount測(cè)試)
具體步驟如下:
# 創(chuàng)建 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 # 執(zhí)行自帶的 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.]+' # 獲取執(zhí)行結(jié)果 hdfs dfs -get output output # 查看執(zhí)行結(jié)果 cat output/*
執(zhí)行后,結(jié)果如下
從上圖可看出,使用map reduce統(tǒng)計(jì)了配置項(xiàng)的數(shù)量結(jié)果
10、hadoop 集群的 HA 測(cè)試
hadoop 集群的 HA 高可用性是本次搭建集群的重要目標(biāo),下面將對(duì) hadoop 集群的 namenode ha、resourcemanager ha 進(jìn)行測(cè)試
(1)namenode ha 測(cè)試
目前 hd1 的 namenode 是 active 狀態(tài),hd2 的 namenode 是 standby 狀態(tài),簡(jiǎn)單粗暴地對(duì) hd1 的 namenode 進(jìn)行 kill 掉,也就是使 hd1 的 namenode 發(fā)生故障,這時(shí)再看 hd2 的 namenode ,會(huì)發(fā)現(xiàn)已自動(dòng)切換為 active 狀態(tài)
說明 namenode ha 故障自動(dòng)切換成功
(2)resourcemanager ha 測(cè)試
hd3、hd4的resourcemanager ha,打開網(wǎng)頁后并沒有看到 active、standby 狀態(tài),這時(shí)如果 hd3 是 active狀態(tài),輸入 http://172.17.0.3:8088 可看到resourcemanger頁面。而輸入 http://172.17.0.4:8088 時(shí),則會(huì)自動(dòng)切換回 htttp://172.17.0.3:8088 頁面。
這里通過后臺(tái)可查看兩個(gè)resourcemanager的狀態(tài),命令如下
# 查看 resourcemanager 狀態(tài) [ahadoop@ed3702f8924e ~]$ yarn rmadmin -getServiceState rm1 active [ahadoop@ed3702f8924e ~]$ yarn rmadmin -getServiceState rm2 standby
在測(cè)試resourcemanager ha時(shí),將active節(jié)點(diǎn)的resourcemanager進(jìn)行kill掉,這時(shí)再查看rm2狀態(tài),會(huì)發(fā)現(xiàn)已經(jīng)變量 active 狀態(tài)
[ahadoop@ed3702f8924e ~]$ yarn rmadmin -getServiceState rm2 active
可通過以下指令進(jìn)行 active、standby 狀態(tài)切換(--forcemanual 表示強(qiáng)制)
# 切換 resourcemanager 主備 # 切換為 standby 狀態(tài) yarn rmadmin -transitionToStandby --forcemanual rm2 # 切換為 active 狀態(tài) yarn rmadmin -transitionToActive --forcemanual rm1
注意,這里如果是active狀態(tài)的強(qiáng)制切換為standby,是可以成功切換,也就是說兩個(gè)節(jié)點(diǎn)都是standby狀態(tài)。但如果已經(jīng)有一個(gè)active狀態(tài)的,這時(shí)再將另一個(gè)standby狀態(tài)切換為active狀態(tài),則無法進(jìn)行切換,系統(tǒng)提示已經(jīng)有一個(gè)active狀態(tài)的節(jié)點(diǎn)了。
[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>]
11、hadoop分布式集群簡(jiǎn)單搭建
上面的配置是針對(duì)namenode ha、resourcemanager ha進(jìn)行配置,會(huì)比較復(fù)雜,如果只是要簡(jiǎn)單地搭建一個(gè)hadoop分布式集群,暫時(shí)不用配置namenode ha、resourcemanager ha的,則配置會(huì)簡(jiǎn)單很多,以下給出hadoop分布式集群簡(jiǎn)單搭建的相關(guān)配置,如下
(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
# 設(shè)置環(huán)境變量 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,啟動(dòng)hadoop集群
# 格式化 namenode(hd1) hdfs namenode -format # 啟動(dòng) namenode(hd1) hdfs namenode & # 啟動(dòng) secondarynamenode(hd2) hdfs secondarynamenode & # 啟動(dòng) datanode(hd2、hd3、hd4) hdfs datanode & # 啟動(dòng) resourcemanager(hd2) yarn resoucemanager & # 啟動(dòng) nodemanager(hd2、hd3、hd4) hdfs nodemanager &
(8)訪問namenode、resourcemanager頁面
訪問 namenode 頁面
http://172.17.0.1:50070
訪問 resourcemanager 頁面
http://172.17.0.2:8088
12、apache hadoop官方配置文檔的一些問題
(1)官網(wǎng)給的namenode ha配置說明文檔,里面關(guān)于自動(dòng)切換故障的配置,官網(wǎng)給的配置是(hdfs-site.xml)
<property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property>
而實(shí)際在配置時(shí),后面還要加上集群ID,本測(cè)試的集群ID是hdcluster,因此正常的配置是
<property> <name>dfs.ha.automatic-failover.enabled.hdcluster</name> <value>true</value> </property>
(2)關(guān)于啟動(dòng)命令的問題
官網(wǎng)給的hadoop集群配置的說明文檔,里面關(guān)于節(jié)點(diǎn)進(jìn)程的啟動(dòng)命令為:
[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
但實(shí)際無法執(zhí)行(也有可能是3.0 beta版的指令,沒試過),執(zhí)行會(huì)提示
[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 這個(gè)參數(shù),因此,實(shí)際在啟動(dòng)這些節(jié)點(diǎn)進(jìn)程時(shí),啟動(dòng)命令為
[hdfs]$ $HADOOP_HOME/bin/hdfs namenode [hdfs]$ $HADOOP_HOME/bin/hdfs datanode [yarn]$ $HADOOP_HOME/bin/yarn resourcemanager [yarn]$ $HADOOP_HOME/bin/yarn nodemanager
上述就是小編為大家分享的Apache Hadoop 2.8 完全分布式集群搭建過程是怎樣的了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。