Hadoop学习笔记-007-CentOS_6.5_64_HA高可用-Zookeeper3.4.5安装Yarn Hadoop2.6

参考:http://blog.csdn.net/u010270403/article/details/51444677

 

虚拟机中共五个centos系统,每个系统有两个用户root和hadoop:cdh1,cdh2,cdh3,cdh4,cdh5

集群规划

 

第一步,切换到hadoop的家目录下,把已经下载好的hadoop放到/home/hadoop/app目录下并解压(以cdh1为例)

#tar zxvf hadoop-2.6.0-cdh5.4.5.tar.gz

 

 

第二步,删除hadoop的压缩文件

# rm -rf hadoop-2.6.0-cdh5.4.5.tar.gz

 

 

第三步,配置环境变量

# vi /home/hadoop/.bash_profile(hadoop用户)

# vi /etc/profile(root用户,所有节点都需要配置)

添加:

HADOOP_HOME=/home/hadoop/app/hadoop-2.6.0-cdh5.4.5
export PATH=$PATH:$HADOOP_HOME/bin

 

 

第四步,使环境变量文件即时生效

# source /home/hadoop/.bash_profile(Hadoop用户)

 

 

# source /etc/profile(root用户)

 

 

第五步,进入~/app/hadoop-2.6.0-cdh5.4.5/etc/hadoop目录,修改配置文件

配置hadoop-env.sh

原配置JAVA_HOME改为:

export JAVA_HOME=/home/hadoop/app/jdk1.7.0_79

 

 

配置core-site.xml

添加:

<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>cdh3:2181,cdh4:2181,cdh5:2181</value>  
</property>  
<!-- 配置Zookeeper 管理HDFS -->

 

 

配置hdfs-site.xml

添加:

<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>nn1,nn2</value>  
</property>  
<!-- 指定 nameService 是 cluster1 时的nameNode有哪些,这里的值也是逻辑名称,名字随便起,相互不重复即可 -->  
<property>  
        <name>dfs.namenode.rpc-address.cluster1.nn1</name>  
        <value>cdh1:9000</value>  
</property>  
<!-- CDHNode1 rpc地址 -->  
<property>  
        <name>dfs.namenode.http-address.cluster1.nn1</name>  
        <value>cdh1:50070</value>  
</property>  
<!-- CDHNode1 http地址 -->  
<property>  
        <name>dfs.namenode.rpc-address.cluster1.nn2</name>  
        <value>cdh2:9000</value>  
</property>  
<!-- CDHNode2 rpc地址 -->  
<property>  
        <name>dfs.namenode.http-address.cluster1.nn2</name>  
        <value>cdh2:50070</value>  
</property>  
<!-- CDHNode2 http地址 -->  
<property>  
        <name>dfs.ha.automatic-failover.enabled</name>  
        <value>true</value>  
</property>  
<!-- 指定NameNode的元数据在JournalNode上的存放位置   journalnode在集群规划中属于所有节点 -->  
<property>  
        <name>dfs.namenode.shared.edits.dir</name>  
        <value>qjournal://cdh1:8485;cdh2:8485;cdh3:8485;cdh4:8485;cdh5: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>  
<!-- 指定JournalNode在本地磁盘存放数据的位置-->  
<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>60000</value>  
</property>  
<!-- 默认配置 -->  
<property>  
        <name>dfs.namenode.handler.count</name>  
        <value>100</value>  
</property>

 

 

 

 

配置slaves(配置子节点的位置,也就是datanode的位置)

 

YARN安装配置

配置mapred-site.xml

首先复制mapred-site文件:# cp mapred-site.xml.template mapred-site.xml

 

配置mapred-site.xml

添加:

<!-- 指定运行mapreduce的环境是Yarn,与hadoop1不同的地方 -->
<property>  
        <name>mapreduce.framework.name</name>  
        <value>yarn</value>  
</property>

 

配置yarn-site.xml

添加:

<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>  
 <!-- 给yarn cluster 取个名字yarn-rm-cluster -->  
 <property>  
      <name>yarn.resourcemanager.ha.rm-ids</name>  
      <value>rm1,rm2</value>  
 </property>  
 <!-- 给ResourceManager 取个名字 rm1,rm2 -->  
 <property>  
      <name>yarn.resourcemanager.hostname.rm1</name>  
      <value>cdh1</value>  
 </property>  
 <!-- 配置ResourceManager rm1 hostname -->  
 <property>  
      <name>yarn.resourcemanager.hostname.rm2</name>  
      <value>cdh2</value>  
 </property>  
 <!-- 配置ResourceManager rm2 hostname -->  
 <property>  
       <name>yarn.resourcemanager.recovery.enabled</name>  
      <value>true</value>  
 </property>  
 <!-- 启用resourcemanager 自动恢复 -->  
 <property>  
      <name>yarn.resourcemanager.zk.state-store.address</name>  
       <value>cdh3:2181,cdh4:2181,cdh5:2181</value>  
 </property>  
 <!-- 配置Zookeeper地址 -->  
 <property>  
       <name>yarn.resourcemanager.zk-address</name>  
      <value>cdh3:2181,cdh4:2181,cdh5:2181</value>  
 </property>  
 <!-- 配置Zookeeper地址 -->  
 <property>  
       <name>yarn.resourcemanager.address.rm1</name>  
      <value>cdh1:8032</value>  
 </property>  
 <!--  rm1端口号 -->  
 <property>  
      <name>yarn.resourcemanager.scheduler.address.rm1</name>  
      <value>cdh1:8034</value>  
 </property>  
 <!-- rm1调度器的端口号 -->  
 <property>  
      <name>yarn.resourcemanager.webapp.address.rm1</name>  
      <value>cdh1:8088</value>  
 </property>  
 <!-- rm1 webapp端口号 -->  
 <property>  
      <name>yarn.resourcemanager.address.rm2</name>  
 <value>cdh2:8032</value>  
 </property>  
 <!-- rm2端口号 -->  
 <property>  
      <name>yarn.resourcemanager.scheduler.address.rm2</name>  
      <value>cdh2:8034</value>  
 </property>  
 <!-- rm2调度器的端口号 -->  
 <property>  
      <name>yarn.resourcemanager.webapp.address.rm2</name>  
      <value>cdh2:8088</value>  
 </property>  
 <!-- rm2 webapp端口号 -->  
 <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>  
 <!-- 执行MapReduce需要配置的shuffle过程 -->

 

 

 

 

第六步,在cdh1上通过命令deploy.sh将Hadoop安装目录拷贝到其他四个节点

查看cdh2的~/app目录

 

在cdh1的~/tools目录下执行deploy.sh批处理命令 

#./deploy.sh ~/app/hadoop-2.6.0-cdh5.4.5/ ~/app/ slave

 

 

验证cdh2的~/app目录

 

第七步,在cdh1的~/tools目录下通过远程命令runRemoteCmd.sh在所有节点按照目录的规划创建存储数据目录 (cdh1-cdh5)

#./runRemoteCmd.sh "mkdir -p /home/hadoop/data/name" all
#./runRemoteCmd.sh "mkdir -p /home/hadoop/data/hdfs/edits" all
#./runRemoteCmd.sh "mkdir -p /home/hadoop/data/datanode" all
#./runRemoteCmd.sh "mkdir -p /home/hadoop/data/journaldata/jn" all
#./runRemoteCmd.sh "mkdir -p /home/hadoop/data/tmp/dfs/name " all
#./runRemoteCmd.sh "touch /home/hadoop/app/hadoop-2.6.0-cdh5.4.5/etc/hadoop/excludes" all
#./runRemoteCmd.sh "mkdir -p /home/hadoop/data/pid" all

在cdh1的~/tools目录下执行以上批处理命令

 

在其他节点上验证是否创建成功,以cdh2为例

 

当初始化过程中出错时,要把相关目录的文件删除,然后再重新初始化

在cdh1的~/tools目录下执行以上批处理命令:

#./runRemoteCmd.sh "rm -rf /home/hadoop/data/name/*" all
#./runRemoteCmd.sh "rm -rf /home/hadoop/data/hdfs/edits/*" all
#./runRemoteCmd.sh "rm -rf /home/hadoop/data/datanode/*" all
#./runRemoteCmd.sh "rm -rf /home/hadoop/data/journaldata/jn/*" all
#./runRemoteCmd.sh "rm -rf /home/hadoop/data/tmp/*" all

第八步,集群初始化

启动所有节点上面的Zookeeper进程

在cdh3的~/tools目录下执行以上批处理命令:

#./runRemoteCmd.sh "~/app/zookeeper-3.4.5-cdh5.4.5/bin/zkServer.sh start" zookeeper

 

 

查看zookeeper进程

# ./runRemoteCmd.sh "jps" zookeeper

 

 

启动所有节点上面的journalnode进程

在cdh1的~/tools目录下执行以上批处理命令:

# ./runRemoteCmd.sh "~/app/hadoop-2.6.0-cdh5.4.5/sbin/hadoop-daemon.sh start journalnode" all

 

 

查看journalnode进程

# ./runRemoteCmd.sh "jps" all

 

 

在主节点上(cdh1)执行格式化

进入脚本目录(以下命令从文档直接复制如果出错,则手动输入即可)

# cd ~/app/hadoop-2.6.0-cdh5.4.5/bin/

 

Namenode格式化

# hdfs namenode –format

 

格式化高可用

hdfs zkfc –formatZK

 

启动namenode

hdfs namenode

 

 

执行完上述命令后,cdh1程序就会处于等待状态

 

在cdh1等待过程中,进入cdh2执行#hdfs namenode –bootstrapStandby进行数据同步,等到cdh2执行完成后,返回cdh1按住ctrl+c退出即可。

 

进入~/tools目录,关闭所有journalnode节点

./runRemoteCmd.sh "~/app/hadoop-2.6.0-cdh5.4.5/sbin/hadoop-daemon.sh stop journalnode" all

 

 

第九步,如果上面操作没有问题,接着可以一键启动hdfs所有相关进程

进入/home/hadoop/app/hadoop-2.6.0-cdh5.4.5/sbin目录,执行以下命令

#./start-dfs.sh

 

 

第十步,查看Hadoop进程

进入~/tools目录下,执行

./runRemoteCmd.sh "jps" all

 

 

第十一步,杀掉active的namenode,验证是否可以完成namenode的切换

在本地(window系统)C:\Windows\System32\drivers\etc\hosts目录下添加:

192.168.150.101 cdh1
192.168.150.102 cdh2
192.168.150.103 cdh3
192.168.150.104 cdh4
192.168.150.105 cdh5

在浏览器输入:http://cdh1:50070/和http://cdh2:50070/

查看两个namenode的状态

 

 

查看cdh1节点namenode的进程号

#jps

 

杀掉active状态的cdh1节点的namenode 

#kill -9 进程id

 

 

刷新http://cdh1:50070/和http://cdh2:50070/页面

 

 

由上看出,cdh1:50070已经无法访问了,说明cdh1的namenode已经挂掉了,cdh2:50070的namenode状态已经变成了active,说明成功完成了切换。

 

重新启动cdh1的namenode#hdfs namenode,然后查看cdh1和cdh2两个节点namenode的状态

 

 

 

 

由上看出,cdh1启动后状态变成了standby。

 

 

第十二步,环境测试

上传文件到HDFS系统

首先新建一个文件:

 

 

在hdfs上创建一个文件目录 

# hadoop dfs -mkdir /datafs

 

 

把world.txt上传到hdfs 

#hadoop dfs -put ~/world.txt /datafs

 

 

查看world.txt是否上传成功 

# hadoop dfs -ls /datafs

 

如果上面操作没有问题说明hdfs配置成功。

 

 

第十三步,启动YARN

在cdh2进入~/app/hadoop-2.6.0-cdh5.4.5/sbin/目录,执行./start-yarn.sh

 

本步在启动的时候,提示我cdh4、cdh5的known_hosts文件需要配置其他节点的秘钥,用scp known_hosts hadoop@cdh3:~/.ssh/拷贝一份到这两个节点即可。

 

在cdh1进入~/app/hadoop-2.6.0-cdh5.4.5/sbin/目录,执行./yarn-daemon.sh start resourcemanager(启动完成后cdh1和cdh2的resourcemanager就都起来了)

 

打开http://cdh1:8088和http://cdh2:8088两个web界面

在打开cdh1:8088界面时,会首先提示“此为standby的RM,将跳转到active的cdh2:8088”,然后会自动跳转到cdh2:8088界面

 

 

通过上述web界面提示可以看出,cdh1是RM的standby,所以杀掉cdh2的resourcemanager进程,看一下效果

# ./yarn-daemon.sh stop resourcemanager

 

重新查看cdh1:8088界面

 

 

重新启动cdh2的RM 

#./yarn-daemon.sh start resourcemanager

然后在cdh1和cdh2上查看ResourceManager状态  

#yarn rmadmin -getServiceState rm1

 

 

 

 

由上可以看出,cdh1变成了active,说明resourcemanager完成了切换。

 

 

第十四步,Wordcount示例测试

在cdh1上执行以下语句

#  hadoop jar /home/hadoop/app/hadoop-2.6.0-cdh5.4.5/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.4.5.jar wordcount /datafs/world.txt /datafs/out/

 

 

登录http://cdh2:50070查看执行结果

 

 

 

 

 

 

 

 

 

第十五步,集群关启顺序
关闭cdh1的resourcemanager,进入cdh1节点的~/app/hadoop-2.6.0-cdh5.4.5/sbin目录,执行./yarn-daemon.sh stop resourcemanager  
#cd ~/app/hadoop-2.6.0-cdh5.4.5/sbin
#./yarn-daemon.sh stop resourcemanager


关闭yarn(也会关闭cdh2的resourcemanager),进入cdh2节点的~/app/hadoop-2.6.0-cdh5.4.5/sbin目录,执行./stop-yarn.sh  
#cd ~/app/hadoop-2.6.0-cdh5.4.5/sbin
# ./stop-yarn.sh


关闭HDFS,进入cdh1节点的~/app/hadoop-2.6.0-cdh5.4.5/sbin目录,执行./stop-dfs.sh 
# cd ~/app/hadoop-2.6.0-cdh5.4.5/sbin
#./stop-dfs.sh


关闭zookeeper,进入cdh3节点的~/tools目录
#cd ~/tools/
#./runRemoteCmd.sh "~/app/zookeeper-3.4.5-cdh5.4.5/bin/zkServer.sh stop" zookeeper


查看进程,进入cdh1的~/tools目录下
#cd ~/tools/
#./runRemoteCmd.sh "jps" all


再次启动集群
启动zookeeper,进入cdh3节点的~/tools目录
#cd ~/tools/
#./runRemoteCmd.sh "~/app/zookeeper-3.4.5-cdh5.4.5/bin/zkServer.sh start" zookeeper



启动HDFS,进入cdh1节点的~/app/hadoop-2.6.0-cdh5.4.5/sbin目录,执行./start-dfs.sh  
# cd ~/app/hadoop-2.6.0-cdh5.4.5/sbin
#./start-dfs.sh


启动YARN,进入cdh1节点的~/app/hadoop-2.6.0-cdh5.4.5/sbin目录,执行./start-yarn.sh  
# cd ~/app/hadoop-2.6.0-cdh5.4.5/sbin
#./start-yarn.sh



启动resourcemanager,进入cdh2节点的~/app/hadoop-2.6.0-cdh5.4.5/sbin目录
# cd ~/app/hadoop-2.6.0-cdh5.4.5/sbin
# ./yarn-daemon.sh start resourcemanager




查看进程,进入cdh1的~/tools目录下
#cd ~/tools/
#./runRemoteCmd.sh "jps" all

 

至此,hadoop 的完全分布式集群搭建完毕。

 

 

完成!

 

posted @ 2017-01-24 14:01  wanghx  阅读(356)  评论(0编辑  收藏  举报