zoukankan      html  css  js  c++  java
  • hadoop学习(三)----hadoop2.x完全分布式环境搭建

    今天我们来完成hadoop2.x的完全分布式环境搭建,话说学习本来是一件很快乐的事情,可是一到了搭环境就怎么都让人快乐不起来啊,搭环境的时间比学习的时间还多。都是泪。话不多说,走起。

    1 准备工作

    开工之前先说一下我们的机器环境:
    一共是4台主机,主机1,2,3都是从master克隆过来的:

    主机名 IP 用户
    hadoopmaster 192.168.131.128 hadoop
    hadoopslaver1 192.168.131.130 hadoop
    hadoopslaver2 192.168.131.131 hadoop
    hadoopslaver3 192.168.131.132 hadoop

    集群组成:

    1. Namenode:2台
    2. Datanode: 3台
    3. Journalnode:3台
    4. Zookeeper: 3台
    5. ZKFC:2台
    6. ResourceManager:2台
    7. NodeManager:3台
    Namenode Datanode Journalnode Zookeeper ZKFC ResourceManager NodeManager
    hadoopmaster 1 1 1 1
    hadoopslaver1 1 1 1 1 1 1
    hadoopslaver2 1 1 1 1 1
    hadoopslaver3 1 1 1

    首先我们保证做好了如下工作:

    • 关闭防火墙
    • 安装jdk
    • 配置好了环境变量

    本次安装的hadoop版本为2.7.3。

    1.1 关闭防火墙,修改主机名、配置host文件、设置时间同步

    1.1.1 防火墙状态
    查看防火墙是否开启
    # service iptables status
    
    如果开启则使用如下命令关闭
    # service iptables stop
    
    1.1.2 修改主机名:

    修改master主机的 /etc/sysconfig/network文件,将HOSTNAME改为master,其余三台主机分别改为对应的主机名。

    # vim /etc/sysconfig/network
    
    
    NETWORKING=yes
    HOSTNAME=hadoopmaster
    

    其余三台分别改为相应的主机名,现在四台主机的主机名分别是:

    192.168.131.128    hadoopmaster
    192.168.131.130    hadoopslaver1
    192.168.131.131    hadoopslaver2
    192.168.131.132    hadoopslaver3
    
    1.1.3 修改host文件
    # vim /etc/hosts
    
    添加如下配置:
    
    192.168.131.128    hadoopmaster
    192.168.131.130    hadoopslaver1
    192.168.131.131    hadoopslaver2
    192.168.131.132    hadoopslaver3
    
    1.1.4 删除持久化文件/etc/udev/rules.d/70-persistent-net.rules ,重启虚拟主机,使配置生效。
    # rm /etc/udev/rules.d/70-persistent-net.rules
    
    TIPS:
    该文件记录的是当前主机的MAC地址与IP地址的映射关系,因为我们后面三台主机都是通过克隆来的,所以四台主机的MAC地址是一样的。后面我们四台主机通信的时候你却会发现有问题,我们需要删除这个持久化文件,然后重启一下机器,系统会检测该文件,发现不存在会重新生成该文件。
    1.1.5 4台主机做时间同步
    # yum install ntp
    

    使用ntp工具来同步时间,这里使用的时间服务器的ip是上海交通大学学的NTP服务器地址,其他的地址自行百度:

    # ntpdate 202.120.2.101
    

    需要注意的是,如果执行上面的命令出现如下提示:

    ntpdate[2747]: no server suitable for synchronization found
    

    首先检查你的防火墙是否关闭,没有的话先关闭,如果关闭了还是不行可以试一下如下方法:

    使用rdate命令来更新服务器时间,

    查看时间服务器的时间:
    # rdate time-b.nist.gov
    
    如果命令不生效请安装rdate,
    yum install -y rdate
    
    设置时间和时间服务器同步:
    # rdate -s time-b.nist.gov
    
    TIPS:
    以上所有操作需要在4台机器上同步执行!!!

    2 配置ssh免密

    如果设置主机master到主机slaver1的免密钥登录,可按如下方式进行:

    在A主机执行  
    1、# ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa                                
    
    -t 密钥类型(rsa 或 dsa)   
    -P 旧密码 ''代表为空  
    -f 密钥文件生成后,保存的位置  
    
    2、# ssh-copy-id 192.168.131.130 
    IP是主机slaver1的IP地址,将主机master生成的密钥,拷贝到远程主机对应的账户下  
    执行过程中,会提示让输入主机slaver1的登录密码 
    
    我们可以使用上面的命令设置4台机器互相免密。
    

    3 安装jdk,hadoop,zookeeper,配置环境变量

    3.1 配置环境变量

    这里我用的jdk是1.8,hadoop是2.7,zookeeper是3.4.11.配置环境变量:

    # vim /etc/profile
    环境信息如下:
    
    JAVA_HOME=/usr/java/jdk
    JRE_HOME=/usr/java/jdk/jre
    PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
    CLASSPATH=.:$JAVA_HOME/lib/jt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
    export JAVA_HOME JRE_HOME PATH CLASSPATH
    export HADOOP_HOME=/usr/local/hadoop
    export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
    export ZOOKEEPER_HOME=/usr/local/zookeeper
    export PATH=$PATH:$ZOOKEEPER_HOME/bin
    

    配置完成以后执行:

    # source /etc/profile
    

    使配置生效。

    3.2 安装zookeeper

    注意:
    环境配置中后面有关zookeeper这两行只用在master、slaver1和slaver2中配置,即只在这三台机器中安装zookeeper。

    zookeeper解压到/usr/local/zookeeper目录,我们进入目录/usr/local/zookeeper/conf修改文件模板文件:

    mv zoo_sample.cfg zoo.cfg
    
    1.首先修改文件中的dataDir,路径是zookeeper的快照存储路径,不要使用默认的路径,重启的话会清空/tmp目录导致数据丢失:
    dataDir=/usr/local/zookeeper/tmp
    
    ✔此处注意:tmp目录是我新建的。
    2.在文件的最后加入zookeeper节点的配置:
    server.1=hadoopmaster:2888:3888
    server.2=hadoopslaver1:2888:3888
    server.3=hadoopslaver2:2888:3888
    

    然后我们需要注意的是:上面指定的配置节点server1.2.3是需要我们手动指定,需要在快照目录新建一个文件:myid。

    # vim myid
    

    然后内容为该服务器对应的节点id,本次试验:hadoopmaster对应的是1,hadoopslaver1对应的是2,hadoopslaver2对应的是3.

    上面我们在master中配置完之后需要分别在另外两台也要配置,我们直接复制过去得了:

    scp -r zookeeper hadoopslaver1:/usr/local/zookeeper
    scp -r zookeeper hadoopslaver2:/usr/local/zookeeper
    

    然后记得改一下myid,hadoopslaver1的改为2,hadoopslaver2的改为3。

    好了,配置完成,接下来到了激动人心的启动时刻,启动脚本在bin目录下的zkServer.sh文件:

    zkServer.sh start
    
    TIPS:
    ✔✔注意:三台机器都需要启动啊!!!

    查看zookeeper的状态:

    zkServer.sh status
    

    如果出现如下提示表明启动成功:

    关闭命令:

    zkServer.sh stop
    

    3.3 安装hadoop

    hadoop集群的配置文件主要涉及到以下这几个:

    hadoop-env.sh
    
    core-site.xml
    
    hdfs-site.xml
    
    slaves
    
    mapred-site.xml
    
    yarn-site.xml
    

    下面以此对上面的文件进行配置:

    hadoop-env.sh文件,设置jdk的路径:

    export JAVA_HOME=/usr/java/jdk
    

    core-site.xml文件,在configuration里面添加如下配置:

    <configuration>
        <property>  
             <name>fs.defaultFS</name> 
            <!--此处名称需要和hdfs-site.xml中的dfs.nameservice保持一致--> 
             <value>hdfs://rickiyang</value>
        </property>  
        <property>  
            <!--配置路径-->
             <name>hadoop.tmp.dir</name>                                                                                   
             <value>/usr/local/hadoop/tmp</value>
        </property>  
        <property>  
            <name>ha.zookeeper.quorum</name>    
            <value>hadoopmaster:2181,hadoopslaver1:2181,hadoopslaver2:2181</value> 
          </property> 
    </configuration>
    

    hdfs-site.xml文件:

    <configuration>
      <property>  
        <name>dfs.nameservices</name> 
        <!--此处名称需与core-site.xml中fs.defaultFS的值保持一致--> 
        <value>rickiyang</value> 
      </property>  
        <!--配置namenode的组成 -->
      <property>  
        <name>dfs.ha.namenodes.rickiyang</name> 
        <value>nn1,nn2</value>  
      </property>  
      <property>  
        <!--配置namenode1的rpc端口   -->
        <name>dfs.namenode.rpc-address.rickiyang.nn1</name> 
        <value>hadoopmaster:8020</value>  
      </property>  
      <property>  
        <!--配置namenode2的rpc端口   -->
        <name>dfs.namenode.rpc-address.rickiyang.nn2</name> 
        <value>hadoopslaver1:8020</value>  
      </property>  
      <property>  
         <!--配置namenode1的http端口  -->
        <name>dfs.namenode.http-address.rickiyang.nn1</name>   
        <value>hadoopmaster:50070</value>  
      </property>  
      <property>  
         <!--配置namenode2的http端口  -->
        <name>dfs.namenode.http-address.rickiyang.nn2</name>  
        <value>hadoopslaver1:50070</value>  
      </property>  
      <property>  
        <!--配置journalnode集群  -->
        <name>dfs.namenode.shared.edits.dir</name>  
        <value>qjournal://hadoopmaster:8485;hadoopslaver1:8485;hadoopslaver2:8485/rickiyang</value>  
      </property>  
      <property>  
         <!--配置后台类。作用:HDFS Client用此类联系处于active状态的namenode  -->
        <name>dfs.client.failover.proxy.provider.rickiyang</name>  
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>  
      </property>  
      <property>  
         <!--用于主备节点切换时实现隔离机制的 -->
        <name>dfs.ha.fencing.methods</name>  
        <value>sshfence</value>  
      </property>  
      <property>  
        <!--配置密钥的路径 需与前面免密钥设置的路径保持一致-->
        <name>dfs.ha.fencing.ssh.private-key-files</name> 
        <value>/hadoop/.ssh/id_rsa</value>  
      </property>  
      <property>  
         <!--journalnode的持久化文件保存路径 -->
        <name>dfs.journalnode.edits.dir</name>   
        <value>/usr/local/hadoop/journal/data</value>  
      </property>  
      <property>  
         <!--设置故障自动切换功能可用 -->
        <name>dfs.ha.automatic-failover.enabled</name> 
        <value>true</value>  
      </property> 
    </configuration>
    

    复制配置文件的时候把注释删除,注释是给你看的,不用放进去。

    slaves文件: 配置datanode的主机名称:

    hadoopslaver1
    hadoopslaver2
    hadoopslaver3
    

    mapred-site.xml文件,配置yarn:

    使用自带的模板文件
    # mv mapred-site.xml.template mapred-site.xml
    
    <configuration>  
        <property>  
            <name>mapreduce.framework.name</name>  
            <value>yarn</value>  
        </property>  
    </configuration> 
    

    yarn-site.xml文件:

    <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>myyarncluster</value>  
        </property>  
        <property>  
           <name>yarn.resourcemanager.ha.rm-ids</name>  
           <value>rm1,rm2</value>  
        </property>  
        <property>  
           <name>yarn.resourcemanager.hostname.rm1</name>  
           <value>hadoopslaver2</value>  
        </property>  
        <property>  
           <name>yarn.resourcemanager.hostname.rm2</name>  
           <value>hadoopslaver3</value>  
        </property>  
        <property>  
           <name>yarn.resourcemanager.zk-address</name>  
           <value>hadoopmaster:2181,hadoopslaver1:2181,hadoopslaver2:2181</value>  
        </property>  
    </configuration>
    

    以上6个文件配置完毕,同步至其他3台主机:

    进入路径:/usr/local/hadoop/etc/hadoop/下:
    
    scp * hadoopslaver1:`pwd`
    scp * hadoopslaver2:`pwd`
    scp * hadoopslaver3:`pwd`
    

    启动journalnode集群。(之所以将journalnode集群放在namenode之前启动,是因为namenode启动时,会往journalnode写入edits日志文件)

    在三台journalnode主机分别启动:
    
    hadoop-daemon.sh start journalnode
    

    NN的格式化 与 同步

    在其中一台NN上,执行文件系统的格式化操作。注意:此处的格式化并非真正的格式化,而是一些准备和清除操作(比如清空fsimage和edits文件的存储目录下已有的文件)

    hdfs namenode -format    
    

    此时,这一台NN已经完成了格式化操作,接下来,需要将格式化之后的文件系统同步到另一台NN。同步时,第二台NN会从第一台NN读取数据,故需要先将第一台NN启动起来。

    hadoop-daemon.sh start namenode
    

    第一台NN启动后,在第二台NN上执行以下命令(此时NN尚未启动),即可完成同步操作:

    hdfs namenode -bootstrapStandby
    

    zookeeper集群的格式化

    在上面已经启动了zookeeper集群,故此处在其中一台NN上执行以下命令,完成zookeeper的格式化:

    集群的一些高可用信息读到zookeeper中
    
    hdfs zkfc -formatZK  
    

    至此,Hadoop完全分布式集群的配置工作都已经完成!

    接下来,启动集群,在其中一台主机上执行以下命令(最好是在NN上执行,因为NN->DN设置了免密钥):

    start-all.sh
    

    然后分别在RS主机上启动resourcemanager:

    yarn-daemon.sh start resourcemanager
    

    在start-all.sh的时候会有如下信息输出:

    在上面截图的信息中我们可以看到,集群的启动顺序是:

    NN –> DN –> JN –>ZKFC –> NM

    jps 查看进程

    hadoop集群的启动顺序:

    1、启动zk集群

    zkServer.sh  start | status
    

    2、start-all.sh

    3、手动启动两台RS

    yarn-daemon.sh start resourcemanager
    

    停止顺序:

    1、stop-all.sh

    2、手动停止两台rs

    yarn-daemon.sh stop resourcemanager
    

    3、停止zk集群

    启动完成,浏览器访问:

    至此,我们的高可用环境就搭建完毕了。大家动手尝试吧!

  • 相关阅读:
    SparkStreaming整合Flume的pull方式之启动报错解决方案
    n-map安装实操
    性能测试从入门到入土的一点思考
    基于Influxdb对InfluxDBResultMapper的一点扩展
    数据库恢复技术
    (转引)数据库索引(MySQL)
    携程一面凉经
    一文总结机器学习常见模型
    深度学习实战
    DFS
  • 原文地址:https://www.cnblogs.com/rickiyang/p/11074207.html
Copyright © 2011-2022 走看看