美文网首页
Hadoop+Zookeeper完整分布式搭建(学习篇)

Hadoop+Zookeeper完整分布式搭建(学习篇)

作者: OzanShareing | 来源:发表于2020-01-16 10:56 被阅读0次

    一.环境说明


    集群环境至少需要3个节点(也就是至少3台服务器设备):1个Master,2个Slave,节点之间局域网连接,可以相互ping通,下面举例说明,配置节点IP分配如下:

    Hostname IP User Password
    master 172.19.69.251 root *
    slave 172.19.69.252 root *
    slave 172.19.69.253 root *

    三个节点均使用CentOS 7.4.1708系统,为了便于维护,集群环境配置项最好使用相同用户名、用户密码、相同hadoopzookeeper目录结构。

    我采用的各组件版本为:
    JDKjdk1.8.0_45
    Hadoophadoop-2.8.5
    Zookeeperzookeeper-3.4.12

    1.修改Linux主机名
    2.修改IP
    3.修改主机名和IP的映射关系
    注意如果你们公司是租用的服务器或是使用的云主机(如华为云主机、阿里云主机等)
    /etc/hosts里面要配置的是内网IP地址和主机名的映射关系
    4.关闭防火墙
    5.ssh免登陆
    6.安装JDK,配置环境变量等

    准备工作


    1. 安装JDK

    三台机器下载同版本JDK1.8.0_45安装

    修改配置文件 vim /etc/profile,配置环境变量

    export JAVA_HOME=/usr/java/jdk1.8.0_45
    export PATH=$JAVA_HOME/bin:$PATH
    export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tool.jar
    

    重新加载配置文件使之生效source /etc/profile

    source FileNamesource命令通常用于重新执行刚修改的初始化文档,如 .bash_profile.profile 等等

    2. 修改Linux主机名

    2.1 修改hosts
    vim /etc/hosts
    172.19.69.251 hadoop1
    172.19.69.252 hadoop2
    172.19.69.253 hadoop3
    
    2.2 修改hostname
    # 阿里云服务器用
    hostnamectl set-hostname hadoop2
    

    3. 集群之间ssh无密码登录

    CentOS默认安装了ssh,如果没有你需要先安装ssh

    集群环境的使用必须通过ssh无密码登陆来执行,本机登陆本机必须无密码登陆,主机与从机之间必须可以双向无密码登陆,从机与从机之间无限制。

    3.1 开启Authentication免登陆
    PasswordAuthentication yes
    

    如果是root用户下进行操作,还要去掉 #PermitRootLogin yes注释,允许root用户登录。

    3.2 生成authorized_keys

    输入命令,ssh-keygen -t rsa,生成key,一直按回车。

    就会在/root/.ssh生成:authorized_keysid_rsa.pubid_rsa 三个文件,为了各个机器之间的免登陆,在每一台机器上都要进行此操作。

    3.3 合并公钥到authorized_keys文件

    进入其中一台机器【172.19.69.251】的/root/.ssh目录,输入以下命令:

    #把本机公钥合并到authorized_keys 中
    cat id_rsa.pub>> authorized_keys
    #把其他机器的公钥合并到authorized_keys 中
    ssh root@172.19.69.252 cat ~/.ssh/id_rsa.pub>> authorized_keys
    # 此处需输入其他机器的密码
    ssh root@172.19.69.253 cat ~/.ssh/id_rsa.pub>> authorized_keys
    #或者
    ssh root@hadoop2 cat ~/.ssh/id_rsa.pub>> ~/.ssh/authorized_keys
    ssh root@hadoop3 cat ~/.ssh/id_rsa.pub>> ~/.ssh/authorized_keys
    
    #完成之后输入命令,把authorized_keys远程copy到其他机器之中
    scp authorized_keys 172.19.69.252:/root/.ssh/
    scp authorized_keys 172.19.69.253:/root/.ssh/
    

    拷贝完成后,在每台机器上进行 service sshd restart 操作, 重新启动ssh服务。

    在每台机器输入 ssh 172.19.69.xx,测试能否无需输入密码连接另外两台机器。

    Zookeeper集群安装配置


    参考上篇Zookeeper基本介绍

    Zookeeper下载链接

    Hadoop集群安装配置


    1. 下载解压安装。

    hadoop下载地址

    2. 修改hadoop配置

    解压安装包,并修改配置文件

    [root@master apps]# tar -zxvf hadoop-2.8.5.tar.gz
    [root@master apps]# mkdir hdptmp
    在两台从节点上建立相同的目录(hdfs初始化的时候会用到)
    

    配置文件位置:~/hadoop-2.8.5/etc/hadoop

    2.1 hadoop-env.sh

    添加JDK路径:export JAVA_HOME=

    #vim hadoop-env.sh
    export JAVA_HOME=jdk的安装目录
    
    2.2 core-site.xml

    修改Hadoop核心配置文件core-site.xml,这里配置的是HDFS的地址和端口号。

    <configuration> 
     <!-- 指定 hdfs的 nameservice为 ns -->  
     <property>      
          <name>fs.defaultFS</name>      
          <value>hdfs://ns</value>      
     </property>  
     <!--指定hadoop数据临时存放目录-->  
     <property>  
          <name>hadoop.tmp.dir</name>  
          <value>/apps/hdptmp</value>  
     </property>     
     <!--指定zookeeper地址-->  
     <property>  
          <name>ha.zookeeper.quorum</name>  
          <value>master.hadoop:2181,slave1.hadoop:2181,slave2.hadoop:2181</value>  
     </property>  
    </configuration>
    
    2.3 hdfs-site.xml

    修改HadoopHDFS的配置,配置的备份方式默认为3

    <configuration>  
        <!--指定hdfs的nameservice为ns,需要和core-site.xml中的保持一致 -->      
        <property>      
            <name>dfs.nameservices</name>      
            <value>ns</value>      
        </property>    
        <!-- ns下面有两个NameNode,分别是nn1,nn2 -->  
        <property>  
           <name>dfs.ha.namenodes.ns</name>  
           <value>nn1,nn2</value>  
        </property>  
        <!-- nn1的RPC通信地址 -->  
        <property>  
           <name>dfs.namenode.rpc-address.ns.nn1</name>  
           <value>master.hadoop:9000</value>  
        </property>  
        <!-- nn1的http通信地址 -->  
        <property>  
            <name>dfs.namenode.http-address.ns.nn1</name>  
            <value>master.hadoop:50070</value>  
        </property>  
        <!-- nn2的RPC通信地址 -->  
        <property>  
            <name>dfs.namenode.rpc-address.ns.nn2</name>  
            <value>slave1.hadoop:9000</value>  
        </property>  
        <!-- nn2的http通信地址 -->  
        <property>  
            <name>dfs.namenode.http-address.ns.nn2</name>  
            <value>slave1.hadoop:50070</value>  
        </property>  
        <!-- 指定NameNode的元数据在JournalNode上的存放位置 -->  
        <property>  
             <name>dfs.namenode.shared.edits.dir</name>  
             <value>qjournal://master.hadoop:8485;slave1.hadoop:8485;slave2.hadoop:8485/ns</value>  
        </property>  
        <!-- 指定JournalNode在本地磁盘存放数据的位置 -->  
        <property>  
              <name>dfs.journalnode.edits.dir</name>  
              <value>/apps/journal</value>  
        </property>  
        <!-- 开启NameNode故障时自动切换 -->  
        <property>  
              <name>dfs.ha.automatic-failover.enabled</name>  
              <value>true</value>  
        </property>  
        <!-- 配置失败自动切换实现方式 -->  
        <property>  
                <name>dfs.client.failover.proxy.provider.ns</name>  
                <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>  
        </property>  
        <!-- 配置隔离机制 -->  
        <property>  
                 <name>dfs.ha.fencing.methods</name>  
                 <value>
                    sshfence
                    shell(/bin/true)
                </value>  
        </property>  
        <!-- 使用隔离机制时需要ssh免登陆 -->  
        <property>  
                <name>dfs.ha.fencing.ssh.private-key-files</name>  
                <value>/root/.ssh/id_rsa</value>  
        </property>    
        <property>      
           <name>dfs.replication</name>      
           <value>2</value>      
        </property>     
        <!-- 在NN和DN上开启WebHDFS (REST API)功能,不是必须 -->                                                                      
        <property>      
           <name>dfs.webhdfs.enabled</name>      
           <value>true</value>      
        </property>      
        <property>      
           <name>dfs.ha.fencing.ssh.connect-timeout</name>      
           <value>10000</value>      
        </property>   
        <property>
            <name>dfs.permissions</name>
            <value>false</value>
        </property>
    </configuration>
    
    2.4 mapred-site.xml

    修改HadoopMapReduce的配置文件,配置的是JobTracker的地址和端口。

    <configuration>
        <property>
            <name>mapreduce.framework.name</name>
            <value>yarn</value>
        </property>
    </configuration>
    
    2.5 配置yarn-site.xml文件
    <configuration>
      
      <!-- 以下为YARN HA的配置-->
      <!-- 开启YARN HA -->
      <property>
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
      </property>
     
      <!-- 启用自动故障转移 -->
      <property>
        <name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
        <value>true</value>
      </property>
     
      <!-- 指定YARN HA的名称 -->
      <property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>yarncluster</value>
      </property>
     
      <!-- 指定两个resourcemanager的名称 -->
      <property>
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2</value>
      </property>
     
      <!-- 配置rm1,rm2的主机 -->
      <property>
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>master.hadoop</value>
      </property>
      <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>slave1.hadoop</value>
      </property>
      <!-- 配置zookeeper的地址 -->
      <property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>master.hadoop:2181,slave1.hadoop:2181,slave2.hadoop:2181</value>
      </property>
      <property>      
        <name>yarn.nodemanager.aux-services</name>      
        <value>mapreduce_shuffle</value>      
     </property> 
    </configuration>
    
    2.6 修改slaves文件
    [root@master /]# vi slaves
    master.hadoop
    slave1.hadoop
    slave2.hadoop
    
    2.7 配置hadoop环境变量
    [root@master /]# vi /etc/profile
    #set hadoop enviroment
    export HADOOP_HOME=/apps/hadoop-2.8.0/
    export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
    
    #生效
    [root@master /]# source /etc/profile
    

    注意:三台机器上都进行相同的配置,都放在相同的路径下。

    2.8 远程复制
    使用scp命令进行从本地到远程的文件传输操作:
    scp -r /usr/local/hadoop slave1:/usr/local/hadoop 
    scp -r /usr/local/hadoop slave2:/usr/local/hadoop
    

    3. 启动hadoop集群

    进入master~/hadoop目录,执行以下操作:

    格式化文件系统:

    $ bin/hadoop namenode -format
    

    第一次启动前操作,以后无需操作!!!

    然后启动hadoop

    $ sbin/start-all.sh
    

    验证:通过jps能看到NodeManagerNameNodeSecondaryNameNodeResourceManagerDataNode这几个进程。

    启动集群

    1. 启动ZooKeeper(三台机器一台一台的启动)

    ~/zookeeper/bin/zkServer.sh start
    
    [root@master /]# zkServer.sh start
    ZooKeeper JMX enabled by default
    Using config: /apps/zookeeper-3.4.12/bin/../conf/zoo.cfg
    Starting zookeeper ... STARTED
    

    2.启动journalnode(三台一台一台启动)

    [root@master /]# hadoop-daemon.sh start journalnode
    starting journalnode, logging to /apps/hadoop-2.8.5/logs/hadoop-root-journalnode-master.hadoop.out
    [root@master /]# 
    

    3.启动hdfs

    [root@master /]# start-dfs.sh 
    Starting namenodes on [master.hadoop slave1.hadoop]
    slave1.hadoop: starting namenode, logging to /apps/hadoop-2.8.0/logs/hadoop-root-namenode-slave1.hadoop.out
    master.hadoop: starting namenode, logging to /apps/hadoop-2.8.0/logs/hadoop-root-namenode-master.hadoop.out
    slave2.hadoop: starting datanode, logging to /apps/hadoop-2.8.0/logs/hadoop-root-datanode-slave2.hadoop.out
    master.hadoop: starting datanode, logging to /apps/hadoop-2.8.0/logs/hadoop-root-datanode-master.hadoop.out
    slave1.hadoop: starting datanode, logging to /apps/hadoop-2.8.0/logs/hadoop-root-datanode-slave1.hadoop.out
    Starting journal nodes [master.hadoop slave1.hadoop slave2.hadoop]
    slave2.hadoop: journalnode running as process 1870. Stop it first.
    slave1.hadoop: journalnode running as process 2842. Stop it first.
    master.hadoop: journalnode running as process 45029. Stop it first.
    Starting ZK Failover Controllers on NN hosts [master.hadoop slave1.hadoop]
    slave1.hadoop: starting zkfc, logging to /apps/hadoop-2.8.0/logs/hadoop-root-zkfc-slave1.hadoop.out
    master.hadoop: starting zkfc, logging to /apps/hadoop-2.8.0/logs/hadoop-root-zkfc-master.hadoop.out
    [root@master /]# 
    

    4.启动yarn

    [root@master /]# start-yarn.sh 
    starting yarn daemons
    starting resourcemanager, logging to /apps/hadoop-2.8.0/logs/yarn-root-resourcemanager-master.hadoop.out
    slave1.hadoop: starting nodemanager, logging to /apps/hadoop-2.8.0/logs/yarn-root-nodemanager-slave1.hadoop.out
    slave2.hadoop: starting nodemanager, logging to /apps/hadoop-2.8.0/logs/yarn-root-nodemanager-slave2.hadoop.out
    master.hadoop: starting nodemanager, logging to /apps/hadoop-2.8.0/logs/yarn-root-nodemanager-master.hadoop.out
    [root@master /]#
    

    5.启动单个结点的yarn进程(因为yarn的两个resourcemanager不会同时启动,必须手动启动另一台上的resourcemanager

    slave1.hadoop上启动

    [root@slave1 ~]# yarn-daemon.sh start resourcemanager
    starting resourcemanager, logging to /apps/hadoop-2.8.0/logs/yarn-root-resourcemanager-slave1.hadoop.out
    [root@slave1 ~]# jps
    3489 Jps
    2931 NameNode
    2709 QuorumPeerMain
    2842 JournalNode
    3131 DFSZKFailoverController
    3451 ResourceManager
    3276 NodeManager
    3005 DataNode
    [root@slave1 ~]# 
    

    到此集群搭建完成!!!!!!!!!!!!!!!!!

    ~/hadoop/sbin/start-all.sh
    

    测试高可用


    访问 http://slave1.hadoop:50070/

    访问 http://master.hadoop:50070/

    接下来是一台宕机(关闭slave1.hadoop上的namenode进程)杀掉2931进程

    [root@slave1 ~]# jps
    2931 NameNode
    2709 QuorumPeerMain
    3733 Jps
    2842 JournalNode
    3131 DFSZKFailoverController
    3451 ResourceManager
    3276 NodeManager
    3005 DataNode
    [root@slave1 ~]# kill -9 2931
    [root@slave1 ~]# jps
    2709 QuorumPeerMain
    3753 Jps
    2842 JournalNode
    3131 DFSZKFailoverController
    3451 ResourceManager
    3276 NodeManager
    3005 DataNode
    [root@slave1 ~]# 
    

    然后访问 http://slave1.hadoop:50070/(无响应)

    访问http://master.hadoop:50070/ (变成active)

    高可用集群搭建完毕

    相关文章

      网友评论

          本文标题:Hadoop+Zookeeper完整分布式搭建(学习篇)

          本文链接:https://www.haomeiwen.com/subject/abtxzctx.html