暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

ViewFs 用户指南

程序猿码码 2018-05-01
982

Apache Hadoop 2.9.0

原文:

http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/ViewFs.html

(如果转发,请标明出处)

简介:

View File System (ViewFs)提供了一种管理多个Hadoop文件系统命名空间(或者命名空间卷)的方法。它对于在HDFS联邦中具有多个namenodes并因此具有多个名称空间的集群特别有用。HDFS联邦中,ViewFs 类似于某些Unix Linux系统中的客户端载表。ViewFs 可用于创建个性化命名空间视图以及每个集群的通用视图。

本指南是在具有多个集群Hadoop系统的环境中提供的,每个集群可以联合成多个名称空间。它还描述了在HDFS联邦中如何使用ViewFs 来提供每个集群的全局命名空间,以便应用程序可以以类似于联合前的方式运行。

旧世界(联邦之前)

单一Namenode的集群

HDFS联邦之前,每个集群只有一个NameNode来为集群提供一个文件系统的命名空间。当有多个集群时,每个集群的文件系统命名空间必须是完全相对独立并且没有交集。此外,物理存储也不在集群中间共享(例如Datanodes 不在集群中间共享)。

每个集群的core-site.xml中都有一个配置变量来设置默认的文件系统为该集群的namenode节点:

<property>

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

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

</property>

这样的配置属性允许使用斜杠相对路径的方式来解析集群namenode的路径。例如,上面的配置下,目录/foo/bar等同于hdfs://namenodeOfClusterX:port/foo/bar 

此配置属性设置在集群的每个网关上,也设置在集群的关键服务上(例如JobTrackerOozie)。

路径名使用模式

因此,在如上所述设置 core-site.xml的集群X上,典型的路径名为

(1) /foo/bar

和上面描述的一样,等同于 hdfs://namenodeOfClusterX:port/foo/bar

(2) hdfs://namenodeOfClusterX:port/foo/bar

虽然这是一个有效的路径名,但是最好使用/foo/bar因为它允许应用程序及其数据在需要时透明地移动到另一个集群。

(3) hdfs://namenodeOfClusterY:port/foo/bar

这是一个引用其他集群(例如Cluster Y)目录的URI。一个特殊的例子,将文件从集群Y移动到集群Z的命令:

distcp hdfs://namenodeClusterY:port/pathSrc hdfs://namenodeClusterZ:port/pathDest

(4) webhdfs://namenodeClusterX:http_port/foo/bar  hftp://namenodeClusterX:http_port/foo/bar

它们分别是用于通过WebHDFS文件系统和HFTP文件系统访问文件的URIs。请注意,WebHDFSHFTP使用的是namenode HTTP端口,而不是RPC端口。

(5) http://namenodeClusterX:http_port/webhdfs/v1/foo/bar  http://proxyClusterX:http_port/foo/bar

这两个网址分别是用于通过 WebHDFS REST API HDFS proxy来访问文件。

路径名使用最佳做法

当在一个集群中时,建议使用上面(1)的路径名,而不是使用(2)中的完全路径的URI。完全的URI路径类似于地址,不允许应用程序随着数据移动。

新世界 - 联邦和ViewFs

集群看起来是什么样子

假设有多个集群,每个集群有一个或者多个namenodes,每个namenode都有自己的命名空间,并且每个namenode都只属于一个集群,在同一个集群中的namenodes之间共享集群的物理存储,跨集群的命名空间和以前一样相互独立。

操作员根据存储需要来决定集群内每个namenode上存储的内容。例如,可以将用户数据(/user/<username>)放到一个namenode,将所有馈送数据(feed-data( data )放到另一个namenode,所有项目( projects )放到另一个namenode

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

为了提供非联邦集群的透明度,ViewFs文件系统(即客户端载表)用于为每个集群创建独立的集群命名空间视图,这与旧世界中的命名空间类似。客户端载表(类似Unix载表)使用旧的命名约定载新的命名空间卷。下图显示了载四个命名空间卷 /user/data/projects, /tmp载表:

 


 

ViewFs就像HDFS和本地文件系统一样实现了Hadoop文件系统接口。从只允许链接到其他文件系统的意义上讲,它是一个普通的文件系统。因为ViewFs实现了Hadoop文件系统接口,所以它可以透明的使用。例如,所有shell命令可以使用HDFS和本地文件系统一样的来使用ViewFs 


挂载表的挂载点在标准Hadoop配置文件中指定。在每个集群的配置中,默认文件系统设置为该集群的挂载表,如下所示(请与单个namenode集群中的配置进行比较)

<property>

  <name>fs.defaultFS</name>

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

</property>

URIviewfs:// 后面的字符串是挂载表名称,建议使用集群名称命名集群载表Hadoop系统将在Hadoop配置文件中查找名为“clusterX”载表操作将所有网关和服务机器安排为包含所有集群载表,这样,对于每个集群,默认文件系统都设置为该集群ViewFs载表。

目录名使用模式

core-site.xml被设置为默认挂载表的集群Cluster X中,典型的目录名如下:

(1) /foo/bar

等同于 viewfs://clusterX/foo/bar。如果在旧的非联邦系统中使用这样的路径名,则可以透明的过渡到联邦系统。

(2) viewfs://clusterX/foo/bar

虽然是个合法的目录名,但是最好是使用 /foo/bar,因为 /foo/bar在需要时可以允许应用程序和它的数据透明的移动到另一个集群。

(3) viewfs://clusterY/foo/bar

这是一个引用其他集群(例如Cluster Y)的URI。一个典型的例子,使用命令从cluster Y 拷贝文件到Cluster Z

   distcp viewfs://clusterY/pathSrc viewfs://clusterZ/pathDest

(4) viewfs://clusterX-webhdfs/foo/bar  viewfs://clusterX-hftp/foo/bar

2个是通过WebHDFS 文件系统和HFTP 文件系统来访问文件的URIs

(5) http://namenodeClusterX:http_port/webhdfs/v1/foo/bar http://proxyClusterX:http_port/foo/bar

2个是通过 WebHDFS REST APIHDFS proxy来访问文件的HTTP URLs。需要注意的是,这2个和联邦之前一样。

路径名使用最佳做法

在一个集群内,建议使用上面(1)中的目录名,而不是使用完全的上面(2)中的URI。此外,应用程序不应使用挂载点的目录,也不应使用hdfs://namenodeContainingUserDirs:port/joe/foo/bar这样的目录来引用特定namenode中的文件,而应使用/user/joe/foo/bar来代替。

跨命名空间重命名目录

在非联邦的集群中,不能跨namenodes 或者集群来重命名文件或目录。在联邦系统中也是如此,但是有个例外,例如,非联邦集群中,可以执行下面的命令:

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

在联邦系统中,如果/user /data 存储在集群中的不同namenode上,那么这条命令就不能执行成功。

FAQ

① 当我从非联邦集群移动到联邦集群时,我必须跟踪不同卷的Namenode,我可以这样做吗?

不,你不会的。请查看上面的例子 -- 你或者是使用相对名字并利用默认的文件系统,或者将路径从hdfs://namenodeCLusterX/foo/bar更改为 viewfs://clusterX/foo/bar

② 在一个集群中,如果操作是将一些文件从一个namenode移动到其他namenode时,会发生什么事情?

操作可以将文件从一个名称节点移动到另一个名称节点,以便处理存储容量问题。这样做是为了避免应用程序中断。让我们举几个例子

例子1/user  /data在同一个namenode,后续为了存储容量问题,需要将他们移动到不同的namenode上。实际上,操作为/user  /data创建单独的挂载点。在更改之前,/user  /data的挂载会指向相同的namenode,例如namenodeContainingUserAndData。操作更改装载表,以便将装载点分别变更为namenodeContaingUser namenodeContainingData

例子2:所有的项目都在一个namenode,后续会需要2个或多个namenodeViewFs 允许像 /project/foo /project/bar一样的挂在,这就允许更新挂载表来指向对应的namenode

③ 挂载表是在每个core-site.xml 中还是它自己的一个单独文件?

计划是将挂载表保存到单独的文件,并core-site.xml 中来引用(xincluding装载表。虽然可以保存这些文件到每台机器本地,但最好是使用HTTP从一个中心位置来访问这些文件。

④ 配置需要为一个集群或者多个集群保存挂载表定义吗?

配置应具有所有集群挂载定义,因为需要访问其他群集(distcp )中的数据

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

当作业提交给集群的时候,挂载表就会被读取。在作业提交时间,core-site.xml中的XInclude 就会被扩展。这就意味着当挂载表已经改变时,作业需要被重新提交。因为这个原因,我们需要实现 merge-mount,这样就能大大的减少更改挂载表的需要。此外,我们希望将来通过在作业开始时初始化的另一种机制读取挂载表。

⑥ JobTracker (或者 Yarn’s Resource Manager)本身是否使用ViewFs

不,他们不需要。NodeManager也不需要。

⑦ ViewFs 是否只允许挂载到最顶层目录?

不,它很普遍的使用。例如,可以挂载到/user/joe /user/jane。在这种情况下,将在挂载表中为/user创建一个内部的只读目录,所有的 /user的操作都是合法的,但/user为只读操作除外。

⑧ 一个应用在跨集群的环境中工作并且需要持久化存储文件路径,那么这个应用需要存储哪些路径?

您应该存储 viewfs://cluster/path类型路径名称,与运行应用程序时使用的名称相同。只要操作以透明的方式执行移动,就可以避免数据在群集内namenodes的移动。如果数据从一个集群移动到另一个集群,则不会隔离用户;旧的(联盟前)世界并未保护用户免受跨群集的此类数据移动的影响。

⑨ delegation tokens

提交作业delegation tokens(包括该集群挂载表的所有挂载)以及map-reduce 任务输入和输出路径的delegation tokens(包括通过指定输入和输出路径的挂载表挂载的所有卷)都将自动处理。此外,还有一种方法可以在特殊情况下向基本集群配置添加其他delegation tokens

Appendix:一个挂载表配置举例

通常,用户不必定义挂载表或 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”挂载表,定位为由3namenode管理的3个命名空间卷的HDFS联盟。

nn1-clusterx.example.com:8020,

nn2-clusterx.example.com:8020, and

nn3-clusterx.example.com:8020.

这里/home  /tmpNamenode nn1-clusterx.example.com:8020管理的命名空间中,projects  /foo /bar是联邦集群中其他namenodes管理的。集群的home目录设置为 /home,这样每个用户就可以通过使用 FileSystem/FileContext中定义的getHomeDirectory()来访问home目录:

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

 

--------------------全文完 -----------------------------------

备注:

旧世界:联邦之前

挂载表:mount table 

 

 

 

 

 


文章转载自程序猿码码,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论