hadoop3.X版本特性:联邦-viewFs

2020/11/10 [email protected]

一、Federation(联邦)

1.1背景(HDFS的两个层面)

命名空间:

  • 命名空间:由目录,文件和块组成。
  • 它支持所有与名称空间相关的文件系统操作,例如创建,删除,修改和列出文件和目录

块存储服务:

  • Block管理:

    • 提供datanode集群的注册和定期的心跳检查,处理block的报告并掌握block的位置;
    • 支持block的相关操作,如增删改查和得到block的位置管理副本位置,管理副本的复制和删除
  • 存储:本地系统的datanodes提供,允许读写。

↑before:整个集群使用单个NameNode,共用一个nameSpace

↓then:向HDFS添加多个NameNode,nameSpace

1.2联邦的概念

多nameNode&nameSpace:

  • 多个NameNode相互独立,使得HDFS的命名服务能够水平扩展,这些NN分别进行各自命名空间和块的管理,不需要彼此协调

  • 多个NameSpace管理属于自己的一组块,这些属于同一个命名空间的块组成一个块池

  • DataNode

    • 被所有NameNode使用,作为通用的数据块存储设备

    • 向联邦中每一个NameNode注册

    • 向NameNode发送心跳机制以及block报告

    • 处理NameNode的命令

    • 每个datanode为多个块池提供存储

Block池:

  • 每个块池存储同一个nameSpace里的所有文件的块集合

  • 被独立管理,互不影响

  • 块存储在不同的DataNode中的

→允许为新的block产生Block ID并不会需要其他的namespace。一个NameNode出问题也不会影响datanode为集群中的其他NameNode服务。

  • NameSpace与块池绑定一起称为NameSpaceVolume,作为一个独立的单位进行管理
  • 当nameNode/nameSpace被删除时,对应的block池也被删除

→当集群升级时,一个NameSpaceVolume是一个升级单元

集群ID:

  • ClusterID用来标识以及识别集群中的所有节点,格式化NameNode时,Cluster自动生成。
  • 该ClusterID 用于将其他NameNode格式化为集群。

1.3联邦的优点

扩展性:

  • l联邦使得集群的NameSpace水平伸缩扩展
  • 大型部署、使用大量小文件的部署可以通过向集群中添加更多的NameNode完成效率以及nameSpace的扩展

性能:

  • HDFS文件系统的吞吐量不再受单一NameNode的限制,向集群中添加更多的NameNode会提高文件读写的吞吐量

隔离:

  • 单个NameNode存在多用户环境不提供隔离机制,例如实验程序导致NameNode变慢影响生产环境

  • 通过多NameNode可以将不同类别的应用程序和用户隔离到不同的nameSpace

1.4联邦的配置

  • 添加一个新的NameNode到一个既存的HDFS集群
  • 添加配置参数dfs.nameservices到配置文件且使用NameServiceID 作为后缀更新配置文件(hdfs-site.xml)。
  • 将配置文件同步到集群当中的所有节点。
  • 格式化并启动新增的Namenode节点,注意使用clusterid(尤其在大集群新增多个namenode)。
  • 启动新的 Secondary/Backup节点。
  • 刷新datanode获取新添加的namenode。
  • 使用jps与HDFS UI检查配置是否成功。
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述

参考资料

https://blog.csdn.net/weixin_42348333/article/details/82193852#3.1%20Viewfs%E9%85%8D%E7%BD%AE

http://hadoop.apache.org/docs/r3.1.1/hadoop-project-dist/hadoop-hdfs/Federation.html

2020/11/3

二、ViewFs

2.1背景

联邦前:

一个集群拥有一个namenode,它为集群提供一个单一的文件系统namespace。假设有很多集群,那么它们的namespace是彼此独立的。更重要的是,物理存储也没有在集群之间进行共享

联邦后:

假设有多个集群,每个集群又有一个或多个namenode。每个namenode有自己的namespace。一个namenode只会属于一个集群,同一个集群中的namenode共享该集群的物理存储(datanodes)。同时不同集群的namespace依旧保持其独立性

联邦-ViewFs:

使用ViewFs得到集群的全局namespace,为每个集群建立独立的集群nameSpace图

蓝色的点表示客户去访问的namespace,而下面四个为实际去访问的namespace。

在这里插入图片描述

2.2ViewFs配置

  • 关闭集群,配置core-site.xml,新建mountTable.xml

    修改core-site.xml 其中my-cluster可以自己命名ViewFs名称(安装表)

    fs.default.name viewfs://my-cluster
    • 装载表的装载点在标准Hadoop配置文件中指定。viewfs的所有安装表配置条目均以fs.viewfs.mounttable为前缀

    • 使用链接标记指定链接其他文件系统的安装点。建议使挂载点名称与链接的文件系统目标位置中的挂载点名称相同。

    • 对于未在安装表中配置的所有名称空间,我们可以通过linkFallback将它们回退到默认文件系统

    新文件中的link./output为在ViewFs视图中的名称
    hdfs://node101:8020/input为视图名称实际对应的文件夹名称

    fs.viewfs.mounttable.my-cluster.link./output hdfs://node101:8020/output fs.viewfs.mounttable.my-cluster.link./input hdfs://node103:8020/input fs.viewfs.mounttable.my-cluster.linkFallback hdfs://node103:8020/home
  • 配置文件同步

  • 启动集群,在不同节点上测试

    hadoop fs -ls viewfs://my-cluster/
    hadoop fs -ls /
    hadoop fs -put file /input

建议使用简单路径代替全路径 例如

hadoop fs -put file1 /input/ 实际执行的是hadoop fs -put file1 hdfs://node103:8020/input/

hadoop fs -put file2 /output/ 实际执行的是hadoop fs -put file2 hdfs://node101:8020/output/

2.3路径使用的最佳实践为简写路径

  • /input 等价于viewfs:my-cluster/input
  • viewfs://my-cluster/input 建议直接使用/input
  • viewfs://you-cluster/input 其他集群的input

实现从my-cluster拷贝文件到you-Cluster
distcp viewfs://my-cluster/input/apple viewfs://you-cluster/input/

  • 通过WebHDFS和HFTP协议这两种文件系统对文件进行访问

viewfs://my-cluster/input/apple
viewfs://you-cluster/inputlapple

2.4不同命名空间建的路径重命名

在NameNode集群中不能随意的重命名hdfs文件或者目录,但是在联邦模式下可以执行如下的操作

rename /input/apple /output/apple

如果/input 和 /output属于一个集群不同的NameNode,不能执行如上操作

2.5常见问题

  • 从非联邦世界迁移到联邦世界,把namenode挂载不同的卷上如何实现

不可以,但可以使用默认文件系统的相对路径的特性,把hdfs://node101:8020/foo/bar改为 viewfs://my-cluster/foo/bar.

  • 集群内如果从一个namenode迁移文件到另外一个namenode会发生什么.

  • 跨namenode之间的文件转义可能是为了解决存储问题,这样操作可以避免程序被打断

场景1:/input 和 /outherinput属于同一个namenode管理,为了解决存储问题,我们需要把他们转移出去,说实在的,操作将为/input和/outherinput创建单独的挂载点。

在更改/input和/outherinput的挂载之前,会指向相同的namenode,比如namenodeContainingInput,操作将更新挂载表,

以便将挂载点分别更改为namenodeContaingInput和namenodeContainingOutherInput

场景2:目前所有的项目都在一个namenode里,我们想要更多的namenode,视图文件系统向 /input 和 /otherinput允许挂载表更新到对应的namenode里。

  • 挂载表是否存在每个core-site.xml文件或者单独的文件里?

挂载表需要单独存在在一个文件中,core-site.xml使用xincluding指向这个文件,尽管每个机器可以在本地保留一份这个文件,但是还是建议使用http的方式从配置中心拉取S

  • 每个集群的挂载表定义一定要一致吗?

是的,因为这样的话跨集群间数据转移就可以正常进行,比如distcp

  • 如果操作可能随着时间的推移而更改挂载表,那么挂载表实际读取的时间是什么时候?

当job被提交到集群上的时候挂载表配置会被读取,core-site.xml中的XInclude在Job提交的时候也会读到,这意味着,如果挂载表被更改,

则需要重新提交作业。由于这个原因,我们希望实现合并挂载,这将大大减少更改挂载表的需要。此外,我们希望将来通过作业开始时初始化的另一种机制读取挂载表。

参考资料

https://blog.csdn.net/guofei_ok/article/details/86138451

http://hadoop.apache.org/docs/r3.1.1/hadoop-project-dist/hadoop-hdfs/ViewFs.html#How_The_Clusters_Look

实现合并挂载,这将大大减少更改挂载表的需要。此外,我们希望将来通过作业开始时初始化的另一种机制读取挂载表。

参考资料

https://blog.csdn.net/guofei_ok/article/details/86138451

http://hadoop.apache.org/docs/r3.1.1/hadoop-project-dist/hadoop-hdfs/ViewFs.html#How_The_Clusters_Look

猜你喜欢

转载自blog.csdn.net/nothair/article/details/110393067
今日推荐