zoukankan      html  css  js  c++  java
  • 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:WindowsSystem32driversetchosts目录下添加:

    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 的完全分布式集群搭建完毕。

    完成!

  • 相关阅读:
    Java基础面试题附答案 81-100(五)
    css练习--抽屉作业
    css
    HTML 快速入门
    selectors 模块完成文件上传下载功能
    IO 模型
    进程 线程 协程
    socket套接字
    异常处理
    面向对象
  • 原文地址:https://www.cnblogs.com/liudi1992/p/6343496.html
Copyright © 2011-2022 走看看