一 。Federation简介和原理
之前的ha和集群都是单namenode对外提供服务 明显当用户量大时 会出现服务宕机问题 就算standby服务器激活也会导致崩溃
为了水平的拓展namnode服务 federation提供了多个namnode 这些namenode 被聚合在一个大的集群中 每个namenode之间不需要任何交流
数据节点用于公共的存储 每个namenode都会在datanode有自己的block pools 所以多个namenode在同一台机器间 互不影响数据,其中一台
namenode 并不影响该datanode向其他datanode汇报数据
federation提供无限制的水平拓展
该集群中存在多个namenode 多个datanode 组成的大型集群 必须拥有一个集群的编号 clusterid 如果某个namenode格式化时 不是使用相同的
clusterid 说明处于不同的集群 每个namnode拥有自己的namenodeserviceid 自己测试时发现namenodeserviceid必须配成主机名否则 抛出
-ls: java.net.UnknownHostException: ns2异常 官网并没有说是主机名 说只是个表示 不明所以 只能配成主机名
二。Federation配置
配置环境
/etc/hosts
192.168.58.147 node1
192.168.58.149 node2
192.168.58.150 node3
192.168.58.151 node4
集群(clusterid:hadoop)
namenode
node1 nameserviceid:node1
node2 nameserviceid:node2
secondarynode
node1
node2
DataNodes
node2
node3
node4
因为使用之前ha环境(具体参考http://blog.csdn.net/liaomin416100569/article/details/78301242) 做一些数据清空
(node2-node4)
cd /blockdata && rm -rf *
node1和node2执行
mkdir -p /namedata
如果存在该目录
cd /namedata && rm -rf *
配置文件修改
core-site.xml
这里因为当我访问node1时自然访问node1的namenode服务 访问node2时访问node2的namenode服务 所以该文件必须配置不一样
node1
<configuration>
<property>
<name>fs.defaultFS</name><!--当用户 在node1上 输入命令 hdfs dfs -ls / 时 读取该默认fs 也就读取node1的文件系统-->
<value>hdfs://node1</value>
</property>
</configuration>
node2
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://node2</value> <!--不加端口是因为默认配置的端口是 8020-->
</property>
</configuration>
hdfs-site.xml(node1和node2一致)
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>/namedata</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/blockdata</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.nameservices</name>
<value>node1,node2</value> <!--注意namenodeserviceid必须使用主机名 否则不能远程上传-->
</property>
<property>
<name>dfs.namenode.rpc-address.node1</name>
<value>node1:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.node1</name>
<value>node1:50070</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address.node1</name>
<value>node1:50090</value>
</property>
<property>
<name>dfs.namenode.rpc-address.node2</name>
<value>node2:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.node2</name>
<value>node2:50070</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address.node2</name>
<value>node2:50090</value>
</property>
</configuration>
发送配置文件(注意不要将node1的core-site.xml发送到note2)
scp -r /soft/hadoop-2.7.4/etc/hadoop/* root@node2:/soft/hadoop-2.7.4/etc/hadoop
scp -r /soft/hadoop-2.7.4/etc/hadoop/* root@node3:/soft/hadoop-2.7.4/etc/hadoop
scp -r /soft/hadoop-2.7.4/etc/hadoop/* root@node4:/soft/hadoop-2.7.4/etc/hadoop
格式化namenode
必须使用同一个集群编号格式化 如果不是 datanode将被随机分配给不同的namenode 就不能共享datanode
node1执行
hdfs namenode -format -clusterId mycluster
node2执行
hdfs namenode -format -clusterId mycluster
node1上免登录到其他主机配置参考前面文章
启动
start-dfs.sh
node1上上传文件a.txt测试
mkdir /aaa && cd /aaa && echo aa>a.txt && hdfs dfs -put a.txt /
node2上上传文件b.txt测试
mkdir /aaa && cd /aaa && echo aa>b.txt && hdfs dfs -put b.txt /
查看不同namenode不同文件
hdfs dfs -ls hdfs://node1/
hdfs dfs -ls hdfs://node2/
使用 web界面查看两个节点都是激活状态
http://192.168.58.147:50070/
http://192.168.58.149:50070/
三。Federation namnenode高可用
水平拓展每个namenode也有单点问题 所以结合namenode+ha实现水平拓展+高可用 这里不在配置 相当简单
四。使用viewfs挂载点
将hdfs文件系统federation的多个namenode挂载到类似于linux系统下 比如 正常访问federation下多个namenode必须分开访问比如
hdfs dfs -ls hdfs://node1
hdfs dfs -ls hdfs://node2
使用viewfs 可以将不同的hdfs挂载到某个目录下 比如
/name1 hdfs://node1/
/name2 hdfs://node2/
当我们访问 hdfs dfs -ls /name自动进入node1
配置如下
core-site.xml
<configuration>
<!--配置默认使用viewfs访问 格式是 viewfs://集群名称-->
<property>
<name>fs.defaultFS</name>
<value>viewfs://hadoop</value>
</property>
</configuration>
hdfs-site.xml
<property> <!--fs.viewfs.mounttable.集群名称.link.映射路径-->
<name>fs.viewfs.mounttable.hadoop.link./name1</name>
<value>hdfs://node1/</value>
</property>
<property>
<name>fs.viewfs.mounttable.hadoop.link./name2</name>
<value>hdfs://node2/</value>
</property>
测试
[root@node1 /]# hdfs dfs -ls /
Found 2 items
-r-xr-xr-x - root root 0 2017-10-23 18:38 /name1
-r-xr-xr-x - root root 0 2017-10-23 18:38 /name2
[root@node1 /]# hdfs dfs -ls /name1
Found 1 items
-rw-r--r-- 3 root supergroup 11 2017-10-21 00:09 /name1/a.txt
[root@node1 /]# hdfs dfs -ls /name2
Found 1 items
-rw-r--r-- 3 root supergroup 4 2017-10-21 00:13 /name2/b.txt