HadoopHA及yarn

        

1. Hadoop 2.0 产生背景

1) Hadoop 1.0 中 HDFS 和 MapReduce 在高可用、扩展性等方面存在问题 2) HDFS 存在的问题 1. NameNode 单点故障,难以应用于在线场景 2. NameNode 压力过大,且内存受限,影响系统扩展性 3. MapReduce 存在的问题 1. JobTracker 访问压力大,影响系统扩展性 2. 难以支持除 MapReduce 之外的计算框架,比如 Spark、Storm 等 3) Hadoop 2.x 由 HDFS、MapReduce 和 YARN 三个分支构 1. HDFS:分布式文件存储系统; 2. YARN:资源管理系统 3. MapReduce:运行在 YARN 上的 MR;
        

2. HDFS 2.x

1) 解决单点故障 1. HDFS HA:通过主备 NameNode 解决,如果主 NameNode 发生故障,则切换到备 NameNode 上 2) 解决内存受限问题 1. HDFS Federation(联邦机制)、HA 2. 2.x 支持 2 个节点的 HA,3.0 实现了一主多从 1. 水平扩展,支持多个 NameNode; 2. 每个 NameNode 分管一部分目录; 3. 所有 NameNode 共享所有 DataNode 存储资源 3) 2.x 仅是架构上发生了变化,使用方式不变 4) 对 HDFS 使用者透明 5) HDFS 1.x 中的命令和 API 仍可以使用
        

3. HDFS 2.0 HA 高可用

1) JN 实现主备 NN 间的数据共享 1. 主备 NameNode 2. 解决单点故障 2) 两种切换选择 1. 手动切换:通过命令实现主备之间的切换,可以用 HDFS 升级等场合 2. 自动切换:基于 Zookeeper 实现 3) 基于 Zookeeper 自动切换方案
        

4. YARN 介绍

1) Hadoop 2.0 新引入的资源管理系统,直接从 MRv1 演化而来的 1. 核心思想:将 MRv1 中 JobTracker 的资源管理和任务调度两个功能分开,分别由 ResourceManager 和 ApplicationMaster 进程实现 2. ResourceManager: 负责整个集群的资源管理和`调度。 3. ApplicationMaster:负责应用程序相关的事务,比如任务调度、任务监控和容错等。 2) YARN 的引入,使得多个计算框架可运行在一个集群中 3) 流程大致如下 1. client 客户端向 yarn 集群(resourcemanager)提交任务 2. resourcemanager 选择一个 node 创建 appmaster 3. appmaster 根据任务向 rm 申请资源 4. rm 返回资源申请的结果 5. appmaster 去对应的 node 上创建任务需要的资源(container 形式,包括内存和CPU) 6. appmaster 负责与 nodemanager 进行沟通,监控任务运行 7. 最后任务运行成功,汇总结果。
        

4. MapReduce On YARN

1) MapReduce On YARN:MRv2 2) 将 MapReduce 作业直接运行在 YARN 上,而不是由 JobTracker 和TaskTracker 构建的 MRv1 系统中 3) 基本功能模块 1. YARN:负责资源管理和调度 2. MRAppMaster:负责任务切分、任务调度、任务监控和容错等 3. MapTask/ReduceTask:任务驱动引擎,与 MRv1 一致 4) 每个 MapRduce 作业对应一个 MRAppMaster 任务调度 1. YARN 将资源分配给 MRAppMaster 2. MRAppMaster 进一步将资源分配给内部的任务 5) MRAppMaster 容错 1. 失败后,由 YARN 重新启动 2. 任务失败后,MRAppMaster 重新申请资源


 

5. Hadoop2.X HA搭建

1) Hadoop-env.sh (配置jdk)
2) core-site.xml
        <property>
            <name>fs.defaultFS</name>
            <value>hdfs://sxt</value>
        </property>
        <property>
            <name>ha.zookeeper.quorum</name>
            <value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
        </property>
        <property>
            <name>hadoop.tmp.dir</name>
            <value>/opt/hadoop</value>
        </property>

3) hdfs-site.xml
        <property>
            <name>dfs.nameservices</name>
            <value>sxt</value>
        </property>
        <property>
             <name>dfs.ha.namenodes.sxt</name>
             <value>nn1,nn2</value>
        </property>
        <property>
            <name>dfs.namenode.rpc-address.sxt.nn1</name>
            <value>hadoop1:8020</value>
        </property>
        <property>
              <name>dfs.namenode.rpc-address.sxt.nn2</name>
              <value>hadoop2:8020</value>
        </property>
        <property>
              <name>dfs.namenode.http-address.sxt.nn1</name>
              <value>hadoop1:50070</value>
        </property>
        <property>
              <name>dfs.namenode.http-address.sxt.nn2</name>
              <value>hadoop2:50070</value>
        </property>
        <property>
              <!-- 指定namenode元数据存储在journalnode中的路径 -->
              <name>dfs.namenode.shared.edits.dir</name>                  <value>qjournal://hadoop2:8485;hadoop3:8485;hadoop4:8485/sxt</value>
        </property>
        <property>
                <!-- 指定HDFS客户端连接active namenode的java类 -->
              <name>dfs.client.failover.proxy.provider.sxt</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
        </property>
        <property>
             <!-- 配置隔离机制为ssh 防止脑裂 -->
              <name>dfs.ha.fencing.methods</name>
              <value>sshfence</value>
        </property>
        <property>
            <!-- 指定秘钥的位置 -->
              <name>dfs.ha.fencing.ssh.private-key-files</name>
              <value>/root/.ssh/id_dsa</value>
        </property>
        <property>
             <!-- 指定journalnode日志文件存储的路径 -->
              <name>dfs.journalnode.edits.dir</name>
              <value>/opt/hadoop/data</value>
        </property>
        <property>
            <!-- 开启自动故障转移 -->
               <name>dfs.ha.automatic-failover.enabled</name>
               <value>true</value>
        </property>

4) 配置hadoop中的slaves
5) 准备zookeeper
    1. 三台zookeeper:hadoop1,hadoop2,hadoop3
    2. 编辑zoo.cfg配置文件
        1. 修改dataDir=/opt/zookeeper
        2. server.1=node01:2888:3888
        3. server.2=node02:2888:3888
        4. server.3=node03:2888:3888
    3. 在dataDir目录中创建一个myid的文件,文件内容分别为1,2,3
6) 发送其他节点服务器 环境变量配置
7) 启动三个zookeeper:./zkServer.sh start
8) 启动三个JournalNode:./hadoop-daemon.sh start journalnode
9) 在其中一个namenode上格式化:hdfs namenode -format
10) 把刚刚格式化之后的元数据拷贝到另外一个namenode上
    1.启动刚刚格式化的namenode :  hadoop-daemon.sh start namenode
    2.在没有格式化的namenode上执行:hdfs namenode -bootstrapStandby
    3.启动第二个namenode    hadoop-daemon.sh start namenode
11) 在其中一个namenode上初始化zkfc:hdfs zkfc -formatZK
12) 停止上面节点:stop-dfs.sh
13) 全面启动:start-dfs.sh
14) yarn-daemon.sh start resourcemanager  (yarn resourcemanager)
15) 有可能会出错的地方
    1.确认每台机器防火墙均关掉
    2.确认每台机器的时间是一致的
    3.确认配置文件无误,并且确认每台机器上面的配置文件一样
    4.如果还有问题想重新格式化,那么先把所有节点的进程关掉,killjava all
    5.删除之前格式化的数据目录hadoop.tmp.dir属性对应的目录,所有节点同步都删掉,别单删掉之前的一个,删掉三台JN节点中dfs.journalnode.edits.dir属性所对应的目录
    6.接上面的第6步又可以重新格式化已经启动了
    7.最终Active Namenode停掉的时候,StandBy可以自动接管!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值