1. Hadoop 2.0

1.1 Hadoop1.0于Hadoop2.0的区别

1). 从整体框架来说

a. Hadoop1.0即第一代Hadoop,由分布式存储系统HDFS和分布式计算框架MapReduce组成,其中HDFS由一个NameNode和多个DateNode组成,MapReduce由一个JobTracker和多个TaskTracker组成。

b. Hadoop2.0即第二代Hadoop,内核主要由HDFS、MapReduce和YARN三个系统组成,其中YARN是一个资源管理系统,负责集群资源管理和调度,MapReduce则是运行在YARN上的离线处理框架,它与Hadoop 1.0中的MapReduce在编程模型(新旧API)和数据处理引擎(MapTask和ReduceTask)两个方面是相同的。针对Hadoop1.0单NameNode制约HDFS的扩展性问题,提出HDFS Federation(联盟),它让多个NameNode分管不同的目录进而实现访问隔离和横向扩展,同时彻底解决了NameNode单点故障问题

2). 从MapReduce计算框架来说

a. MapReduce1.0计算框架主要由三部分组成:编程模型、数据处理引擎和运行时环境。它的基本编程模型是将问题抽象成Map和Reduce两个阶段,其中Map阶段将输入的数据解析成key/value,迭代调用map()函数处理后,再以key/value的形式输出到本地目录,Reduce阶段将key相同的value进行规约处理,并将最终结果写到HDFS上;它的数据处理引擎由MapTask和ReduceTask组成,分别负责Map阶段逻辑和Reduce阶段的逻辑处理;它的运行时环境由一个JobTracker和若干个TaskTracker两类服务组成,其中JobTracker负责资源管理和所有作业的控制,TaskTracker负责接收来自JobTracker的命令并执行它。
b. MapReducer2.0具有与MRv1相同的编程模型和数据处理引擎,唯一不同的是运行时环境。MRv2是在MRv1基础上经加工之后,运行于资源管理框架Yarn之上的计算框架MapReduce。它的运行时环境不再由JobTracker和TaskTracker等服务组成,而是变为通用资源管理系统Yarn和作业控制进程ApplicationMaster,其中Yarn负责资源管理的调度而ApplicationMaster负责作业的管理。

Hadoop 常用组件 hadoop2.0的组件_hadoop

2. HDFS 2.0 HA高可用

2.1 HDFS HA背景

在Hadoop 1.x 中,Namenode是集群的单点故障,一旦Namenode出现故障,整个集群将不可用,重启或者开启一个新的Namenode才能够从中恢复。值得一提的是,Secondary Namenode并没有提供故障转移的能力。集群的可用性受到影响表现在:

  • 当机器发生故障,如断电时,管理员必须重启Namenode才能恢复可用。
  • 在日常的维护升级中,需要停止Namenode,也会导致集群一段时间不可用

1.2 HDFS HA架构

Hadoop HA(High Available)通过同时配置两个处于Active/Passive模式的Namenode来解决上述问题,分别叫Active Namenode和Standby Namenode. Standby Namenode作为热备份,从而允许在机器发生故障时能够快速进行故障转移,同时在日常维护的时候使用优雅的方式进行Namenode切换。Namenode只能配置一主一备,不能多于两个Namenode。两个Namenode存在以下特点:

  • 主Namenode处理所有的操作请求(读写),而Standby只是作为slave;
  • 两个Namenode都与一组Journal Node进行通信;
  • 当进行故障转移时,Standby在成为Active Namenode之前,会确保自己已经读取了Journal Node中的所有edit日志,从而保持数据状态与故障发生前一致;
  • Datanode同时配置主备两个Namenode,并同时发送Block报告和心跳到两台Namenode;
  • 为了防止这种脑裂现象(两台Namenode都认为自己的Active Namenode时),Journal Nodes只允许一个Namenode写入数据,内部通过维护epoch数来控制,从而安全地进行故障转移;
  • 有两种方式可以进行edit log共享:
  • 使用NFS共享edit log(存储在NAS/SAN);
  • 使用QJM共享edit log。

Hadoop 常用组件 hadoop2.0的组件_Hadoop 常用组件_02

1.3 Federation联邦

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

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

1.4 使用Zookeeper进行自动故障转移

前面提到,为了支持故障转移,Hadoop引入两个新的组件:Zookeeper Quorum和ZKFailoverController process(简称ZKFC)。

Zookeeper的任务包括:

  • 失败检测: 每个Namnode都在ZK中维护一个持久性session,如果Namnode故障,session过期,使用zk的事件机制通知其他Namenode需要故障转移;
  • Namenode选举:如果当前Active namenode挂了,另一个namenode会尝试获取ZK中的一个排它锁,获取这个锁就表名它将成为下一个Active NN。
    在每个Namenode守护进程的机器上,同时也会运行一个ZKFC,用于完成以下任务:
  • Namenode健康
  • ZK Session管理
  • 基于ZK的Namenode选举

如果ZKFC所在机器的Namenode健康状态良好,并且用于选举的znode锁未被其他节点持有,则ZKFC会尝试获取锁,成功获取这个排它锁就代表获得选举,获得选举之后负责故障转移,如果有必要,会fencing掉之前的namenode使其不可用,然后将自己的namenode切换为Active状态。

3. Hadoop2.X HA搭建

三台linux虚拟机:node01、node02、node03;

NN

DN

ZK

ZKFC

JN

RM

NM(任务管理)

Hadoop1

Y

Y

Y

Y

Y

Hadoop2

Y

Y

Y

Y

Y

Y

Y

Hadoop3

Y

Y

Y

Y

Y

  1. 环境配置与之前Hadoop1.0无差异:通过VMware的克隆虚拟机功能;配置好网络JDK 时间 hosts,保证节点间能互ping通,这里配置了host:node01、node02、node03;ssh免秘钥登录;时间同步;
  2. 下载并解压Hadoop安装包;
  3. 配置etc/hadoop/hadoop-env.sh;
export JAVA_HOME=${JAVA_HOME}
JAVA_HOME=/usr/java/jdk1.8.0_191-amd64       #这里为JDK根目录
  1. 配置etc/hadoop/core-site.xml:
<configuration>
<property>
  <name>fs.defaultFS</name>
  <value>hdfs://fzp</value>
</property>
<property>
   <name>ha.zookeeper.quorum</name>
   <value>node01:2181,node02:2181,node03:2181</value>
</property>
<property>
  <name>hadoop.tmp.dir</name>
  <value>/opt/hadoop</value>
</property>
</configuration>
  1. 配置etc/hadoop/hdfs-site.xml:
</property>
<property>
  <!-- 指定namenode元数据存储在journalnode中的路径 -->
  <name>dfs.namenode.shared.edits.dir</name>
  <value>qjournal://node01:8485;node02:8485;node03:8485/fzp</value>
</property>
<property>
<!-- 指定HDFS客户端连接active namenode的java类 -->
  <name>dfs.client.failover.proxy.provider.fzp</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/hadoop2.6.5/data</value>
</property>
<property>
<!-- 开启自动故障转移 -->
   <name>dfs.ha.automatic-failover.enabled</name>
   <value>true</value>
</property>
  1. 准备zookeeper,请参考上一小节;
  2. 配置etc/hadoop/slaves文件:
node01
node02
node03

注意:Hadoop2.0版本弱化可SecondaryNameNode的功能,所以无需配置,删除etc/hadoop/master文件。

  1. 发送其他节点服务器并配置环境变量;
  2. 测试启动:
  • 启动三个zookeeper:./zkServer.sh start;
  • 启动三个JournalNode:./hadoop-daemon.sh start journalnode;
  • 在其中一个namenode(如:node01)上格式化:hdfs namenode -format
  • 把刚刚格式化之后的元数据拷贝到另外一个namenode(node02)上:
    a) 启动刚刚格式化的namenode (node01): hadoop-daemon.sh start namenode;
    b) 在没有格式化的namenode(node02)上执行:hdfs namenode -bootstrapStandby;
    c) 启动第二个namenode(node02) hadoop-daemon.sh start namenode;
  • 在其中一个namenode上初始化zkfc:hdfs zkfc-formatZK;
  • 停止上面节点:stop-dfs.sh。
  1. 全面启动:start-dfs.sh (整体启动namenode,datanode,journanode,zkfz);
  2. 分别在node02、node03节点上启动yarn:yarn-daemon.sh start resourcemanager;
  3. 浏览器访问:
  4. Hadoop 常用组件 hadoop2.0的组件_Hadoop 常用组件_03


  5. Hadoop 常用组件 hadoop2.0的组件_hadoop_04