HDFS 对多宿主机网络的支持

本文档面向在多宿主机网络中部署 HDFS 的集群管理员。类似的 YARN/MapReduce 支持正在进行中,并在可用时记录在案。

多宿主机背景

在多宿主机网络中,集群节点连接到多个网络接口。这样做可能有以下几个原因。

  1. 安全性:安全要求可能规定将群集内通信限制在与群集内外部数据传输所用网络不同的网络中。

  2. 性能:群集内通信可能使用一种或多种高带宽互连,如光纤通道、Infiniband 或 10GbE。

  3. 故障转移/冗余:节点可能有多个网络适配器连接到单个网络,以处理网络适配器故障。

请注意,网卡绑定(也称为网卡组队或链路聚合)是一个相关但独立的主题。以下设置通常不适用于网卡绑定配置,后者以透明的方式处理多路复用和故障转移,同时向应用程序呈现单个“逻辑网络”。

修复多宿主机环境中的 Hadoop 问题

确保 HDFS 守护进程绑定所有接口

默认情况下,HDFS 端点指定为主机名或 IP 地址。在这两种情况下,HDFS 守护进程都将绑定到单个 IP 地址,这会导致守护进程无法从其他网络访问。

解决方案是为服务器端点设置单独的设置,以强制绑定通配符 IP 地址 INADDR_ANY,即 0.0.0.0。不要在任何这些设置中提供端口号。

注意: 在主/从配置文件中优先使用主机名而不是 IP 地址。

<property>
  <name>dfs.namenode.rpc-bind-host</name>
  <value>0.0.0.0</value>
  <description>
    The actual address the RPC server will bind to. If this optional address is
    set, it overrides only the hostname portion of dfs.namenode.rpc-address.
    It can also be specified per name node or name service for HA/Federation.
    This is useful for making the name node listen on all interfaces by
    setting it to 0.0.0.0.
  </description>
</property>

<property>
  <name>dfs.namenode.servicerpc-bind-host</name>
  <value>0.0.0.0</value>
  <description>
    The actual address the service RPC server will bind to. If this optional address is
    set, it overrides only the hostname portion of dfs.namenode.servicerpc-address.
    It can also be specified per name node or name service for HA/Federation.
    This is useful for making the name node listen on all interfaces by
    setting it to 0.0.0.0.
  </description>
</property>

<property>
  <name>dfs.namenode.http-bind-host</name>
  <value>0.0.0.0</value>
  <description>
    The actual address the HTTP server will bind to. If this optional address
    is set, it overrides only the hostname portion of dfs.namenode.http-address.
    It can also be specified per name node or name service for HA/Federation.
    This is useful for making the name node HTTP server listen on all
    interfaces by setting it to 0.0.0.0.
  </description>
</property>

<property>
  <name>dfs.namenode.https-bind-host</name>
  <value>0.0.0.0</value>
  <description>
    The actual address the HTTPS server will bind to. If this optional address
    is set, it overrides only the hostname portion of dfs.namenode.https-address.
    It can also be specified per name node or name service for HA/Federation.
    This is useful for making the name node HTTPS server listen on all
    interfaces by setting it to 0.0.0.0.
  </description>
</property>

客户端在连接到 DataNode 时使用主机名

默认情况下,HDFS 客户端使用 NameNode 提供的 IP 地址连接到 DataNode。根据网络配置,客户端可能无法访问此 IP 地址。修复方法是让客户端执行自己的 DataNode 主机名 DNS 解析。以下设置启用此行为。

<property>
  <name>dfs.client.use.datanode.hostname</name>
  <value>true</value>
  <description>Whether clients should use datanode hostnames when
    connecting to datanodes.
  </description>
</property>

DataNode 在连接到其他 DataNode 时使用主机名

在极少数情况下,NameNode 解析的 DataNode IP 地址可能无法从其他 DataNode 访问。修复方法是强制 DataNode 对 DataNode 间连接执行自己的 DNS 解析。以下设置启用此行为。

<property>
  <name>dfs.datanode.use.datanode.hostname</name>
  <value>true</value>
  <description>Whether datanodes should use datanode hostnames when
    connecting to other datanodes for data transfer.
  </description>
</property>

多宿主机和 Hadoop 安全性

使用 安全模式下的 Hadoop 配置多宿主机可能需要额外的配置。

主机名查找

Hadoop 服务的 Kerberos 主体使用模式 ServiceName/[email protected] 指定,例如 nn/[email protected]。这允许在所有主机上使用相同的配置文件。服务将在主体中用自己的主机名(在运行时查找)替换 _HOST

当节点配置为在 DNS 或 /etc/hosts 文件中具有多个主机名时,服务可能会查找与服务器预期不同的主机名。例如,两个服务之间的群集内流量可能会通过专用接口路由,但客户端服务会查找其公共主机名。由于主体中的主机名与流量到达的 IP 地址不匹配,Kerberos 身份验证将失败。

以下设置(从 Apache Hadoop 2.8.0 开始可用)可用于控制服务查找的主机名。

<property>
  <name>hadoop.security.dns.interface</name>
  <description>
    The name of the Network Interface from which the service should determine
    its host name for Kerberos login. e.g. eth2. In a multi-homed environment,
    the setting can be used to affect the _HOST subsitution in the service
    Kerberos principal. If this configuration value is not set, the service
    will use its default hostname as returned by
    InetAddress.getLocalHost().getCanonicalHostName().

    Most clusters will not require this setting.
  </description>
</property>

还可以将服务配置为使用特定 DNS 服务器进行主机名查找(很少需要)。

<property>
  <name>hadoop.security.dns.nameserver</name>
  <description>
    The host name or IP address of the name server (DNS) which a service Node
    should use to determine its own host name for Kerberos Login. Requires
    hadoop.security.dns.interface.

    Most clusters will not require this setting.
  </description>
</property>