HDFS-NFS-网关

Posted 杉沐先生

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDFS-NFS-网关相关的知识,希望对你有一定的参考价值。

以下内容均翻译自官方文档.

概述

NFS Gateway支持NFSv3协议,支持将HDFS作为客户端本地文件系统的一部分挂载。目前NFS网关支持并启用以下使用模式:

  • 用户在NFSv3客户端兼容的操作系统上通过本地文件系统浏览HDFS文件系统。

  • 用户可以将HDFS文件系统上的文件下载到本地文件系统。

  • 用户可以直接从本地文件系统上传文件到HDFS文件系统。

  • 用户可以通过mount点直接将数据流化到HDFS。支持文件追加,不支持随机写。

NFS网关机器需要同样的东西来运行像Hadoop JAR文件、HADOOP_CONF目录这样的HDFS客户端。NFS网关可以与DataNode、NameNode或任何HDFS客户端在同一台主机上。

配置

NFS-gateway使用代理用户代理访问NFS挂载的所有用户。在非安全模式下,运行网关的用户是代理用户,在安全模式下,Kerberos keytab中的用户是代理用户。假设代理用户为 nfsserver ,用户组为 users-group1 和 users-group2 的用户使用NFS挂载,则在NameNode的core-site.xml中。如下两个属性必须设置,配置变更后,只有NameNode需要重启(注意:将字符串“nfsserver”替换为集群中的代理用户名):

<property>
  <name>hadoop.proxyuser.nfsserver.groups</name>
  <value>root,users-group1,users-group2</value>
  <description>
         The 'nfsserver' user is allowed to proxy all members of the 'users-group1' and
         'users-group2' groups. Note that in most cases you will need to include the
         group "root" because the user "root" (which usually belonges to "root" group) will
         generally be the user that initially executes the mount on the NFS client system.
         Set this to '*' to allow nfsserver user to proxy any group.
  </description>
</property>

<property>
  <name>hadoop.proxyuser.nfsserver.hosts</name>
  <value>nfs-client-host1.com</value>
  <description>
         This is the host where the nfs gateway is running. Set this to '*' to allow
         requests from any hosts to be proxied.
  </description>
</property>

以上是NFS网关在非安全模式下唯一需要的配置。对于Kerberized hadoop集群,需要在网关hdfs-site.xml中增加如下配置(注意:将字符串“nfsserver”替换为代理用户名,同时确保keytab中包含的用户也是同一个代理用户):

  <property>
    <name>nfs.keytab.file</name>
    <value>/etc/hadoop/conf/nfsserver.keytab</value> <!-- path to the nfs gateway keytab -->
  </property>

  <property>
    <name>nfs.kerberos.principal</name>
    <value>nfsserver/_HOST@YOUR-REALM.COM</value>
  </property>

NFS网关的其余配置对于安全模式和非安全模式都是可选的。

  • AIX NFS客户端存在一些已知问题,这些已知问题妨碍它默认情况下与HDFS NFS网关一起正常工作。如果希望能够从AIX访问HDFS NFS Gateway,则应设置以下配置设置以启用这些问题的规避措施:

    <property>
       <name>nfs.aix.compatibility.mode.enabled</name>
       <value>true</value>
    </property>

    请注意,常规的非AIX客户机不应启用AIX兼容模式。AIX兼容性模式实现的变通方法有效地禁用了保护措施,以确保通过NFS列出目录内容返回一致的结果,并且可以确保发送到NFS服务器的所有数据都已提交。

  • HDFS超级用户是与NameNode进程本身具有相同身份的用户,超级用户可以做任何事情,因为超级用户的权限检查从不失败。如果配置了以下属性,NFS客户端超级用户可以访问HDFS上的任意文件。缺省情况下,网关没有配置超级用户。注意,即使配置了超级户,'nfs.exports.allowed.hosts'仍然有效。例如,如果NFS客户端主机在 'nfs.exports.allowed.hosts'中不允许有写访问权限,则超级用户将无法通过网关对HDFS文件进行写访问:

    <property>
      <name>nfs.superuser</name>
      <value>the_name_of_hdfs_superuser</value>
    </property>

强烈建议用户根据自己的用例更新一些配置属性。hdfs-site.xml中可以添加或更新以下所有配置属性:

  • 如果客户端在允许访问时间更新的情况下装载导出,请确保配置文件中未禁用以下属性。修改该属性后,仅NameNode需要重启。在某些Unix系统上,用户可以通过挂载带有“noatime”的导出来禁用访问时间更新。如果export挂载为“noatime”,则用户无需更改以下属性,因此无需重启namenode。

    <property>
      <name>dfs.namenode.accesstime.precision</name>
      <value>3600000</value>
      <description>The access time for HDFS file is precise upto this value.
        The default value is 1 hour. Setting a value of 0 disables
         access times for HDFS.
      </description>
    </property>
  • 用户需要更新文件转储目录。NFS客户端经常对写入进行重新排序,特别是当导出没有使用“sync”选项挂载时。顺序写入可以以随机顺序到达NFS网关。该目录用于临时保存乱序写入HDFS前的数据。对于每个文件,乱序写入在内存中累积到超过某个阈值(例如,1MB)后被转储。一个人需要确保目录有足够的空间。例如,如果应用程序上载10个文件,每个文件有100MB,建议该目录有大约1GB的空间,以防每个文件发生最坏情况的写入重排序。更新此属性后,只有NFS网关需要重新启动。

    <property>
      <name>nfs.dump.dir</name>
      <value>/tmp/.hdfs-nfs</value>
    </property>
  • <property>
     <name>nfs.exports.allowed.hosts</name>
     <value>* rw</value>
    </property>
  • HDFS超级用户是与NameNode进程本身具有相同身份的用户,超级用户可以做任何事情,因为超级用户的权限检查从不失败。如果配置了以下属性,NFS客户端超级用户可以访问HDFS上的任意文件。缺省情况下,网关没有配置超级用户。注意,即使配置了超级用户,“nfs.exports.allowed.hosts”仍然有效。例如,如果NFS客户端主机在“nfs.exports.allowed.hosts”中不允许有写访问权限,则超级用户将无法通过网关对HDFS文件进行写访问。

    <property>
     <name>nfs.exports.allowed.hosts</name>
     <value>* rw</value>
    </property>
  • 指标。与其他HDFS守护进程一样,网关公开运行时度量。可在http://gateway-ip:50079/jmx 上以JSON文档形式获取。NFS处理程序相关的度量以“Nfs3Metrics”名称公开。延迟直方图可以通过在hdfs-site.xml文件中添加以下属性来启用。

    <property>
     <name>nfs.metrics.percentiles.intervals</name>
     <value>100</value>
     <description>Enable the latency histograms for read, write and
     commit requests. The time unit is 100 seconds in this example.
     </description>
    </property>
  • JVM和日志设置。导出HDFS_NFS3_OPTS中的JVM设置(例如堆大小、GC日志等)。更多NFS相关的设置可以在hadoop-env.sh中找到。要获取NFS调试跟踪,可以编辑log4j.property文件添加以下内容。注意,调试跟踪,特别是ONCRPC的跟踪,可能非常冗长。

    要更改日志记录级别:

    log4j.logger.org.apache.hadoop.hdfs.nfs=DEBUG

    要获取关于ONCRPC请求的更多详细信息:

    log4j.logger.org.apache.hadoop.oncrpc=DEBUG
  • 导出点。可以指定HDFS的NFS导出点。只支持一个导出点。配置导出点时,需要填写全路径。缺省情况下,导出点为根目录'/'。

    <property>
    <name>nfs.export.point</name>
    <value>/</value>
    </property>

启动和停止NFS 网关服务

提供NFS服务需要三个守护进程:rpcbind(或portmap)、mountd和nfsd。NFS网关进程同时存在nfsd和mountd。共享HDFS根'/'作为唯一的导出。建议使用NFS网关包自带的portmap。尽管NFS网关与大多数Linux发行版提供的portmap/rpcbind一起工作,但包括portmap的软件包在某些Linux系统(如RHEL 6.2和SLES 11)上是必需的,前者是由于rpcbind的bug。更详细的讨论可以在HDFS-4763中找到。

  1. 停止平台提供的nfsv3和rpcbind/portmap服务(不同Unix平台命令可能不同)
    [root]> service nfs stop
    [root]> service rpcbind stop

  2. 启动Hadoop's portmap(需要root权限)
    [root]> $HADOOP_HOME/bin/hdfs --daemon start portmap

  3. 启动mountd和nfsd
    此命令不需要root权限。在非安全模式下,NFS网关应该由本用户指南开头提到的代理用户启动。在安全模式下,任何用户都可以启动NFS网关,只要用户对在'nfs.keytab.file'中定义的Kerberos keytab具有读访问权限。
    [hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start nfs3

  4. 停止NFS网关服务
    [hdfs]$ $HADOOP_HOME/bin/hdfs --daemon stop nfs3
    [root]> $HADOOP_HOME/bin/hdfs --daemon stop portmap

或者,如果将 NFS 网关作为根级启动,也可以放弃运行 Hadoop 提供的端口映射守护程序,而是在所有操作系统上使用系统端口映射守护程序。这将允许 HDFS NFS 网关解决上述错误,并且仍然使用系统端口映射守护程序进行注册。为此,只需像通常一样启动 NFS 网关守护程序,但请确保以"root"用户设置,并设置"HDFS_NFS3_SECURE_USER"环境变量为非特权用户。在此模式下,NFS 网关将作为 root 开始,以执行其与系统端口图的初始注册,然后将权限删除回由 HDFS_NFS3_SECURE_USER 指定的用户,并在 NFS 网关进程的生存期的其余部分。请注意,如果选择此路由,应跳过上面的步骤 1 和 2。

验证 NFS 相关服务的有效性

  1. 执行以下命令以验证所有服务是否已启动并运行:

    [root]> rpcinfo -p nfs_server_ip

    您应该会看到类似于以下内容的输出:

         program vers proto   port

       100005    1   tcp   4242  mountd

       100005    2   udp   4242  mountd

       100005    2   tcp   4242  mountd

       100000    2   tcp    111  portmapper

       100000    2   udp    111  portmapper

       100005    3   udp   4242  mountd

       100005    1   udp   4242  mountd

       100003    3   tcp   2049  nfs

       100005    3   tcp   4242  mountd
  2. 验证是否导出了 HDFS 命名空间并可以装载。

    [root]> showmount -e nfs_server_ip

    您应该会看到类似于以下内容的输出:

    Exports list on $nfs_server_ip :

    / (everyone) 

安装导出"/"

目前 NFS v3 仅使用 TCP 作为传输协议。不支持 NLM,因此需要装载选项"无锁"。强烈建议安装选项"同步",因为它可以最小化或避免重新排序的写入,从而导致更可预测的吞吐量。未指定同步选项可能会导致上传大型文件时行为不可靠。建议使用硬安装。这是因为,即使在客户端将所有数据发送到 NFS 网关后,当 NFS 客户端内核重新排序写入时,NFS 网关可能需要一些额外的时间才能将数据传输到 HDFS。

如果必须使用软装载,用户应给它一个相对较长的超时(至少不低于主机上的默认超时)。

用户可以装载 HDFS 命名空间,如下所示:

[root]> mount -t nfs -o vers=3,proto=tcp,nolock,noacl,sync server:/mount_point

然后,用户可以访问HDFS作为本地文件系统的一部分,除了,硬链接和随机写入尚不支持。为了优化大型文件 I/O 的性能,可以在装载过程中增加 NFS 传输大小(大小和 wsize)。默认情况下,NFS 网关支持 1MB 作为最大传输大小。对于更大的数据传输大小,需要更新 hdfs 站点中的"nfs.rtmax"和"nfs.wtmax".xml。

允许从非特权客户端装载

在客户端计算机上的根访问通常不可用的环境中,可以通过确保只有来自特权端口的 NFS 客户端才能连接到 NFS 服务器来获得某种安全性。此功能称为"端口监视"。默认情况下,在 HDFS NFS 网关中未启用此功能,但可以通过在 NFS 网关计算机上设置以下配置来可选地启用.xml此功能:

<property>
  <name>nfs.port.monitoring.disabled</name>
  <value>false</value>
</property>

用户身份验证和映射

此版本中的 NFS 网关AUTH_UNIX身份验证。当 NFS 客户端上的用户访问装载点时,NFS 客户端将 UID 传递到 NFS 网关。NFS 网关执行查找以从 UID 查找用户名,然后将用户名与 HDFS 请求一起传递到 HDFS。例如,如果 NFS 客户端将当前用户作为"管理员",则当用户访问已装载的目录时,NFS 网关将访问 HDFS 作为用户"管理员"。若要将 HDFS 访问为用户"hdfs",在访问装载的目录时,需要将当前用户切换到客户端系统的"hdfs"。

系统管理员必须确保 NFS 客户端主机上的用户的名称和 UID 与 NFS 网关主机上的用户具有相同的名称和 UID。如果使用相同的用户管理系统(例如 LDAP/NIS)在 HDFS 节点和 NFS 客户端节点上创建和部署用户,这通常不是问题。如果用户帐户是在不同的主机上手动创建的,则可能需要修改 NFS 客户端或 NFS 网关主机上的 UID(例如,执行"用户模式 -u 123 myusername"),以便在两侧使其相同。有关 RPC 技术AUTH_UNIX可以在 RPC 规范中找到。

或者,系统管理员可以配置自定义静态映射文件,如果希望从具有一组完全不同的 UID/GID 的系统访问 HDFS NFS 网关。默认情况下,此文件位于"/etc/nfs.map",但可以通过将"static.id.map.file"属性设置为静态映射文件的路径来配置自定义位置。静态映射文件的格式与导出 (5) 手册页中描述的格式类似,但大致如下:

# Mapping for clients accessing the NFS gateway
uid 10 100 # Map the remote UID 10 the local UID 100
gid 11 101 # Map the remote GID 11 to the local GID 101


以上是关于HDFS-NFS-网关的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Keycloak 保护 Angular 8 前端和使用网关、eureka 的 Java Spring Cloud 微服务后端

微信小程序代码片段

VSCode自定义代码片段——CSS选择器

谷歌浏览器调试jsp 引入代码片段,如何调试代码片段中的js

片段和活动之间的核心区别是啥?哪些代码可以写成片段?

VSCode自定义代码片段——.vue文件的模板