hadoop记录篇3-namenode水平拓展Federation+viewfs

一 。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










原文地址:https://www.cnblogs.com/liaomin416100569/p/9331181.html