查看文件系统过载方案指南

简介

查看文件系统过载方案引入,旨在解决查看文件系统 (ViewFS) 的两个主要挑战。第一个问题是,要使用 ViewFS,用户需要使用 viewfs 方案 (viewfs://) 更新 fs.defaultFS。第二个问题是,用户需要将装载表配置复制到所有客户端节点。ViewFileSystemOverloadScheme 正在解决这些挑战。

查看文件系统过载方案

详细信息

视图文件系统过载方案是视图文件系统的扩展。这将允许用户继续使用他们现有的 fs.defaultFS 配置的方案或任何新方案名称,而不是使用方案 viewfs。挂载链接配置键、值格式与 ViewFS 指南 中相同。如果用户想继续使用相同的 fs.defaultFS 并希望有更多挂载点,则挂载链接配置应该将 ViewFileSystemOverloadScheme 初始化的 uri 的主机名作为挂载表名称。例如,如果 fs.defaultFS 是 hdfs://mycluster,则挂载链接配置键名称应采用以下格式 fs.viewfs.mounttable.*mycluster*.link.<mountLinkPath>。即使初始化的 fs uri 有主机名:端口,它也会简单地忽略端口号,只将主机名视为挂载表名称。我们将在以下部分讨论更多示例配置。如果没有使用初始化 uri 的主机名作为挂载表名称配置挂载链接,则它会自动将当前 uri 视为后备(fs.viewfs.mounttable.*mycluster*.linkFallback)目标 fs uri。如果初始化的 uri 包含路径部分,它将仅考虑方案和授权部分,而不考虑路径部分。例如,如果初始化的 uri 包含 hdfs://mycluster/data,它将仅将 hdfs://mycluster 视为后备目标 fs uri。路径部分 data 将被忽略。

ViewFileSystemOverloadScheme 的另一个重要改进是,管理员不必将 mount-table.xml 配置文件复制到 1000 个客户端节点。相反,他们可以将挂载表配置文件保存在兼容 Hadoop 的文件系统中。因此,将配置文件保存在中心位置使管理员的生活更轻松,因为他们可以在一个地方更新挂载表。

启用视图文件系统过载方案

要使用此类,需要在 core-site.xml 文件中添加以下配置。

<property>
  <name>fs.<scheme>.impl</name>
  <value>org.apache.hadoop.fs.viewfs.ViewFileSystemOverloadScheme</value>
</property>

此处 <scheme> 应与 fs.defautFS 中配置的 uri 方案相同。例如,如果 fs.defaultFS 使用 hdfs://mycluster 配置,则上述配置如下

<property>
  <name>fs.hdfs.impl</name>
  <value>org.apache.hadoop.fs.viewfs.ViewFileSystemOverloadScheme</value>
</property>

示例配置

示例 1

如果用户希望将他们现有集群(hdfs://cluster)中的一些数据挂载到 hdfs(hdfs://cluster)和其他对象存储集群(o3fs://bucket1.volume1.omhost/s3a://bucket1/),以下示例配置可以展示如何添加挂载链接。

<property>
  <name>fs.viewfs.mounttable.cluster.link./user</name>
  <value>hdfs://cluster/user</value>
</property>

<property>
  <name>fs.viewfs.mounttable.cluster.link./data</name>
  <value>o3fs://bucket1.volume1/data</value>
</property>

<property>
  <name>fs.viewfs.mounttable.cluster.link./backup</name>
  <value>s3a://bucket1/backup/</value>
</property>

让我们考虑以下操作,以了解这些操作将根据挂载链接委派到何处。

Op1:使用路径 hdfs://cluster/user/fileA 创建一个文件,然后物理上这个文件将创建在 hdfs://cluster/user/fileA。此委派基于上述配置中的第一个配置参数。此处 /user 映射到 hdfs://cluster/user/

Op2: 创建一个文件,路径为 hdfs://cluster/data/datafile,然后该文件将创建在 o3fs://bucket1.volume1.omhost/data/datafile。此委派基于上述配置中的第二个配置参数。此处 /data 映射到 o3fs://bucket1.volume1.omhost/data/

Op3: 创建一个文件,路径为 hdfs://cluster/backup/data.zip,然后该文件将在物理上创建于 s3a://bucket1/backup/data.zip。此委派基于上述配置中的第三个配置参数。此处 /backup 映射到 s3a://bucket1/backup/

示例 2

如果用户希望将部分现有集群 (s3a://bucketA/) 数据与其他 hdfs 集群 (hdfs://cluster) 和对象存储集群 (o3fs://bucket1.volume1.omhost/s3a://bucketA/) 挂载,以下示例配置可以展示如何添加挂载链接。

<property>
  <name>fs.viewfs.mounttable.bucketA.link./user</name>
  <value>hdfs://cluster/user</value>
</property>

<property>
  <name>fs.viewfs.mounttable.bucketA.link./data</name>
  <value>o3fs://bucket1.volume1.omhost/data</value>
</property>

<property>
  <name>fs.viewfs.mounttable.bucketA.link./salesDB</name>
  <value>s3a://bucketA/salesDB/</value>
</property>

让我们考虑以下操作,以了解这些操作将基于挂载链接委派到何处。

Op1: 创建一个文件,路径为 s3a://bucketA/user/fileA,然后该文件将在物理上创建于 hdfs://cluster/user/fileA。此委派基于上述配置中的第一个配置参数。此处 /user 映射到 hdfs://cluster/user

Op2: 创建一个文件,路径为 s3a://bucketA/data/datafile,然后该文件将创建于 o3fs://bucket1.volume1.omhost/data/datafile。此委派基于上述配置中的第二个配置参数。此处 /data 映射到 o3fs://bucket1.volume1.omhost/data/

Op3: 创建一个文件,路径为 s3a://bucketA/salesDB/dbfile,然后该文件将在物理上创建于 s3a://bucketA/salesDB/dbfile。此委派基于上述配置中的第三个配置参数。此处 /salesDB 映射到 s3a://bucket1/salesDB

注意:在上述示例中,我们仅使用创建操作,但此处相同的机制适用于任何其他文件系统 API。

下图展示了与 ViewFileSystem 相比,如何将不同的方案用于 ViewFileSystemOverloadScheme。

注意:在 ViewFsOverloadScheme 中,默认情况下,挂载链接不会表示为符号链接。权限位和 isDirectory 值将从目标目录/文件传播。

中央挂载表配置

要启用中央挂载表配置,我们需要在 core-site.xml 中配置 fs.viewfs.mounttable.path,其值是 Hadoop 兼容文件系统目录/文件路径,其中复制了 mount-table.<versionNumber>.xml 文件。此处 versionNumber 是一个整数,需要增加版本号并在同一目录中上传新文件。

ViewFileSystemOverloadScheme 始终加载最高版本号的 mount-table.<versionNumber>.xml。请勿使用同名文件替换该文件。始终增加版本号以获取由新初始化的客户端选取的新文件。我们不建议替换文件的原因是,某些客户端可能已打开与旧 mount-table 文件的连接,并且正在加载配置文件,而替换文件可能会导致它们失败。

<property>
  <name>fs.viewfs.mounttable.path</name>
  <value>hdfs://cluster/config/mount-table-dir</value>
</property>

如果您确定永远不会更新 mount-table 文件,还可以直接配置文件路径,如下所示。如果配置了文件路径,它将不会检查任何最高版本号加载。无论配置什么文件,它都将被加载。但是,文件名格式应相同。

<property>
  <name>fs.viewfs.mounttable.path</name>
  <value>hdfs://cluster/config/mount-table-dir/mount-table.<versionNumber>.xml</value>
</property>

注意:如果您配置了上述有效路径,我们建议不要在 core-site.xml 中配置 mount-links。否则,两个 mount-links 将会混合,并可能导致行为混乱。

如果您复制了 mount-table.<versionNumber>.xml,您可以考虑根据群集大小设置较大的复制因子。因此,当应用程序(MR/YARN/HBASE 等)在读取 mount-table.<versionNumber>.xml 时使用 HDFS 上的本地性时,大多数客户端都可以在本地使用该文件。

具有视图文件系统过载方案的 DFSAdmin 命令

请参阅 HDFSCommands 指南

访问没有权限的路径

访问路径(例如 hdfs:///foo/barhdfs:/foo/barviewfs:/foo/bar),其中未指定路径的权限(群集名称或主机名),这种情况非常常见。当同一代码预期在具有不同名称或 HDFS 名称节点的多个群集上运行时,尤其如此。

当使用 ViewFileSystemOverloadScheme(如上所述)时,如果(a)正在访问的路径的方案与指定为 fs.defaultFS 的路径的方案不同,并且(b)如果路径没有指定授权,则访问路径可能会导致错误,例如 Empty Mount table in config for viewfs://default/。例如,当使用以下配置但访问类似 viewfs:/foo/barviewfs:///foo/bar 的路径时,就会出现此类错误。

<property>
  <name>fs.hdfs.impl</name>
  <value>org.apache.hadoop.fs.viewfs.ViewFileSystemOverloadScheme</value>
</property>

<property>
  <name>fs.defaultFS</name>
  <value>hdfs://cluster/</value>
</property>

解决方案

为避免上述问题,配置 fs.viewfs.mounttable.default.name.key 必须设置为集群的名称,即,应将以下内容添加到 core-site.xml

<property>
  <name>fs.viewfs.mounttable.default.name.key</name>
  <value>cluster</value>
</property>

此配置 cluster 中的字符串应与 fs.defaultFS 值中授权的名称匹配。此外,配置应具有正确配置的装入表,如上述示例中所示,即,配置 fs.viewfs.mounttable.*cluster*.link.<mountLinkPath> 应设置(请注意,在这些配置中使用了相同的字符串 cluster)。

附录:使用 XInclude 的装入表配置

如果用户在受信任的网络中拥有 HTTP 服务器并且不需要对其进行身份验证机制,您还可以在该服务器中放置您的 mount-table.xml 文件,并使用 mount-table.xml 文件配置 XInclude xml 标记。

<configuration xmlns:xi="http://www.w3.org/2001/XInclude">
  <xi:include href="http://myserver/mountTable/mountTable.xml" />
</configuration>

Apache Hadoop 配置能够从 XInclude 读取 http url 并加载到配置中。如果您选择此选项,请不要在 core-site.xmlfs.viewfs.mounttable.path 中配置装入表配置项。请注意,Hadoop 配置 XInclude 在打开 url 时不使用 SPNego 身份验证。因此,如果您放置 mount-table.xml 的 http 服务器需要身份验证,则此方法将不起作用。