AG广东会,山东十一选五,大发

?
  • AG广东会400电话
  • 微网小程序
  • AI电话山东十一选五
  • 电商代运营
  • AG广东会,山东十一选五,大发:全 部 栏 目

    AG广东会400电话 网络优化推广 AI电话山东十一选五 呼叫中心 网站建设 商标?知产 微网小程序 电商运营 彩铃?短信 增值拓展业务
    基于 ZooKeeper 搭建 Hadoop 高可用集群 的教程图解

    一、高可用简介

    Hadoop 高可用 (High Availability) 分为 HDFS 高可用和 YARN 高可用,两者的实现基本类似,但 HDFS NameNode 对数据存储及其一致性的要求比 YARN ResourceManger 高得多,所以它的实现也更加复杂,故下面先进行讲解:

    AG广东会,山东十一选五,大发:1.1 高可用整体架构

    HDFS 高可用架构如下:

    图片引用自: https://www.edureka.co/blog/how-to-set-up-hadoop-cluster-with-hdfs-high-availability/

    HDFS 高可用架构主要由以下组件所构成:

    Active NameNode 和 Standby NameNode:两台 NameNode 形成互备,一台处于 Active 状态,为主 NameNode,另外一台处于 Standby 状态,为备 NameNode,只有主 NameNode 才能对外提供读写服务。

    AG广东会,山东十一选五,大发:1.2 基于 QJM 的共享存储系统的数据同步机制分析

    目前 Hadoop 支持使用 Quorum Journal Manager (QJM) 或 Network File System (NFS) 作为共享的存储系统,这里以 QJM 集群为例进行说明:Active NameNode 首先把 EditLog 提交到 JournalNode 集群,然后 Standby NameNode 再从 JournalNode 集群定时同步 EditLog,当 Active NameNode 宕机后, Standby NameNode 在确认元数据完全同步之后就可以对外提供服务。

    需要说明的是向 JournalNode 集群写入 EditLog 是遵循 “过半写入则成功” 的策略,所以你至少要有3个 JournalNode 节点,当然你也可以继续增加节点数量,但是应该保证节点总数是奇数。同时如果有 2N+1 台 JournalNode,那么根据过半写的原则,最多可以容忍有 N 台 JournalNode 节点挂掉。

    AG广东会,山东十一选五,大发:1.3 NameNode 主备切换

    NameNode 实现主备切换的流程下图所示:

    HealthMonitor 初始化完成之后会启动内部的线程来定时调用对应 NameNode 的 HAServiceProtocol RPC 接口的方法,对 NameNode 的健康状态进行检测。

    HealthMonitor 如果检测到 NameNode 的健康状态发生变化,会回调 ZKFailoverController 注册的相应方法进行处理。

    如果 ZKFailoverController 判断需要进行主备切换,会首先使用 ActiveStandbyElector 来进行自动的主备选举。

    ActiveStandbyElector 与 Zookeeper 进行交互完成自动的主备选举。

    ActiveStandbyElector 在主备选举完成后,会回调 ZKFailoverController 的相应方法来通知当前的 NameNode 成为主 NameNode 或备 NameNode。

    ZKFailoverController 调用对应 NameNode 的 HAServiceProtocol RPC 接口的方法将 NameNode 转换为 Active 状态或 Standby 状态。

    AG广东会,山东十一选五,大发:1.4 YARN高可用

    YARN ResourceManager 的高可用与 HDFS NameNode 的高可用类似,但是 ResourceManager 不像 NameNode ,没有那么多的元数据信息需要维护,所以它的状态信息可以直接写到 Zookeeper 上,并依赖 Zookeeper 来进行主备选举。

    二、集群规划

    按照高可用的设计目标:需要保证至少有两个 NameNode (一主一备) 和 两个 ResourceManager (一主一备) ,同时为满足“过半写入则成功”的原则,需要至少要有3个 JournalNode 节点。这里使用三台主机进行搭建,集群规划如下:

    三、前置条件所有服务器都安装有JDK,安装步骤可以参见:Linux下JDK的安装;搭建好ZooKeeper集群,搭建步骤可以参见:Zookeeper单机环境和集群环境搭建所有服务器之间都配置好SSH免密登录。

    四、集群配置

    AG广东会,山东十一选五,大发:4.1 下载并解压

    下载Hadoop。这里我下载的是CDH版本Hadoop,下载地址为:http://archive.cloudera.com/cdh5/cdh/5/

    # tar -zvxf hadoop-2.6.0-cdh5.15.2.tar.gz

    4.2 配置环境变量

    编辑profile文件:

    # vim /etc/profile

    增加如下配置:

    export HADOOP_HOME=/usr/app/hadoop-2.6.0-cdh5.15.2export PATH=${HADOOP_HOME}/bin:$PATH

    执行source命令,使得配置立即生效:

    # source /etc/profile

    AG广东会,山东十一选五,大发:4.3 修改配置

    进入${HADOOP_HOME}/etc/hadoop目录下,修改配置文件。各个配置文件内容如下:

    1. hadoop-env.sh

    # 指定JDK的安装位置export JAVA_HOME=/usr/java/jdk1.8.0_201/

    2. core-site.xml

    <configuration>
     <property>
     <!-- 指定namenode的hdfs协议文件系统的通信地址 -->
     <name>fs.defaultFS</name>
     <value>hdfs://hadoop001:8020</value>
     </property>
     <property>
     <!-- 指定hadoop集群存储临时文件的目录 -->
     <name>hadoop.tmp.dir</name>
     <value>/home/hadoop/tmp</value>
     </property>
     <property>
     <!-- ZooKeeper集群的地址 -->
     <name>ha.zookeeper.quorum</name>
     <value>hadoop001:2181,hadoop002:2181,hadoop002:2181</value>
     </property>
     <property>
     <!-- ZKFC连接到ZooKeeper超时时长 -->
     <name>ha.zookeeper.session-timeout.ms</name>
     <value>10000</value>
     </property>
    </configuration>

    3. hdfs-site.xml

    <configuration>
     <property>
     <!-- 指定HDFS副本的数量 -->
     <name>dfs.replication</name>
     <value>3</value>
     </property>
     <property>
     <!-- namenode节点数据(即元数据)的存放位置,可以指定多个目录实现容错,多个目录用逗号分隔 -->
     <name>dfs.namenode.name.dir</name>
     <value>/home/hadoop/namenode/data</value>
     </property>
     <property>
     <!-- datanode节点数据(即数据块)的存放位置 -->
     <name>dfs.datanode.data.dir</name>
     <value>/home/hadoop/datanode/data</value>
     </property>
     <property>
     <!-- 集群服务的逻辑名称 -->
     <name>dfs.nameservices</name>
     <value>mycluster</value>
     </property>
     <property>
     <!-- NameNode ID列表-->
     <name>dfs.ha.namenodes.mycluster</name>
     <value>nn1,nn2</value>
     </property>
     <property>
     <!-- nn1的RPC通信地址 -->
     <name>dfs.namenode.rpc-address.mycluster.nn1</name>
     <value>hadoop001:8020</value>
     </property>
     <property>
     <!-- nn2的RPC通信地址 -->
     <name>dfs.namenode.rpc-address.mycluster.nn2</name>
     <value>hadoop002:8020</value>
     </property>
     <property>
     <!-- nn1的http通信地址 -->
     <name>dfs.namenode.http-address.mycluster.nn1</name>
     <value>hadoop001:50070</value>
     </property>
     <property>
     <!-- nn2的http通信地址 -->
     <name>dfs.namenode.http-address.mycluster.nn2</name>
     <value>hadoop002:50070</value>
     </property>
     <property>
     <!-- NameNode元数据在JournalNode上的共享存储目录 -->
     <name>dfs.namenode.shared.edits.dir</name>
     <value>qjournal://hadoop001:8485;hadoop002:8485;hadoop003:8485/mycluster</value>
     </property>
     <property>
     <!-- Journal Edit Files的存储目录 -->
     <name>dfs.journalnode.edits.dir</name>
     <value>/home/hadoop/journalnode/data</value>
     </property>
     <property>
     <!-- 配置隔离机制,确保在任何给定时间只有一个NameNode处于活动状态 -->
     <name>dfs.ha.fencing.methods</name>
     <value>sshfence</value>
     </property>
     <property>
     <!-- 使用sshfence机制时需要ssh免密登录 -->
     <name>dfs.ha.fencing.ssh.private-key-files</name>
     <value>/root/.ssh/id_rsa</value>
     </property>
     <property>
     <!-- SSH超时时间 -->
     <name>dfs.ha.fencing.ssh.connect-timeout</name>
     <value>30000</value>
     </property>
     <property>
     <!-- 访问代理类,用于确定当前处于Active状态的NameNode -->
     <name>dfs.client.failover.proxy.provider.mycluster</name>
     <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
     </property>
     <property>
     <!-- 开启故障自动转移 -->
     <name>dfs.ha.automatic-failover.enabled</name>
     <value>true</value>
     </property>
    </configuration>

    4. yarn-site.xml

    <configuration>
     <property>
     <!--配置NodeManager上运行的附属服务。需要配置成mapreduce_shuffle后才可以在Yarn上运行MapReduce程序。-->
     <name>yarn.nodemanager.aux-services</name>
     <value>mapreduce_shuffle</value>
     </property>
     <property>
     <!-- 是否启用日志聚合(可选) -->
     <name>yarn.log-aggregation-enable</name>
     <value>true</value>
     </property>
     <property>
     <!-- 聚合日志的保存时间(可选) -->
     <name>yarn.log-aggregation.retain-seconds</name>
     <value>86400</value>
     </property>
     <property>
     <!-- 启用RM HA -->
     <name>yarn.resourcemanager.ha.enabled</name>
     <value>true</value>
     </property>
     <property>
     <!-- RM集群标识 -->
     <name>yarn.resourcemanager.cluster-id</name>
     <value>my-yarn-cluster</value>
     </property>
     <property>
     <!-- RM的逻辑ID列表 -->
     <name>yarn.resourcemanager.ha.rm-ids</name>
     <value>rm1,rm2</value>
     </property>
     <property>
     <!-- RM1的服务地址 -->
     <name>yarn.resourcemanager.hostname.rm1</name>
     <value>hadoop002</value>
     </property>
     <property>
     <!-- RM2的服务地址 -->
     <name>yarn.resourcemanager.hostname.rm2</name>
     <value>hadoop003</value>
     </property>
     <property>
     <!-- RM1 Web应用程序的地址 -->
     <name>yarn.resourcemanager.webapp.address.rm1</name>
     <value>hadoop002:8088</value>
     </property>
     <property>
     <!-- RM2 Web应用程序的地址 -->
     <name>yarn.resourcemanager.webapp.address.rm2</name>
     <value>hadoop003:8088</value>
     </property>
     <property>
     <!-- ZooKeeper集群的地址 -->
     <name>yarn.resourcemanager.zk-address</name>
     <value>hadoop001:2181,hadoop002:2181,hadoop003:2181</value>
     </property>
     <property>
     <!-- 启用自动恢复 -->
     <name>yarn.resourcemanager.recovery.enabled</name>
     <value>true</value>
     </property>
     <property>
     <!-- 用于进行持久化存储的类 -->
     <name>yarn.resourcemanager.store.class</name>
     <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
     </property>
    </configuration>

    5. mapred-site.xml

    <configuration>
     <property>
     <!--指定mapreduce作业运行在yarn上-->
     <name>mapreduce.framework.name</name>
     <value>yarn</value>
     </property>
    </configuration>

    5. slaves

    配置所有从属节点的主机名或IP地址,每行一个。所有从属节点上的DataNode服务和NodeManager服务都会被启动。

    hadoop001
    hadoop002
    hadoop003

    AG广东会,山东十一选五,大发:4.4 分发程序

    将Hadoop安装包分发到其他两台服务器,分发后建议在这两台服务器上也配置一下Hadoop的环境变量。

    # 将安装包分发到hadoop002
    scp -r /usr/app/hadoop-2.6.0-cdh5.15.2/ hadoop002:/usr/app/
    # 将安装包分发到hadoop003
    scp -r /usr/app/hadoop-2.6.0-cdh5.15.2/ hadoop003:/usr/app/

    AG广东会,山东十一选五,大发:5.1 启动ZooKeeper

    分别到三台服务器上启动ZooKeeper服务:

     zkServer.sh start

    AG广东会,山东十一选五,大发:5.2 启动Journalnode

    分别到三台服务器的的${HADOOP_HOME}/sbin目录下,启动journalnode进程:

    hadoop-daemon.sh start journalnode

    AG广东会,山东十一选五,大发:5.3 初始化NameNode

    hadop001上执行NameNode初始化命令:

    hdfs namenode -format

    执行初始化命令后,需要将NameNode元数据目录的内容,复制到其他未格式化的NameNode上。元数据存储目录就是我们在hdfs-site.xml中使用dfs.namenode.name.dir属性指定的目录。这里我们需要将其复制到hadoop002上:

     scp -r /home/hadoop/namenode/data hadoop002:/home/hadoop/namenode/

    AG广东会,山东十一选五,大发:5.4 初始化HA状态

    在任意一台NameNode上使用以下命令来初始化ZooKeeper中的HA状态:

    hdfs zkfc -formatZK

    AG广东会,山东十一选五,大发:5.5 启动HDFS

    进入到hadoop001${HADOOP_HOME}/sbin目录下,启动HDFS。此时hadoop001hadoop002上的NameNode服务,和三台服务器上的DataNode服务都会被启动:

    start-dfs.sh

    AG广东会,山东十一选五,大发:5.6 启动YARN

    进入到hadoop002${HADOOP_HOME}/sbin目录下,启动YARN。此时hadoop002上的ResourceManager服务,和三台服务器上的NodeManager服务都会被启动:

    start-yarn.sh

    需要注意的是,这个时候hadoop003上的ResourceManager服务通常是没有启动的,需要手动启动:

    yarn-daemon.sh start resourcemanager

    六、查看集群

    AG广东会,山东十一选五,大发:6.1 查看进程

    成功启动后,每台服务器上的进程应该如下:

    [root@hadoop001 sbin]# jps
    4512 DFSZKFailoverController
    3714 JournalNode
    4114 NameNode
    3668 QuorumPeerMain
    5012 DataNode
    4639 NodeManager
    [root@hadoop002 sbin]# jps
    4499 ResourceManager
    4595 NodeManager
    3465 QuorumPeerMain
    3705 NameNode
    3915 DFSZKFailoverController
    5211 DataNode
    3533 JournalNode
    [root@hadoop003 sbin]# jps
    3491 JournalNode
    3942 NodeManager
    4102 ResourceManager
    4201 DataNode
    3435 QuorumPeerMain

    AG广东会,山东十一选五,大发:6.2 查看Web UI

    HDFS和YARN的端口号分别为500708080,界面应该如下:

    此时hadoop001上的NameNode处于可用状态:

    而hadoop002上的NameNode则处于备用状态:



    hadoop002上的ResourceManager处于可用状态:



    hadoop003上的ResourceManager则处于备用状态:



    同时界面上也有Journal Manager的相关信息:


    七、集群的二次启动

    上面的集群初次启动涉及到一些必要初始化操作,所以过程略显繁琐。但是集群一旦搭建好后,想要再次启用它是比较方便的,步骤如下(首选需要确保ZooKeeper集群已经启动):

    hadoop001启动 HDFS,此时会启动所有与 HDFS 高可用相关的服务,包括 NameNode,DataNode 和 JournalNode:

    start-dfs.sh

    hadoop002启动YARN:

    start-yarn.sh

    这个时候hadoop003上的ResourceManager服务通常还是没有启动的,需要手动启动:

    yarn-daemon.sh start resourcemanager

    参考资料

    以上搭建步骤主要参考自官方文档:

    HDFS High Availability Using the Quorum Journal ManagerResourceManager High Availability

    总结

    以上所述是小编给大家介绍的基于 ZooKeeper 搭建 Hadoop 高可用集群 的教程图解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
    如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

    上一篇:一文快速入门Docker推荐
    下一篇:Ubuntu18 给terminal改个漂亮的命令行提示符的方法
  • 相关文章
  • ?

    ? 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    基于 ZooKeeper 搭建 Hadoop 高可用集群 的教程图解 基于,ZooKeeper,搭建,Hadoop,

    AG广东会官网入口(中国)官方网站-IOS/Android通用版(2026已更新)