需求: 配置由zookeeper实现的hdfs namenode的高可用 ,以及resourcemanager高可用 。
centos7.3
jdk1.8(默认已经安装好)
hadoop 2.6.0
zookeeper 3.4.6
ssh免密登陆已经配置好。
时钟同步已经完成
防火墙已经关闭。
主要角色分配
txynebo1:namenode ,resourcemanager,datanode,nodemanager
txynebo2:namenode ,resourcemanager.datanode,nodemanager
txynebo3: datanode,nodemanager
所有软件的安装目录均在hadoop用户下的 /home/hadoop/app
每一步都要记得配置环境变量:贴一下我的。
JAVA_HOME=/home/hadoop/app/jdk
HADOOP_HOME=/home/hadoop/app/hadoop
ZOOKEEPER_HOME=/home/hadoop/app/zookeeper
STORM_HOME=/home/hadoop/app/storm
GIT_HOME=/home/hadoop/app/git
MAVEN_HOME=/home/hadoop/app/maven
SPARK_HOME=/home/hadoop/app/spark
HBASE_HOME=/home/hadoop/app/hbase
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$ZOOKEEPER_HOME/bin:/home/hadoop/tools:$STORM_HOME/bin:$GIT_HOME/bin:$MAVEN_HOME/bin:$HBASE_HOME/bin:$PATH
export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m"
export JAVA_HOME CLASSPATH PATH HADOOP_HOME ZOOKEEPER_HOME STORM_HOME GIT_HOME MAVEN_HOME HBASE_HOME
这里配置需要用到(hadoop,zookeeper,jdk)即可。
1.首先进行zookeeper的安装 。
下载tar包。解压到指定目录
p:这里我一般都是解压时候 ln -s zookeeper-xx- zookeeper
保留原本解压后包含版本号的目录,然后创建一个软链接。配置环境变量的时候,指向软链接。
这样以后更改了版本。更新一下软链接就可以了。
这里首先创建两个目录 每台主机都要创建
数据文件目录 /home/hadoop/data/zookeeper/zkdata
日志目录 /home/hadoop/data/zookeeper/zkdatalog
1.1 修改配置文件 zoo.cfg (conf中默认是没有这个文件的。需要自己copy一个。如下图)
然后更改如下配置:
dataDir=/home/hadoop/data/zookeeper/zkdata
dataLogDir=/home/hadoop/data/zookeeper/zkdatalog
# the port at which the clients will connect
clientPort=2181
server.1=txynebo1:2888:3888
server.2=txynebo2:2888:3888
server.3=txynebo3:2888:3888
这里需要注意: 因为我的是腾讯云主机 所以在配置的时候(虚拟机可以忽略下面问题)
txynebo1
server.1=10.0.33.33(txynebo1内网ip):2888:3888
server.2=txynebo2:2888:3888
server.3=txynebo3:2888:3888
txynebo2, txynebo3.节点的配置文件中。对应位置也是填对应的内网ip
也可以在hosts文件中hosts文件中,本主机对应的hostname 用本机内网ip,其他节点可以使用公网ip。注意hostname不能包含_或者-否则后面hadoop启动会报错
否则后面启动会报错 : cannot asign request …. 如下图
然后在每台主机都有相同的目录结构配置才能一样否则需要根据自己的目录结构做更改。
先用scp命令将新建的目录结构分发到其他节点:
再将zookeeper 解压后更改了配置文件的安装包分发到别的节点 。
分发之后进入zkdata目录下,创建文件myid,里面的内容对应txynebo1,xx 2 ,xx 3 分别填充为:1、2、3,
myid文件作用:里面就一个数字,用来唯一标识这个服务。这个id是很重要的,一定要保证整个集群中唯一。zookeeper会根据这个id来取出server.x上的配置。myid的值是zoo.cfg文件里定义的server搜索,Zookeeper启动时会读取这个文件 比如当前id为1,则对应着zoo.cfg里的server.1的配置。拿到里面的数据与 zoo.cfg 里面的配置信息比较从而判断到底是那个server,只是一个标识作用。而且leader选举的时候,这个id的大小也是有意义的。
以上操作完成之后 。每个节点启动 bin/zkServer.sh start
然后查看到下面进程。才算可以。
然后启动所有节点之后 。bin/zkServer.sh status
mode只有一个为leader,其他为follower则zookeeper搭建成功。
2 . hadoop安装与配置
2.1 上传,解压,创建软链接,配置环境变量。
2.2 更改配置文件 。(p:不要直接复制本页面上的。不然格式会有问题)
/home/hadoop/app/hadoop/etc/hadoop目录下
core-site.xml:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://cluster1</value>
</property>
< 这里的值指的是默认的HDFS路径 ,取名为cluster1>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/data/tmp</value>
</property>
< hadoop的临时目录,如果需要配置多个目录,需要逗号隔开,data目录需要我们自己创建>
<property>
<name>ha.zookeeper.quorum</name>
<value>txynebo1:2181,txynebo2:2181,txynebo3:2181</value>
</property>
< 配置Zookeeper 管理HDFS>
配置hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
< 数据块副本数为3>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
< 权限默认配置为false>
<property>
<name>dfs.nameservices</name>
<value>cluster1</value>
</property>
< 命名空间,它的值与fs.defaultFS的值要对应,namenode高可用之后有两个namenode,cluster1是对外提供的统一入口>
<property>
<name>dfs.ha.namenodes.cluster1</name>
<value>txynebo1,txynebo2</value>
</property>
< 指定 nameService 是 cluster1 时的nameNode有哪些,这里的值也是逻辑名称,名字随便起,相互不重复即可>
<property>
<name>dfs.namenode.rpc-address.cluster1.txynebo1</name>
<value>txynebo1:9000</value>
</property>
< txynebo1 rpc地址>
<property>
<name>dfs.namenode.http-address.cluster1.txynebo1</name>
<value>txynebo1:50070</value>
</property>
< txynebo1 http地址>
<property>
<name>dfs.namenode.rpc-address.cluster1.txynebo2</name>
<value>txynebo2:9000</value>
</property>
< txynebo2 rpc地址>
<property>
<name>dfs.namenode.http-address.cluster1.txynebo2</name>
<value>txynebo2:50070</value>
</property>
< txynebo2 http地址>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
< 启动故障自动恢复>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://txynebo1:8485;txynebo2:8485;txynebo3:8485/cluster1</value>
</property>
< 指定journal>
<property>
<name>dfs.client.failover.proxy.provider.cluster1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
< 指定 cluster1 出故障时,哪个实现类负责执行故障切换>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hadoop/data/journaldata/jn</value>
</property>
< 指定JournalNode集群在对nameNode的目录进行共享时,自己存储数据的磁盘路径 >
<property>
<name>dfs.ha.fencing.methods</name>
<value>shell(/bin/true)</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>10000</value>
</property>
< 脑裂默认配置>
<property>
<name>dfs.namenode.handler.count</name>
<value>100</value>
</property>
</configuration>
配置slave(这里配置的是datanode角色)
txynebo1
txynebo2
txynebo3
配置hadoop-env.sh (根据自己的文件目录配置)
export JAVA_HOME=/home/hadoop/app/jdk
export HADOOP_HOME=/home/hadoop/app/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
配置之后分发解压包
scp -r hadoop-2.6.0 hadoop@txynebo2:/home/hadoop/app/
然后各个节点创建软链接。
配置环境变量。
hdfs配置之后
1)先启动所有节点的zookeeper ,因为namenode高可用建立在zookeeper上
2)启动所有节点的journode进程 ,因为我们首先要格式化,而journode是用来各个节点直接通信同步状态的。
hadoop目录下执行 sbin/hadoop-daemon.sh start journalnode
3)在主节点txynebo1 执行格式化
bin/hdfs namenode -format / /namenode 格式化
bin/hdfs zkfc -formatZK //格式化高可用
bin/hdfs namenode //启动namenode
4)在备节点(txynebo2)执行数据同步
bin/hdfs namenode -bootstrapStandby //同步主节点和备节点之间的元数据
5)数据同步之后。在txynebo1 ctrl+c 结束namenode进程。然后关闭所有节点的journode
hadoop目录下执行 sbin/hadoop-daemon.sh stop journalnode
hadoop目录下执行: sbin/start-dfs.sh
访问txynebo1:50070
txynebo2:50070
可以观察到一个为active状态。一个standby状态
关闭active状态的namenode可以看到standby状态的namenode自动切换为active。
这样就配置成功
注意: 如果不启动zookeeper 。那么两个namenode都是standby
3.配置yarn 。
配置2中配置文件目录中的
mapred-site.xml(也是原本没有的文件。可由temparture文件拷贝)
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<指定运行mapreduce的环境是Yarn,与hadoop1不同的地方>
</configuration>
yarn-site.xml
<configuration>
<property>
<name>yarn.resourcemanager.connect.retry-interval.ms</name>
<value>2000</value>
</property>
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.ha.automatic-failover.embedded</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yarn-rm-cluster</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>txynebo1</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>txynebo2</value>
</property>
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.zk.state-store.address</name>
<value>txynebo1:2181,txynebo2:2181,txynebo3:2181</value>
</property>
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>txynebo1:2181,txynebo2:2181,txynebo3:2181</value>
</property>
<property>
<name>yarn.resourcemanager.address.rm1</name>
<value>txynebo1:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address.rm1</name>
<value>txynebo1:8034</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>txynebo1:8088</value>
</property>
<property>
<name>yarn.resourcemanager.address.rm2</name>
<value>txynebo2:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address.rm2</name>
<value>txynebo2:8034</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>txynebo2:8088</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
</configuration>
然后分发这两个文件到各个节点的对应目录
txynebo1
hadoop目录下 sbin/start-yarn.sh
txynebo2
hadoop 目录下 sbin/yarn-daemon.sh start resourcemanager
同时查看webui
txynebo1:8088
txynebo2:8088
可以关闭一个可用的 resourcemanager然后再启动。会发现状态发生了改变。
查看resourcemanager状态的命令:
hadoop 目录下 bin/yarn rmadmin -getServiceState rm1
hadoop 目录下 bin/yarn rmadmin -getServiceState rm2
运行一个实例程序 :
hadoop目录下 hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar wordcount /test/data.txt /test/out/(目录不能提前存在,数据文本随便写即可)
如果在yarn界面看到application正常执行。则环境配置成功
至此namenode与resourcemanager的高可用配置完成。