hdfs HA + MR HA

Hodoop1.x 到 Hadoop2.x

1、Hadoop 1.x 存在的问题:

– HDFS存在的问题

• NameNode单点故障,难以应用于在线场景

• NameNode压力过大,且内存受限,影响系统扩展性

– MapReduce存在的问题

• JobTracker访问压力大,影响系统扩展性

•难以支持除MapReduce之外的计算框架,比如Spark、Storm等

 

2、Hadoop 1.x与Hadoop 2.x

– Hadoop2.x由HDFS、MapReduce和YARN三个分支构成;

• HDFS:NNFederation、HA;

• MapReduce:运行在YARN上的MR;

• YARN:资源管理系统

3、Hadoop 2.x

– 解决HDFS1.0中单点故障和内存受限问题。

– 解决单点故障

• HDFSHA:通过主备NameNode解决

•如果主NameNode发生故障,则切换到备NameNode上

– 解决内存受限问题

•HDFSFederation(联邦)

• 水平扩展,支持多个NameNode;

• 每个NameNode分管一部分目录;

• 所有NameNode共享所有DataNode存储资

– 2.x仅是架构上发生了变化,使用方式不变

– 对HDFS使用者透明

– HDFS1.x中的命令和API仍可以使用

Hadoop 2.x HA

1、HDFS 2.0 HA

– 主备NameNode

– 解决单点故障

• 主NameNode对外提供服务,备NameNode同步主NameNode元数据, 以待切换

• 所有DataNode同时向两个NameNode汇报数据块信息

– 两种切换选择

• 手动切换:通过命令实现主备之间的切换,可以用HDFS升级等场合

• 自动切换:基于Zookeeper实现

– 基于Zookeeper自动切换方案

•ZookeeperFailoverController:监控NameNode健康状态,

• 并向Zookeeper注册NameNode

• NameNode挂掉后,ZKFC为NameNode竞争锁,获得ZKFC锁

• 的NameNode变为active

 

2、HDFS 2.x Federation

– 通过多个namenode/namespace把元数据的存储和管理分散到多个 节点中,使到namenode/namespace可以通过增加机器来进行水平 扩展。

– 能把单个namenode的负载分散到多个节点中,在HDFS数据规模较大 的时候不会也降低HDFS的性能。可以通过多个namespace来隔离不 同类型的应用,把不同类型应用的HDFS元数据的存储和管理分派到不 同的namenode中。

 

3、yarn

– YARN:YetAnotherResourceNegotiator;

– Hadoop2.0新引入的资源管理系统,直接从MRv1演化而来的;

• 核心思想:将MRv1中JobTracker的资源管理和任务调度两个功能分开, 分别由ResourceManager和ApplicationMaster进程实现

•ResourceManager:负责整个集群的资源管理和调度

•ApplicationMaster:负责应用程序相关的事务,比如任务调度、任务监控和容错等

– YARN的引入,使得多个计算框架可运行在一个集群中

• 每个应用程序对应一个ApplicationMaster

• 目前多个计算框架可以运行在YARN上,比如MapReduce、Spark、 Storm等

 

4、MapReduce On YARN

–MapReduceOnYARN:MRv2

– 将MapReduce作业直接运行在YARN上,而不是由JobTracker和TaskTracker构建的 MRv1系统中

– 基本功能模块

• YARN:负责资源管理和调度

• MRAppMaster:负责任务切分、任务调度、任务监控和容错等

•MapTask/ReduceTask:任务驱动引擎,与MRv1一致

– 每个MapRduce作业对应一个MRAppMaster

• MRAppMaster任务调度

• YARN将资源分配给MRAppMaster

• MRAppMaster进一步将资源分配给内部的任务

– MRAppMaster容错

• 失败后,由YARN重新启动

• 任务失败后,MRAppMaster重新申请资源

 

 

 

5、实现HA的本质:

1>    fsimage (active NameNode格式化之后将fsimage复制给standbyNameNode)

2>    edits (通过journalNode同步)

6、先决条件:zookeeper集群

1>作用

1>    监控NN 状态并汇报给Zookeeper

2>    将 standby 转换为 active

2> 搭建

 

NN

DN

JN

ZK

ZKFC zookeeper failover controller

Node3

1

 

 

1

1

Node4

1

1

1

1

1

Node5

 

1

1

1

 

Node6

 

1

1

 

 

 

如上,node3、node4和node5安装Zookeeper

步骤:a.解压tar包:tar -zxvf zookeeper-3.4.6.tar.gz

         b.修改zoo.conf文件(在conf目录下将zoo_sample.cfg重命名或者新建)

tickTime=2000

dataDir=/opt/zookeeper/data  #(目录需要手动创建,myid文件放该目录下)

dataLogDir=/opt/zookeeper/dataLog #(此条可以不写)

clientPort=2181 

initLimit=5

syncLimit=2

server.1=node3:2888:3888  #需要添加

server.2=node4:2888:3888

server.3=node5:2888:3888

 

myid的内容依据zoo.conf,如node3的myid内容为数字1,node4的为2

         c.同步三台机器的zoo.conf配置文件

 

将Zookeeper配置到系统环境中:

vi ~/.bash_profile (添加以下两行)

exportZOOKEEPER=/usr/hadoopsoft/zookeeper-3.4.6

export PATH=$PATH:$ZOOKEEPER/bin

source ~/.bash_profile

 

启动命令:

zkServer.sh start

 

7、搭建

 

NN

DN

JN

ZK

ZKFC zookeeper failover controller

Node3

1

 

 

1

1

Node4

1

1

1

1

1

Node5

 

1

1

1

 

Node6

 

1

1

 

 

 

搭建步骤:

1、  主机,修改hosts,网络 – 网络连接、关闭防火墙

2、  时间同步

3、  Jdk配置环境变量

4、  下载tar 解压

5、etc/hadoop/hadoop-env.sh

修改export JAVA_HOME=/usr/java/ jdk1.7.0_79

6、  免密钥配置

  $ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
  $ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys

         Node3 Node4

         Node3 Node4分别与其他几个节点

7、  修改配置文件

!!!masters配置文件必须删除所有节点!!!

slaves 配置的是DN(DataNode)


core-site.xml

<configuration>

    <property>

        <name>fs.defaultFS</name>   HDFS命名空间名称

        <value>hdfs://sxt</value>

    </property>

    <property>

        <name>hadoop.tmp.dir</name>

        <value>/opt/hadoop</value>

    </property>

</configuration>

 

以下按照官方文档修改、添加

HDFS High Availability Using the Quorum JournalManager

hdfs-site.xml

<property>

 <name>dfs.nameservices</name>   命名空间名称

  <value>sxt</value>

</property>

<property>

 <name>dfs.ha.namenodes.sxt</name>   两台NN别名

 <value>nn1,nn2</value>

</property>

<property>

  <name>dfs.namenode.rpc-address.sxt.nn1</name>  NN RPC访问端口

  <value>node1:8020</value>

</property>

<property>

 <name>dfs.namenode.rpc-address.sxt.nn2</name>

  <value>node2:8020</value>

</property>

<property>

 <name>dfs.namenode.http-address.sxt.nn1</name>  NN HTTP访问端口

  <value>node1:50070</value>

</property>

<property>

 <name>dfs.namenode.http-address.sxt.nn2</name>

  <value>node2:50070</value>

</property>

<property>

 <name>dfs.namenode.shared.edits.dir</name>   执行JN集群 <value>qjournal://node4:8485;node5:8485;node6:8485/sxt</value>

</property>

<property>

 <name>dfs.client.failover.proxy.provider.sxt </name>  NN自动切换 <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>

</property>

<property>

 <name>dfs.ha.fencing.methods</name>  指定ssh认证以及私钥文件

 <value>sshfence</value>

</property>

<property>

 <name>dfs.ha.fencing.ssh.private-key-files</name>

  <value>/root/.ssh/id_dsa</value>  要配置为自己主机私钥文件(ssh加密方式不同需要修改id_dsa)

</property>

<property>

 <name>dfs.journalnode.edits.dir</name>  JN节点上edits文件存放目录

  <value>/opt/journal/data</value>

</property>

 

注:以上配置中的红色“sxt”为hdfs命名空间名称,可全部替换为自己的命名

 

vi ~/.bash_profile (将hadoop配置到环境中)

export JAVA_HOME=/usr/java/jdk1.7.0_79

export PATH=$PATH:$JAVA_HOME/bin

exportCLASSPATH=.:/lib/dt.jar:/lib/tools.jar

exportHADOOP_HOME=/usr/hadoopsoft/hadoop-2.5.1

exportPATH=$PATH:$HADOOP_HOME/bin

exportPATH=$PATH:$HADOOP_HOME/sbin

exportZOOKEEPER=/usr/hadoopsoft/zookeeper-3.4.6

export PATH=$PATH:$ZOOKEEPER/binsource ~/.bash_profile

source ~/.bash_profile

 

同步配置文件!!

 

检查目录是否存在/opt/hadoop  全部删除

 

操作::

首先启动所有的JN   hadoop-daemon.sh start journalnode

然后选一台NN 执行格式化命令  hdfs namenode -format

接着启动 这台NN  hadoop-daemon.sh start namenode

最后在另外一台NN 执行同步命令   hdfs namenode -bootstrapStandby

 

 

配置HDFS中关于ZK的内容

修改hdfs-site.xml

<property>

  <name>dfs.ha.automatic-failover.enabled</name>  启动自动切换设置为true

  <value>true</value>

 </property>

 

修改core-site.xml

<property>

  <name>ha.zookeeper.quorum</name>   指定zk集群

<value>node3:2181,node4:2181,node5:2181</value>

 </property>

 

 

操作:

启动zk,同时一起启动三台

zkServer.sh start

在其中一台NN上执行格式化zk命令  hdfs zkfc -formatZK

 

停止之前启动的节点

 

启动dfsstart-dfs.sh

 

HDFS HA搭建完成以后

重启时,首先需要启动zk  再执行hdfs启动脚本

 

MR—Hadoop核心组件

– Hadoop  分布式计算框架(MapReduce)

 

1、MapReduce设计理念

–何为分布式计算。

–移动计算,而不是移动数据。

 

2、计算框架MR

 


 

3、MapReduce的 Split大小

– max.split(100M)

– min.split(10M)

– block(64M)

– max(min.split,min(max.split,block))

 

4、Mapper

– Map-reduce的思想就是“分而治之”

• Mapper负责“分”,即把复杂的任务分解为若干个“简单的任务”执行

–“简单的任务”有几个含义:

• 数据或计算规模相对于原任务要大大缩小;

• 就近计算,即会被分配到存放了所需数据的节点进行计算;

• 这些小任务可以并行计算,彼此间几乎没有依赖关系

 

5、Hadoop计算框架Reducer

–对map阶段的结果进行汇总。

– Reducer的数目由mapred-site.xml配置文件里的项目mapred.reduce.tasks 决定。缺省值为1,用户可以覆盖之

 

 

6、Hadoop计算框架Shuffler

–在mapper和reducer中间的一个步骤

–可以把mapper的输出按照某种key值重新切分和组合成n份,把key值符合某种范围的输出送到特定的reducer那里去处理

–可以简化reducer过程

 


Hadoop计算框架shuffle过程详解

 

– 每个map task都有一个内存缓冲区(默认是100MB),存储着map的输出结果

– 当缓冲区快满的时候需要将缓冲区的数据 以一个临时文件的方式存放到磁盘(Spill)

– 溢写是由单独线程来完成,不影响往缓冲 区写map结果的线程(spill.percent,默认是 0.8)

– 当溢写线程启动后,需要对这80MB空间内 的key做排序(Sort)

 

–假如client设置过Combiner,那么现在就是使用Combiner的时候了。将有相同key的key/value对的value加起来,减少溢写到磁盘的数据量。( reduce1,word1,[8])。

–当整个map task结束后再对磁盘中这个map task产生的所有临时文件做合并(Merge),对于“word1”就是像这样的:{“word1”, [5, 8, 2, …]},假如有Combiner,{word1 [15]},最终产生一个文件。

– reduce  从tasktrackercopy数据

– copy过来的数据会先放入内存缓冲区中,这里的缓冲区大小要比map端的更为灵活,它基于JVM的heap size设置

– merge有三种形式:1)内存到内存 2)内存到磁盘 3)磁盘到磁盘。merge 从不同tasktracker上拿到的数据,{word1 [15,17,2]}

–参考博客http://langyu.iteye.com/blog/992916?page=3#comments

 

7、MapReduce的架构

一主多从架构

–主 JobTracker: ResourceManager

• 负责调度分配每一个子任务task运行于TaskTracker上,如果发现有失败的task就重新分配其任务到其他节点。每一个hadoop集群中只一个JobTracker, 一般它运行在Master节点上。

–从TaskTracker:NodeManager

• TaskTracker主动与JobTracker通信,接收作业,并负责直接执行每一个任务 ,为了减少网络带宽TaskTracker最好运行在HDFS的DataNode上

MR搭建、HA

 

NN

DN

JN

ZK

ZKFC zookeeper failover controller

RS

Node1

1

 

 

1

1

 

Node2

1

1

1

1

1

 

Node3

 

1

1

1

 

1

Node4

 

1

1

 

 

1

 

停掉HA集群

stop-dfs.sh

 

修改配置文件:

mapred-site.xml:

<configuration>

   <property>

       <name>mapreduce.framework.name</name>  mr框架运行在yarn上,通过yarn做资源管理

       <value>yarn</value>

   </property>

</configuration>

 

yarn-site.xml:

<configuration>

   <property>

       <name>yarn.nodemanager.aux-services</name>

        <value>mapreduce_shuffle</value>

   </property>

</configuration>

 

ResourceManager NodeManager主从结构

RS存在单点故障问题   所以要对他做HA  通过zk

 

修改yarn-site.xml配置文件

<property>

  <name>yarn.resourcemanager.ha.enabled</name>  启用ha 设置为true

  <value>true</value>

 </property>

 <property>

  <name>yarn.resourcemanager.cluster-id</name>  名称要与之前namespace不同(之前我设置了“sxt”)

  <value>cluster1</value>

 </property>

 <property>

  <name>yarn.resourcemanager.ha.rm-ids</name>

  <value>rm1,rm2</value>

 </property>

 <property>

  <name>yarn.resourcemanager.hostname.rm1</name> 分别指定两台rm

  <value>node5</value>

 </property>

 <property>

  <name>yarn.resourcemanager.hostname.rm2</name>

  <value>node6</value>

 </property>

 <property>

  <name>yarn.resourcemanager.zk-address</name>   指定zk集群

  <value>node3:2181,node4:2181,node5:2181</value>

 </property>

 

 

 

操作

停止之前的hdfs ha集群

stop-dfs.sh

 

启动Zookeeper集群:zkServer.sh start (在zk每一台机器上执行)

启动集群:start-all.sh(在一台机器上执行)


  

   

Rs会在你运行启动命令的节点 启动

Rs需要手动来启动,两台分别执行一下命令

yarn-daemon.sh start resourcemanager





Hadoop集群搭建完成

启动

启动Zookeeper集群,每台机器执行命令: zkServer.sh start

start-all.sh

手动启动RS,两台配置了resourcemanager的机器:yarn-daemon.sh start resourcemanager

 

浏览器访问node3:50070


访问node4:50070

可以手动停止处于active状态的node4的NN进程:hadoop-daemons.shstop namenode

启动:hadoop-daemons.shstart namenode

再次浏览器访问node3node4的50070端口查看状态

 

访问node5:8088(RM)

如图,此时node5的RM处于standby状态将自动重定向到active状态的node6

手动停止node6的RM进程:yarn-deamon.sh stop resourcemanager

启动命令:yarn-deamon.sh start resourcemanager

再次访问node5和node6的8088端口,可以看出active状态的机器已经改变

 

至此,HDFS HA与MR HA已经搭建完成

 

停止

stop-all.sh

zkServer.sh stop

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值