一、HA
-------------------------------------------------------
1.high availability 高可用性。持续服务的能力
2.多台主机之间进行集群配置
3.failover 容灾
4.single point of failure 单点故障
5.nn1 + nn2
6.解决方案1:NFS 网络文件系统,需要共享磁盘EMC
解决方案2:QJM
二、HA架构
-------------------------------------------------------
1.需要两台主机,一台active(负责所有操作) 一台 standby(维护足够多的状态,随时接管,提供容灾)
2.act sta 要同步,使用Journals进程进行信息通讯
3.act 详细记录 namenode 的写操作,并且写入到journals进程中.
4.sta 不断从journals进程中读取编辑日志,并且观察编辑日志的变化,一旦日志发生变化,sta就会进行相应的编辑操作
5.datanode 要同时向 2个nn发送块列表信息和心跳信息
6.同一时刻,只能有一个nn 处于 act
三、部署HA
---------------------------------------------------------
[hdfs.site.xml]
[-- 配置部分 --]
1.配置名称服务:dfs.nameservices
a.名称服务的逻辑名称mycluster
b.配置项
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
2.配置名称服务nameservices中的每个namenode的名称列表
a.配置项,两个namenode nn1,nn2
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
b.注意:当前的hadoop2.7.2最多配置两个namenode
3.配置每个namenode的 RPC 地址
a.配置项,nn1 的通讯地址s100 nn2的是s800
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>s100:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>s800:8020</value>
</property>
4.配置每个namenode 的 webui地址
a.配置项
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>s100:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>s800:50070</value>
</property>
5.配置journal :配置每个namenode 的 共享编辑目录 share-editlog-dir
a.配置项 qjournal:// journals进程的协议
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://s100:8485;s700:8485;s800:8485/mycluster</value>
</property>
b.一般配置3个journal进程 s100(1NN) s700(sNN) s800(2NN)
6.配置 客户端 容灾 代理供应商 类
a.用于指定 客户端进行检测,当前活跃的namenode 是哪个 的一个类
b.配置项
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
7.配置HA防护方法集合
a.QJM防止脑裂(同时写入数据)的发生,同一时刻仅会有一个namenode处于active状态
b.可选配置(可不配)
8.配置 hdfs 的文件系统fs.defaultFS
a.配置项,此处不再是s100,而是集群mycluster,名称服务
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
9.配置 journal node 本地目录用于存放 editlog
a.配置项
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/ubuntu/hadoop/joural</value>
</property>
[-- 部署过程 --]
1.在 JN 节点之上,启动jn进程
$> hadoop-daemon.sh start journalnode
2.启动jn之后,需要在disk上完成两个nn的元数据同步工作
a.如果正在构建新的hdfs集群,需要先在其中一台上,格式化磁盘 hdfs -fromat namenode
b.如果已经格式化文件系统,或者启用在non-ha的集群之上,要启用ha功能。即手动拷贝现有NN上的节点目录
拷贝到另外一个NN相同目录下。
c.在未格式化的nn上执行命令:
$> hdfs namenode -bootstrapStandby
保证jn有足够多的事务,来启动两个nn
d.如果正在将非ha namenode 转换成ha,执行命令
$> hdfs namenode -initializeSharedEdits
会从local的namenode编辑日志目录加载到jns中,这样jn进程中就有数据了
e.启动两个nn
f.通过webui查看每个nn的状态
[-- 管理 --]
1.手动切换namenode 的 active 和 stand by 状态
$> hdfs haadmin -transitionToActive nn1 //切换到激活态
$> hdfs haadmin -transitionToStandby nn1 //切换到待命态
四、Set Rack Aware 设定机架感知
-----------------------------------
1.保证网络交换机故障或者集群内部事件问题出现的时候,数据仍然可用
2.编写一个脚本或者自定义的机架感知类,实现接口DNSToSwitchMapping
3.将自定义的机架感知类,打成jar包,分发到所有节点的${hadoop_home}/share/xx/x
4.修改配置文件core-site:指定属性 net.topology.node.switch.mapping.impl = 自定义的机架感知类
<property>
<name>net.topology.node.switch.mapping.impl</name>
<value>demo1.ts01.MyDNSToSwitchMapping</value>
</property>
5.分发到所有的机器上
6.重启集群
/**
* 自定义机架感知类,实现DNSToSwitchMapping接口
* 得到机架,节点的映射
*/
public class MyDNSToSwitchMapping implements DNSToSwitchMapping{
@Override
/**
* 解析主机名/ip地址,返回 xx/xxx rack1/s100
*/
public List<String> resolve(List<String> names) {
List<String> lists = new ArrayList<String>();
//判断有效性
if(names != null && !names.isEmpty())
{
for(String n : names)
{
int num = Integer.parseInt(n.substring(1));
String rack = "";
if(num <= 400)
{
rack = "rack1";
}
else
{
rack = "rack2";
}
lists.add("/" + rack + "/" + n);
}
}
return lists;
}
@Override
public void reloadCachedMappings() {
// TODO Auto-generated method stub
}
@Override
public void reloadCachedMappings(List<String> names) {
// TODO Auto-generated method stub
}
}
五、Hadoop distcp 并行拷贝
--------------------------------------------
1.通过hadoop mr技术实现并行复制,递归拷贝文件夹。性能较高
$> Hadoop distcp /user/ubuntu/data /user/ubuntu/data_bak
2.可以跨集群拷贝
$> Hadoop distcp hdfs://s100:8020/user/ubuntu/data hdfs://183.0.xx.xx:8020/user/ubuntu/data_bak
六、归档 har : hadoop archive
-----------------------------------------------
1.创建hadoop 归档文件
$> hadoop archive -archiveName data_bak.har -p /user/ubuntu/data_bak /user/ubuntu/
2.查看归档文件har
$> hadoop fs -lsr har:///user/ubuntu/data_bak.har
3.注意
a.har文件的大小和原始文件一样,是创建的文件副本。考虑好磁盘空间的使用
b.har文件一旦创建便不能再修改,要想从中增减文件,必须重新创建存档文件
七、HDFS的数据的完整性
----------------------------------------------------
1.checksum 校验和
两次校验和不一致,说明数据已经损坏。该技术只能校测数据是否损坏,不能修复数据
2.CRC-32 循环冗余校验
cycle redundent check - 32 位
3.指定校验的字节数组的长度,默认是512字节