hadoop ViewFS

本文固定链接为:https://www.askmac.cn/archives/hadoop-federation.html

本文是官方文档的翻译,原文链接:http://hadoop.apache.org/docs/r2.7.1/hadoop-project-dist/hadoop-hdfs/ViewFs.html

1简介

 

文件系统视图(viewFS)提供了一个管理多个hadoop文件系统命名空间(或者命名空间卷组)的途径。特别是在集群中HDFS Federation有多个namenodes,因此有多个命名空间时很有用。ViewFS类似于在一些 Unix/Linux系统中的客户端挂载表。ViewFs可以用来创建个性化的命名空间视图和为每个机器自定义视图。

本指南是在Hadoop系统有多个集群背景下提出的,每个集群可能联合多个namespace。也描述了如何在联合HDFS中使用ViewFS来为每个集群全局命名空间,使得应用程序可以以类似于之前每个-联合方式来运行。

 

 

2.旧的方式(之前的 Federation):

 

2.1 独立的namenode 集群

 

在之前旧的HDFS Federation方式中,一个集群有一个单独的namenode,为集群提供单独的文件系统命名空间。假设这里有多个集群。每个集群的文件系统命名空间是完全独立和不相交的。此外,物理存储在集群中时非共享访问的(例如,Datanode不能通过集群共享)

 

每个集群的core-site.xml有一个配置属性,为集群中的namenode设置默认文件系统:

 

<property>

<name>fs.default.name</name>

<value>hdfs://namenodeOfClusterX:port</value>

</property>

 

这样的配置属性,运行使用相对名称来解析路径连接到namenode。例如,/foo/bar指的是 hdfs://namenodeOfClusterX:port/foo/bar。这个配置属性在集群每个网关上设置,并且在每个关键集群服务例如 JOBTracker和Oozie上设置。

2.2路径名的使用模式

 

因此在以上core-site.xml设置的集群X中,典型的路径是

 

1./foo/bar

  • 这个和之前一样相当于 hdfs://namenodeOfClusterX:port/foo/bar

 

  1. hdfs://namenodeOfClusterX:port/foo/bar
  • 这个是绝对路径名,更好的是使用/foo/bar,其允许应用程序和它的数据能够在需要的时候,可以透明的迁移到其他集群。

 

  1. hdfs://namenodeOfClusterY:port/foo/bar
  • 这个是一个URI为了链接到另外一个集群Y的路径名。特别的,这个命令可以用来从集群Y复制文件到集群Z,例如:
distcp hdfs://namenodeClusterY:port/pathSrc hdfs://namenodeClusterZ:port/pathDest

 

  1. webhdfs://namenodeClusterX:http_port/foo/bar and hftp://namenodeClusterX:http_port/foo/bar

 

  • 这些是文件系统URIs分别通过webhdfs文件系统和HFTP文件系统来访问文件。注意到webhdfs和HFTP使用HTTP端口,并不是RPC端口

 

  1. http://namenodeClusterX:http_port/webhdfs/v1/foo/bar and http://proxyClusterX:http_port/foo/bar
  • 这些是HTTP URLs分别通过WebHDFS REST API和HDFS代理访问文件。

 

2.3 路径名称使用的最佳实践

 

当在一个集群时,建议使用上面类型1来代替全路径类型2的URI。完全的URI和地址类似不允许应用程序的数据移动。

 

3.新版本-Federation 和ViewFs

 

3.1如何查看集群

 

假设这里有多个集群。每个集群有一个或者多个namenode。每个namenode有自己的命名空间。一个namenode只属于一个集群。在同一个集群中的namenodes共享集群中的物理存储。集群中的命令空间和之前一样是独立的。

决定集群中每个namenode如何存储的是那些基于存储需求的操作。例如,可能需要将所有的用户数据(/user/<username>)放在一个namenode,所有的feed-data(/data)在另外的namenode,所有的项目(projects)也在另一个namenode,等等。

 

3.2 使用ViewFS 的每个集群的全局命名空间

 

为了给老版本提供透明的支持,ViewFS文件系统(即,客户端挂载表)为每个机器创建独立的集群命名空间视图,类似于旧版本中的命名空间。这个客户端挂载表和Unix挂载表类似,使用旧的命名方式挂载新的命名空间卷组。下面的图示展现了一个挂载表挂载了4个命名空间卷组 /user,/data/projects 和/tmp:

 

ViewFS实现了Hadoop文件系统接口,就像HDFS和本地文件系统。这是一个简单的文件系统,在这个意义上,它只允许连接到其他文件系统。因为ViewFS实现了Hadoop文件系统接口,它是一个透明的hadoop工具。例如,所有的shell命令可以在ViewFS,HDFS和本地文件系统使用。

 

一个挂载表的挂载点是在标准的Hadoop配置文件中指定。在每个集群的配置中,这个默认的文件系统为集群设置了挂载表,如下显示(比较其余单namenode集群配置的差异):

 

<property>

<name>fs.default.name</name>

<value>viewfs://clusterX</value>

</property>

 

URI中viewfs://之后的方案就是挂载表名称。建议一个集群的挂载表名以集群名来命名。Hadoop 系统将使用hadoop 配置文件中的名称”clusterX”来查找一个挂载表。操作安排所有的网关和服务机器为所有机器包含挂载表,对于每个集群,默认的文件系统设置成viewFS挂载表如上所示。

 

3.3路径名使用模式

 

因此在以上core-site.xml设置默认使用挂载表的集群X中,典型的路径名称是:

 

1./foo/bar

  • 这个与viewfs://clusterX/foo/bar相同。如果这样的路径名使用在旧版本的non-federated中,那么像federation版本过渡是透明的。
  1. viewfs://clusterX/foo/bar
  • 这个是绝对路径名,更好的是使用/foo/bar,其允许应用程序和它的数据能够在需要的时候,可以透明的迁移到其他集群。

 

  1. viewfs://clusterY/foo/bar
  • 这个是一个URI为了链接到另外一个集群Y的路径名。特别的,这个命令可以用来从集群Y复制文件到集群Z,例如:
distcp viewfs://clusterY:/pathSrc viewfs://clusterZ/pathDest

 

  1. viewfs://clusterX-webhdfs/foo/bar and viewfs://clusterX-hftp/foo/bar
  • 这些是文件系统URIs分别通过webhdfs文件系统和HFTP文件系统来访问文件。

 

  1. http://namenodeClusterX:http_port/webhdfs/v1/foo/bar and http://proxyClusterX:http_port/foo/bar
  • 这些是HTTP URLs分别通过WebHDFS REST API和HDFS代理访问文件。注意这些和之前一样。

 

 

3.4 路径名称使用的最佳实践

 

当在一个集群时,建议使用上面类型1来代替全路径类型2的URI。进一步说,应用不应该使用知识的挂载点和使用路径如:hdfs://namenodeContainingUserDirs:port/joe/foo/bar 关联到特定namenode的一个文件。应该使用/user/joe/foo/bar代替。

 

3.5 通过命名空间重命名 路径名称

 

回想起在旧的版本中,通过集群和namenodes来重命名一个文件或目录。在新版本上同样如此,但是有一个附加的改动。例如,在旧版本中可以执行如下命令:

 

rename /user/joe/myStuff /data/foo/bar

 

这个命令在新版本中不会工作,如果/user和/data在一个集群中实际上存储在不同的namenodes的话。

 

 

 

3.6 FAQ

 

1.当我从non-federated版本到federated版本,我将保持namenodes跟踪不用的卷,我该如何做。

 

不用任何操作。参考上面的例子-你可以使用一个关联名字和利用默认的文件系统,或者改变你的路径从hdfs://namenodeCLusterX/foo/bar 到 viewfs://clusterX/foo/bar

 

 

2.在集群中将一个namenode上的一些文件移动到另一个namenode上,会发生什么?

 

为了存储容量问题,可能会进行从一个namenode移动文件到另一个的操作。可以这样做,避免应用程序中断。下面是一些例子。

  • 例子1:/user和/data在一个namenode上,之后它们需要分开到不同的namenodes上来解决容量问题。确实,需要操作为/user和/data分别创建挂载点。在改变之前,/user/和/data应该指向同一个namenode,叫做namenodeContainingUserAndData。操作将更新挂载表,这样挂载点会分别变更到namenodeContaingUser 和 namenodeContainingData。
  • 例子2:所有项目均安装在一个namenode上,但是后来它们需要2个或者2个以上的namenodes。ViewFS允许挂载例如/project/foo 和project/bar。这允许挂载表可以被更新指向相应的namenode。

 

 

3.挂载表是在每个core-site.xml中还是单独分开一个自己的文件。

 

计划是在单独的文件中保持挂载表和有core-site.xml xincluding在其中.可以在每个机器的局部保持这些文件,通过中央位置使用HTTP可以更好的访问它。

 

4应该为一个还是所有的集群配置挂载表的定义?

 

这个配置应该为所有的集群定义挂载,由于需要可以使用例如distcp来访问其他集群中的数据。

 

5.挂载表实际读取是否会随着时间变化改变一个挂载表。

 

挂载表在任务提交给集群的时候读取。core-site.xml的Xinclude在任务提交的时候会拓展。这意味着,如果挂载表发生变化,那么工作需要重新提交。由于这个原因,我们想实现合并-挂载,可以大大减少挂载表的改变。此外,在未来呢,我们希望通过另一种机制来读取挂载表,在任务开始初始化时。

 

 

6.JobTracker(或者yarn的资源管理器)本身是使用ViewFS?

 

不,不需要。nodemanager也是一样

 

7.ViewFS是否只允许挂载根目录么?

 

不;其更一般。例如,你可以挂载/user/joe和/user/jane。在这种情况下,会为/user在挂载表中创建一个只读的目录。除了/user是只读之外,所有操作在/user上是通过的。

 

8.一个应用程序跨集群工作并且需要持续存储文件路径。它的路径应该存储在哪?

 

你应该存储viewfs://cluster/path类型路径名称,在运行应用程序时使用相同的。这使得在集群中namenodes间移动数据隔离,直到进行以透明的方式移动。其不会让你与数据隔离,当数据从一个集群移动到另一个机器时;在旧版本(pre-federation)在任何时候不会保护你跨集群移动数据。

 

9.什么是代表tokens?

 

代表tokens是为了集群你提交的任务(包含集群挂载表中所有挂载的卷组),和map-reduce输入输出任务(包含那些指定输出输入路径的挂载表的所有挂载卷组),都是自动处理的。除此之外,有一种额外增加代表tokens的方法,为特定情况下的基本群集配置。

 

 

 

4.附录:一个挂载表配置例子

 

一般地,用户不需要定义挂载表或者core-site.xml来使用挂载表。在现在,可以通过操作和在正确网关集群上对core-site.xml完成配置来完成。

 

挂载表可以在core-site.xml中指定,更好的方式是在core-site.xml使用间接寻址关联到一个独立的配置文件,称为mountTable.xml。在core-site.xml加入下列配置元素来关联到mountTable.xml:

<configuration xmlns:xi="http://www.w3.org/2001/XInclude">

<xi:include href="mountTable.xml" />

</configuration>

 

 

在mountTable.xml,这里定义挂载表”ClusterX”,假设这个集群是federation,3个命名空间卷组由3个namenodes管理。

1.nn1-clusterx.example.com:8020,

2.nn2-clusterx.example.com:8020,

3.nn3-clusterx.example.com:8020.

 

 

这里/home和/tmp在命名空间中被namenode nn1-clusterx.example.com:8020管理,项目/foo和/bar被托管在federared集群中其他的namenodes上。home目录根路径是/home,因此,每个用户可以使用定义在FileSystem/FileContext中的gethomedirectory()方法访问其主目录

<configuration>

<property>

<name>fs.viewfs.mounttable.ClusterX.homedir</name>

<value>/home</value>

</property>

<property>

<name>fs.viewfs.mounttable.ClusterX.link./home</name>

<value>hdfs://nn1-clusterx.example.com:8020/home</value>

</property>

<property>

<name>fs.viewfs.mounttable.ClusterX.link./tmp</name>

<value>hdfs://nn1-clusterx.example.com:8020/tmp</value>

</property>

<property>

<name>fs.viewfs.mounttable.ClusterX.link./projects/foo</name>

<value>hdfs://nn2-clusterx.example.com:8020/projects/foo</value>

</property>

<property>

<name>fs.viewfs.mounttable.ClusterX.link./projects/bar</name>

<value>hdfs://nn3-clusterx.example.com:8020/projects/bar</value>

</property>

</configuration>

 

 

 

代码链接:

http://hadoop.apache.org/docs/r2.7.1/api/org/apache/hadoop/fs/FileSystem.html


Posted

in

by

Tags:

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *