Hadoop 文档

General

Common

HDFS

MapReduce

MapReduce REST APIs

YARN

YARN REST APIs

YARN Service

Submarine

Hadoop Compatible File Systems

Auth

Tools

Reference

Configuration

总览

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

  • 用户可以通过与NFSv3客户端兼容的操作系统上的本地文件系统浏览HDFS文件系统。
  • 用户可以将文件从HDFS文件系统下载到其本地文件系统上。
  • 用户可以将文件从其本地文件系统直接上传到HDFS文件系统。
  • 用户可以通过安装点将数据直接流式传输到HDFS。支持文件追加,但不支持随机写入。

NFS网关计算机需要相同的东西来运行HDFS客户端,例如Hadoop JAR文件,HADOOP_CONF目录。NFS网关可以与DataNode,NameNode或任何HDFS客户端位于同一主机上。

组态

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

<属性>
  <name> hadoop.proxyuser.nfsserver.groups </ name>
  <value> root,users-group1,users-group2 </ value>
  <说明>
         允许“ nfsserver”用户代理“ users-group1”的所有成员,并且
         “ users-group2”组。请注意,在大多数情况下,您需要包括
         组“ root”,因为用户“ root”(通常属于“ root”组)将
         通常是最初在NFS客户端系统上执行挂载的用户。
         将此设置为“ *”以允许nfsserver用户代理任何组。
  </ description>
</ property>

<属性>
  <name> hadoop.proxyuser.nfsserver.hosts </ name>
  <value> nfs-client-host1.com </ value>
  <说明>
         这是运行nfs网关的主机。将此设置为“ *”以允许
         来自任何主机的请求将被代理。
  </ description>
</ property>

以上是非安全模式下NFS网关的唯一必需配置。对于使用Kerberized的hadoop集群,需要将以下配置添加到网关的hdfs-site.xml中(注意:用代理用户名替换字符串“ nfsserver”,并确保密钥表中包含的用户也是同一代理用户):

  <属性>
    <name> nfs.keytab.file </ name>
    <value> /etc/hadoop/conf/nfsserver.keytab </ value> <!-nfs网关密钥表的路径->
  </ property>

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

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

  • AIX NFS客户端有一些已知问题,默认情况下会阻止其与HDFS NFS网关正常工作。如果希望能够从AIX访问HDFS NFS网关,则应设置以下配置设置以启用这些问题的解决方法:

    <属性>
      <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文件进行写访问。

    <属性>
      <name> nfs.superuser </ name>
      <value> hdfs_superuser的名称</ value>
    </ property>
    

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

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

    <属性>
      <name> dfs.namenode.accesstime.precision </ name>
      <value> 3600000 </ value>
      <description> HDFS文件的访问时间精确到此值。
        默认值为1小时。设置为0将禁用
        HDFS的访问时间。
      </ description>
    </ property>
    
  • 用户应该更新文件转储目录。NFS客户端通常会重新排序写操作,尤其是在未使用“ sync”选项安装导出时。顺序写入可以随机顺序到达NFS网关。此目录用于在写入HDFS之前临时保存乱序写入。对于每个文件,无序写入在累积到超过内存中的特定阈值(例如1MB)后,将被转储。需要确保目录有足够的空间。例如,如果应用程序上载10个文件,每个文件具有100MB,则建议该目录具有大约1GB的空间,以防万一每个文件发生最坏情况的写重新排序。此属性更新后,仅NFS网关需要重新启动。

      <属性>
        <name> nfs.dump.dir </ name>
        <value> /tmp/.hdfs-nfs </ value>
      </ property>
    
  • 默认情况下,导出可以由任何客户端挂载。为了更好地控制访问,用户可以更新以下属性。值字符串包含计算机名称和访问特权,用空格字符分隔。机器名称格式可以是单个主机,“ *”,Java正则表达式或IPv4地址。访问权限使用rw或ro来指定对导出机器的读/写或只读访问权限。如果未提供访问权限,则默认值为只读。条目之间用“;”分隔。例如:“ 192.168.0.0/22 rw;\\ w * \\。example \\。com; host1.test.org ro;”。此属性更新后,仅NFS网关需要重新启动。请注意,此处的Java正则表达式与Linux NFS导出表中使用的规则表达式不同,例如,使用“ \\ w * \\。example \\。com”代替“ * .example.com”,“ 192” \\。

    <属性>
      <name> nfs.exports.allowed.hosts </ name>
      <value> * rw </ value>
    </ property>
    
  • HDFS超级用户是与NameNode进程本身具有相同标识的用户,并且超级用户可以执行任何操作,因为对于超级用户,权限检查永远不会失败。如果配置了以下属性,则NFS客户端上的超级用户可以访问HDFS上的任何文件。默认情况下,未在网关中配置超级用户。请注意,即使配置了超级用户,“ nfs.exports.allowed.hosts”仍然有效。例如,如果不允许NFS客户端主机在“ nfs.exports.allowed.hosts”中具有写访问权限,则超级用户将无法通过网关对HDFS文件进行写访问。

    <属性>
      <name> nfs.superuser </ name>
      <value> hdfs_superuser的名称</ value>
    </ property>
    
  • 指标。与其他HDFS守护程序一样,网关公开运行时指标。它可以作为JSON文档在http:// gateway-ip:50079 / jmx上获得。与NFS处理程序相关的指标以“ Nfs3Metrics”的名称公开。可以通过将以下属性添加到hdfs-site.xml文件来启用延迟直方图。

    <属性>
      <name> nfs.metrics.percentiles.intervals </ name>
      <value> 100 </ value>
      <description>启用延迟直方图以进行读取,写入和
         提交请求。在此示例中,时间单位为100秒。
      </ description>
    </ property>
    
  • JVM和日志设置。您可以在HDFS_NFS3_OPTS中导出JVM设置(例如,堆大小和GC日志)。在hadoop-env.sh中可以找到更多与NFS相关的设置。要获取NFS调试跟踪,可以编辑log4j.property文件以添加以下内容。注意,调试跟踪(特别是对于ONCRPC)可能非常冗长。

    要更改日志记录级别:

        log4j.logger.org.apache.hadoop.hdfs.nfs =调试
    

    要获取ONCRPC请求的更多详细信息,请执行以下操作:

        log4j.logger.org.apache.hadoop.oncrpc =调试
    
  • 出口点。可以指定HDFS的NFS导出点。仅支持一个导出点。配置导出点时需要完整路径。默认情况下,导出点是根目录“ /”。

    <属性>
      <name> nfs.export.point </ name>
      <值> / </值>
    </ property>
    

启动和停止NFS网关服务

提供NFS服务需要三个守护程序:rpcbind(或portmap),mountd和nfsd。NFS网关进程同时具有nfsd和mountd。它共享HDFS根目录“ /”作为唯一的导出。建议使用NFS网关软件包中包含的端口映射。即使NFS网关可以与大多数Linux发行版提供的portmap / rpcbind一起使用,但在某些Linux系统(例如RHEL 6.2和SLES 11)上仍需要包含portmap的软件包,前者是由于rpcbind bug所致。更详细的讨论可以在HDFS-4763中找到。

  1. 停止平台提供的nfsv3和rpcbind / portmap服务(各种Unix平台上的命令可能不同):

    [root]>服务nfs停止
    [root]>服务rpcbind停止
    
  2. 启动Hadoop的端口映射(需要root特权):

    [root]> $ HADOOP_HOME / bin / hdfs --daemon启动端口映射
    
  3. 启动mountd和nfsd。

    此命令不需要root特权。在非安全模式下,应由本用户指南开头提到的代理用户启动NFS网关。在安全模式下,只要用户具有对“ nfs.keytab.file”中定义的Kerberos密钥表的读取访问权限,任何用户都可以启动NFS网关。

    [hdfs] $ $ HADOOP_HOME / bin / hdfs --daemon启动nfs3
    
  4. 停止NFS网关服务。

    [hdfs] $ $ HADOOP_HOME / bin / hdfs --daemon stop nfs3
    [root]> $ HADOOP_HOME / bin / hdfs --daemon停止端口映射
    

(可选)如果您以root身份启动NFS网关,则可以放弃运行Hadoop提供的portmap守护程序,而在所有操作系统上使用系统portmap守护程序。这将使HDFS NFS网关可以解决上述错误,并仍使用系统portmap守护程序进行注册。为此,只需像平常一样启动NFS网关守护进程,但请确保以“ root”用户身份启动,并将“ HDFS_NFS3_SECURE_USER”环境变量设置为非特权用户。在这种模式下,NFS网关将以root身份启动以执行其对系统端口图的初始注册,然后在NFS网关进程的整个生命周期的剩余时间内,将特权回馈给HDFS_NFS3_SECURE_USER指定的用户。请注意,如果选择此路线,则应跳过上述步骤1和2。

验证与NFS相关的服务的有效性

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

    [root]> rpcinfo -p $ nfs_server_ip
    

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

           程序原型端口
    
           100005 1 TCP 4242已安装
    
           100005 2 UDP 4242已安装
    
           100005 2 TCP 4242安装
    
           100000 2 tcp 111端口映射器
    
           100000 2 udp 111端口映射器
    
           100005 3 UDP 4242已安装
    
           100005 1 UDP 4242已安装
    
           100003 3 tcp 2049 nfs
    
           100005 3 tcp 4242安装
    
  2. 验证HDFS名称空间是否已导出并且可以挂载。

    [root]> showmount -e $ nfs_server_ip
    

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

            导出$ nfs_server_ip上的列表:
    
            /(所有人)
    

挂载出口“ /”

当前,NFS v3仅使用TCP作为传输协议。不支持NLM,因此需要挂载选项“ nolock”。强烈建议使用挂载选项“ sync”,因为它可以最大程度地减少或避免对写入进行重新排序,从而可以提高吞吐量。在上传大文件时,未指定sync选项可能会导致不可靠的行为。建议使用硬安装。这是因为,即使客户端将所有数据发送到NFS网关之后,当NFS客户端内核对写入进行重新排序时,NFS网关也可能需要花费一些额外的时间才能将数据传输到HDFS。

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

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

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

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

允许来自非特权客户端的挂载

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

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

用户认证和映射

此版本中的NFS网关使用AUTH_UNIX样式身份验证。当NFS客户端上的用户访问安装点时,NFS客户端会将UID传递给NFS网关。NFS网关进行查找以从UID中查找用户名,然后将用户名与HDFS请求一起传递给HDFS。例如,如果NFS客户端的当前用户为“ admin”,则当用户访问已挂载的目录时,NFS网关将以“ admin”用户身份访问HDFS。要以用户“ hdfs”的身份访问HDFS,在访问已挂载的目录时,需要在客户端系统上将当前用户切换为“ hdfs”。

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

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

#映射访问NFS网关的客户端
uid 10 100#将远程UID 10映射到本地UID 100
gid 11 101#将远程GID 11映射到本地GID 101