本文参考官方文档
一:典型的HA集群介绍
为了解决NameNode的单节点故障问题,hadoop2.0以后的版本可以配置多个NameNode节点,如上图所示。在两个单独的计算机中配置连个NameNode 节点,在同一时间只有一个NameNode节点处于活跃状态,另一个节点处于热备用状态。Active NameNode 节点负责集群中所有客户端的操作,Standby NameNode 节点则实时收集整个集群的状态一再必要的时候进行故障转移。
- Standby NameNode 节点如何保证自己与Active NameNode 节点处于同步状态?
集群中会配置一组专门用于存放NameNode 节点的操作日志的文件的节点,成为JounalNodes节点,当Active NameNode 执行任何修改时,他都会将这些记录持久化到JounalNode节点中。Standby NomeNode 则会实时监控JounalNode的变更操作,从中读取日志文件,将其同步到自己的命名空间中,来确保自己的命名空间中保存了当前集群中的最新的信息。从而保证了在发生故障转移时,自己的命名空间的信息和之前的Active NameNode节点中的信息是同步的。
心跳机制的设置
为了使主备节点进行快速的故障转移,集群中的所有DateNode节点会将心跳信息同时发送给主备节点,以保证两个NameNode节点中都保存了当前集群中的最新的快位置信息保证JounalNode的正确性
在同一时间,JounalNode只允许一个活跃的NameNode节点执行写操作,其他NameNode节点只允许从JounalNode节点中读取日志信息。当发生故障转移的期间,变为Active NameNode 的节点将接管写入JounalNode的角色。从而有效防止了JounalNode的节点数据分裂的情况。
二:高可用结群的硬件部署
NameNode节点:每个NameNode节点需要配置在独立的物理节点中,性能应该相同
JounalNode节点:JounalNode进程相对轻量级,可以以其他进程并置,注意:集群中至少有3个JounalNode的守护进程,以避免单机故障 。为了更好的避免单机故障,应该运行奇数个JN节点。
三:主从结构
主:jobtracker
从:tasktracker
四:四个阶段
1.Split
2. Mapper:key-value(对象)
3. Shuffle
1.分区:(partition,HashPartation:根据key的hashcode值和Reduce的数量 模运算),可以自定义分区,运算速度要快,要解决数据倾斜问题和reduce负载均衡。
2.排序:默认按照字典排序 WriterCompartor(比较)
3.合并:减少当前mapper输出数据,根据key相同(比较),把value进行合并。
4.分组:(key相同(比较),value组成一个集合)merge。
4.Reduce
输入数据:key+迭代器
五:Hadoop 2.5 HA搭建
1.core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>192.168.128.104:2181,192.168.128.105:2181,192.168.128.107:2181</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/xul/hadoop-2.5</value>
</property>
</configuration>
2.hdfs-site.xml
<configuration>
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>192.168.128.104:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>192.168.128.105:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>192.168.128.104:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>192.168.128.105:50070</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://192.168.128.105:8485;192.168.128.107:8485;192.168.128.108:8485/mycluster</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/usr/xul/JNdata</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
</configuration>
3.准备zookeeper
1. 三台zookeeper:hadoop1,hadoop2 ,hadoop3
2. 编辑zoo.cfg配置文件
1)修改 dataDir=/opt/zookeeper
2) server.1=hadoop1:2888:3888
server.2=hadoop2:2888:3888
server.3=hadoop3:2888:3888
3.在dataDir目录中创建一个myid的文件。文件内容为1,2,3
4.配置hadoop中的slaves
5.启动三个zookeeper : ./zkServer.sh start
6.启动三个JournalNode:./hadoop-deamon.sh start journalnode
7.在其中一个namenode上格式化,hdfs namenode -format
8. 把刚刚格式化之后的元素数据拷贝到另一个namenode中
启动刚刚格式化的namenode
在没有格式化的namenode上执行:hdfs namenode -boostrapStandby
启动第二个namenode