Hadoop 集群设置

目的

本文档介绍如何安装和配置 Hadoop 集群,从几个节点到拥有数千个节点的超大型集群。要使用 Hadoop,您可能首先希望在单台机器上安装它(请参阅 单节点设置)。

本文档不涵盖高级主题,例如高可用性。

重要提示:所有生产 Hadoop 集群都使用 Kerberos 对调用者进行身份验证并保护对 HDFS 数据的访问以及限制对计算服务的访问(YARN 等)。

这些说明不涵盖与任何 Kerberos 服务的集成,- 每个启动生产集群的人都应将连接到其组织的 Kerberos 基础设施作为部署的关键部分。

有关如何保护集群的详细信息,请参阅 安全性

先决条件

  • 安装 Java。请参阅 Hadoop Wiki 了解已知的良好版本。
  • 从 Apache 镜像下载稳定版本的 Hadoop。

安装

安装 Hadoop 集群通常涉及在集群中的所有机器上解压缩软件或通过适用于您操作系统的打包系统进行安装。重要的是将硬件按功能划分。

通常,集群中的一台机器被指定为 NameNode,另一台机器被指定为 ResourceManager,它们是专用的。这些是主节点。其他服务(例如 Web 应用程序代理服务器和 MapReduce 作业历史记录服务器)通常在专用硬件或共享基础设施上运行,具体取决于负载。

集群中的其他机器充当 DataNode 和 NodeManager。这些是工作者。

在非安全模式下配置 Hadoop

Hadoop 的 Java 配置由两种类型的配置文件驱动

  • 只读默认配置 - core-default.xmlhdfs-default.xmlyarn-default.xmlmapred-default.xml

  • 特定于站点的配置 - etc/hadoop/core-site.xmletc/hadoop/hdfs-site.xmletc/hadoop/yarn-site.xmletc/hadoop/mapred-site.xml

此外,可以通过 etc/hadoop/hadoop-env.shetc/hadoop/yarn-env.sh 设置特定于站点的值来控制发行版的 bin/ 目录中找到的 Hadoop 脚本。

要配置 Hadoop 集群,您需要配置 Hadoop 守护程序执行的 环境以及 Hadoop 守护程序的 配置参数

HDFS 守护程序是 NameNode、SecondaryNameNode 和 DataNode。YARN 守护程序是 ResourceManager、NodeManager 和 WebAppProxy。如果要使用 MapReduce,则 MapReduce 作业历史记录服务器也将运行。对于大型安装,这些通常在单独的主机上运行。

配置 Hadoop 守护程序的环境

管理员应使用 etc/hadoop/hadoop-env.sh 以及可选的 etc/hadoop/mapred-env.shetc/hadoop/yarn-env.sh 脚本对 Hadoop 守护程序的进程环境进行特定于站点的自定义。

至少,您必须指定 JAVA_HOME,以便在每个远程节点上正确定义它。

管理员可以使用下表中所示的配置选项配置各个守护程序

守护程序 环境变量
NameNode HDFS_NAMENODE_OPTS
DataNode HDFS_DATANODE_OPTS
辅助 NameNode HDFS_SECONDARYNAMENODE_OPTS
ResourceManager YARN_RESOURCEMANAGER_OPTS
NodeManager YARN_NODEMANAGER_OPTS
WebAppProxy YARN_PROXYSERVER_OPTS
Map Reduce 作业历史记录服务器 MAPRED_HISTORYSERVER_OPTS

例如,要配置 Namenode 使用 parallelGC 和 4GB Java 堆,应在 hadoop-env.sh 中添加以下语句

  export HDFS_NAMENODE_OPTS="-XX:+UseParallelGC -Xmx4g"

有关其他示例,请参见 etc/hadoop/hadoop-env.sh

您可以自定义的其他有用的配置参数包括

  • HADOOP_PID_DIR - 存储守护程序进程 ID 文件的目录。
  • HADOOP_LOG_DIR - 存储守护程序日志文件的目录。如果日志文件不存在,则会自动创建。
  • HADOOP_HEAPSIZE_MAX - 用于 Java 堆大小的最大内存量。JVM 支持的单位在此也受支持。如果不存在单位,则假定该数字以兆字节为单位。默认情况下,Hadoop 将让 JVM 确定要使用多少。可以使用上面列出的适当 _OPTS 变量按守护进程逐个覆盖此值。例如,设置 HADOOP_HEAPSIZE_MAX=1gHADOOP_NAMENODE_OPTS="-Xmx5g" 将使用 5GB 堆配置 NameNode。

在大多数情况下,您应该指定 HADOOP_PID_DIRHADOOP_LOG_DIR 目录,以便只有将要运行 Hadoop 守护进程的用户才能向其中写入。否则,可能会发生符号链接攻击。

在系统范围的 shell 环境配置中配置 HADOOP_HOME 也是传统做法。例如,/etc/profile.d 中的简单脚本

  HADOOP_HOME=/path/to/hadoop
  export HADOOP_HOME

配置 Hadoop 守护进程

本节介绍在给定配置文件中要指定的重要的参数

  • etc/hadoop/core-site.xml
参数 备注
fs.defaultFS NameNode URI hdfs://host:port/
io.file.buffer.size 131072 SequenceFiles 中使用的读/写缓冲区的大小。
  • etc/hadoop/hdfs-site.xml

  • NameNode 的配置

参数 备注
dfs.namenode.name.dir NameNode 存储名称空间和事务日志的本地文件系统上的路径。 如果这是一个以逗号分隔的目录列表,则名称表将复制到所有目录中,以实现冗余。
dfs.hosts / dfs.hosts.exclude 允许/排除的数据节点列表。 如有必要,请使用这些文件来控制允许的数据节点列表。
dfs.blocksize 268435456 对于大型文件系统,HDFS 块大小为 256MB。
dfs.namenode.handler.count 100 更多 NameNode 服务器线程来处理来自大量数据节点的 RPC。
  • DataNode 的配置
参数 备注
dfs.datanode.data.dir DataNode 的本地文件系统上路径的逗号分隔列表,它应该在其上存储其块。 如果这是一个以逗号分隔的目录列表,那么数据将存储在所有命名的目录中,通常在不同的设备上。
  • etc/hadoop/yarn-site.xml

  • ResourceManager 和 NodeManager 的配置

参数 备注
yarn.acl.enable true / false 启用 ACL?默认为false
yarn.admin.acl 管理员 ACL 用于在集群上设置管理员的 ACL。ACL 的格式为以逗号分隔的用户空格以逗号分隔的组。默认值为特殊值 *,表示任何人。仅空格的特殊值表示无人有权访问。
yarn.log-aggregation-enable false 启用或禁用日志聚合的配置
  • ResourceManager 的配置
参数 备注
yarn.resourcemanager.address ResourceManager 主机:端口,供客户端提交作业。 主机:端口 如果设置,则覆盖在 yarn.resourcemanager.hostname 中设置的主机名。
yarn.resourcemanager.scheduler.address ResourceManager 主机:端口,供 ApplicationMasters 与 Scheduler 通信以获取资源。 主机:端口 如果设置,则覆盖在 yarn.resourcemanager.hostname 中设置的主机名。
yarn.resourcemanager.resource-tracker.address ResourceManager 主机:端口,供 NodeManagers 使用。 主机:端口 如果设置,则覆盖在 yarn.resourcemanager.hostname 中设置的主机名。
yarn.resourcemanager.admin.address ResourceManager 主机:端口,供管理命令使用。 主机:端口 如果设置,则覆盖在 yarn.resourcemanager.hostname 中设置的主机名。
yarn.resourcemanager.webapp.address ResourceManager Web UI 主机:端口。 主机:端口 如果设置,则覆盖在 yarn.resourcemanager.hostname 中设置的主机名。
yarn.resourcemanager.hostname ResourceManager 主机。 主机 可设置的单个主机名,可用于替代设置所有 yarn.resourcemanager*address 资源。导致 ResourceManager 组件使用默认端口。
yarn.resourcemanager.scheduler.class ResourceManager 调度程序类。 CapacityScheduler(推荐)、FairScheduler(也推荐)或 FifoScheduler。使用完全限定的类名,例如 org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler
yarn.scheduler.minimum-allocation-mb 资源管理器中分配给每个容器请求的内存最小限制。 以 MB 为单位
yarn.scheduler.maximum-allocation-mb 资源管理器中分配给每个容器请求的内存最大限制。 以 MB 为单位
yarn.resourcemanager.nodes.include-path / yarn.resourcemanager.nodes.exclude-path 允许/排除的 NodeManagers 列表。 如有必要,请使用这些文件控制允许的 NodeManagers 列表。
  • NodeManager 的配置
参数 备注
yarn.nodemanager.resource.memory-mb 给定NodeManager 的资源,即可用物理内存(以 MB 为单位) 定义NodeManager 上可用于正在运行容器的总可用资源
yarn.nodemanager.vmem-pmem-ratio 任务的虚拟内存使用量可以超过物理内存的最大比率 每个任务的虚拟内存使用量可以按此比率超过其物理内存限制。NodeManager 上任务使用的虚拟内存总量可以按此比率超过其物理内存使用量。
yarn.nodemanager.local-dirs 本地文件系统中写入中间数据的路径(以逗号分隔)。 多个路径有助于分散磁盘 I/O。
yarn.nodemanager.log-dirs 本地文件系统中写入日志的路径(以逗号分隔)。 多个路径有助于分散磁盘 I/O。
yarn.nodemanager.log.retain-seconds 10800 NodeManager 上保留日志文件的默认时间(以秒为单位)。仅当禁用日志聚合时才适用。
yarn.nodemanager.remote-app-log-dir /logs 应用程序完成后将应用程序日志移至该 HDFS 目录。需要设置适当的权限。仅当启用日志聚合时才适用。
yarn.nodemanager.remote-app-log-dir-suffix logs 附加到远程日志目录的后缀。日志将聚合到 ${yarn.nodemanager.remote-app-log-dir}/${user}/${thisParam}。仅当启用日志聚合时才适用。
yarn.nodemanager.aux-services mapreduce_shuffle 需要为 Map Reduce 应用程序设置的 Shuffle 服务。
yarn.nodemanager.env-whitelist NodeManager 继承到容器中的环境属性 除了默认值 HADOOP_MAPRED_HOME 之外,还应添加 MapReduce 应用程序的属性值。属性值应为 JAVA_HOME、HADOOP_COMMON_HOME、HADOOP_HDFS_HOME、HADOOP_CONF_DIR、CLASSPATH_PREPEND_DISTCACHE、HADOOP_YARN_HOME、HADOOP_HOME、PATH、LANG、TZ、HADOOP_MAPRED_HOME
  • 历史服务器的配置(需要移至其他位置)
参数 备注
yarn.log-aggregation.retain-seconds -1 删除聚合日志前保留这些日志的时间。-1 表示禁用。请谨慎操作,如果设置得太小,则会向名称节点发送垃圾邮件。
yarn.log-aggregation.retain-check-interval-seconds -1 检查聚合日志保留的时间间隔。如果设置为 0 或负值,则该值将计算为聚合日志保留时间的十分之一。请谨慎操作,如果设置得太小,则会向名称节点发送垃圾邮件。
  • etc/hadoop/mapred-site.xml

  • MapReduce 应用程序的配置

参数 备注
mapreduce.framework.name yarn 执行框架设置为 Hadoop YARN。
mapreduce.map.memory.mb 1536 较大的映射资源限制。
mapreduce.map.java.opts -Xmx1024M 较大的映射子 JVM 的堆大小。
mapreduce.reduce.memory.mb 3072 较大的归约资源限制。
mapreduce.reduce.java.opts -Xmx2560M 较大的归约子 JVM 的堆大小。
mapreduce.task.io.sort.mb 512 对数据进行排序时的较高内存限制,以提高效率。
mapreduce.task.io.sort.factor 100 对文件进行排序时一次合并的流更多。
mapreduce.reduce.shuffle.parallelcopies 50 归约运行的并行副本数量更多,以便从大量映射中获取输出。
  • MapReduce JobHistory Server 的配置
参数 备注
mapreduce.jobhistory.address MapReduce JobHistory Server host:port 默认端口为 10020。
mapreduce.jobhistory.webapp.address MapReduce JobHistory Server Web UI host:port 默认端口为 19888。
mapreduce.jobhistory.intermediate-done-dir /mr-history/tmp MapReduce 作业写入历史文件所在的目录。
mapreduce.jobhistory.done-dir /mr-history/done MR JobHistory Server 管理历史文件所在的目录。

监控 NodeManager 的运行状况

Hadoop 提供了一种机制,管理员可以通过该机制配置 NodeManager 定期运行管理员提供的脚本,以确定节点是否运行正常。

管理员可以通过在脚本中执行任意检查来确定节点是否处于正常状态。如果脚本检测到节点处于不正常状态,则必须打印一行以 ERROR 字符串开头的标准输出。NodeManager 定期生成脚本并检查其输出。如果脚本的输出包含上文所述的 ERROR 字符串,则节点的状态将报告为 不正常,并且该节点将被 ResourceManager 列入黑名单。不会再将任务分配给此节点。但是,NodeManager 会继续运行脚本,以便在节点再次变为正常状态时,自动将其从 ResourceManager 的黑名单节点中移除。节点的运行状况以及脚本的输出(如果运行状况不正常)会通过 ResourceManager Web 界面提供给管理员。Web 界面上还会显示节点变为正常状态后的时间。

可以使用以下参数在 etc/hadoop/yarn-site.xml 中控制节点运行状况监控脚本。

参数 备注
yarn.nodemanager.health-checker.script.path 节点运行状况脚本 用于检查节点运行状况的脚本。
yarn.nodemanager.health-checker.script.opts 节点运行状况脚本选项 用于检查节点运行状况的脚本选项。
yarn.nodemanager.health-checker.interval-ms 节点运行状况脚本间隔 运行运行状况脚本的时间间隔。
yarn.nodemanager.health-checker.script.timeout-ms 节点运行状况脚本超时间隔 运行状况脚本执行的超时时间。

如果只有部分本地磁盘出现故障,运行状况检查器脚本不应给出 ERROR。NodeManager 能够定期检查本地磁盘的运行状况(具体检查 nodemanager-local-dirs 和 nodemanager-log-dirs),并在基于为配置属性 yarn.nodemanager.disk-health-checker.min-healthy-disks 设置的值达到故障目录数量阈值后,将整个节点标记为不正常,并将此信息发送给资源管理器。引导磁盘要么是 RAID,要么由运行状况检查器脚本识别出故障。

Slaves 文件

etc/hadoop/workers 文件中按行列出所有工作器主机名或 IP 地址。帮助脚本(如下所述)将使用 etc/hadoop/workers 文件一次在多台主机上运行命令。它不用于任何基于 Java 的 Hadoop 配置。为了使用此功能,必须为用于运行 Hadoop 的帐户建立 ssh 信任(通过无密码 ssh 或其他一些方法,例如 Kerberos)。

Hadoop 机架感知

许多 Hadoop 组件具有机架感知功能,并利用网络拓扑来提高性能和安全性。Hadoop 守护程序通过调用管理员配置的模块来获取集群中工作器的机架信息。有关更具体的信息,请参阅 机架感知 文档。

强烈建议在启动 HDFS 之前配置机架感知。

日志记录

Hadoop 通过 Apache Commons Logging 框架使用 Apache log4j 进行日志记录。编辑 etc/hadoop/log4j.properties 文件以自定义 Hadoop 守护程序的日志记录配置(日志格式等)。

操作 Hadoop 集群

完成所有必要的配置后,将文件分发到所有机器上的 HADOOP_CONF_DIR 目录。这应该是所有机器上的同一目录。

通常,建议 HDFS 和 YARN 作为独立用户运行。在大多数安装中,HDFS 进程以“hdfs”身份执行。YARN 通常使用“yarn”帐户。

Hadoop 启动

要启动 Hadoop 集群,您需要同时启动 HDFS 和 YARN 集群。

第一次启动 HDFS 时,必须对其进行格式化。将新的分布式文件系统格式化为 hdfs

[hdfs]$ $HADOOP_HOME/bin/hdfs namenode -format

在指定节点上以 hdfs 身份使用以下命令启动 HDFS NameNode

[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start namenode

在每个指定节点上以 hdfs 身份使用以下命令启动 HDFS DataNode

[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start datanode

如果配置了 etc/hadoop/workers 和 ssh 受信任访问(请参阅 单节点设置),则可以使用实用程序脚本启动所有 HDFS 进程。作为 hdfs

[hdfs]$ $HADOOP_HOME/sbin/start-dfs.sh

使用以下命令启动 YARN,在指定的 ResourceManager 上以 yarn 身份运行

[yarn]$ $HADOOP_HOME/bin/yarn --daemon start resourcemanager

运行脚本以在每个指定的主机上以 yarn 身份启动 NodeManager

[yarn]$ $HADOOP_HOME/bin/yarn --daemon start nodemanager

启动独立的 WebAppProxy 服务器。在 WebAppProxy 服务器上以 yarn 身份运行。如果使用多台服务器进行负载平衡,则应在每台服务器上运行

[yarn]$ $HADOOP_HOME/bin/yarn --daemon start proxyserver

如果配置了 etc/hadoop/workers 和 ssh 受信任访问(请参阅 单节点设置),则可以使用实用程序脚本启动所有 YARN 进程。作为 yarn

[yarn]$ $HADOOP_HOME/sbin/start-yarn.sh

使用以下命令启动 MapReduce JobHistory Server,在指定服务器上以 mapred 身份运行

[mapred]$ $HADOOP_HOME/bin/mapred --daemon start historyserver

Hadoop 关闭

使用以下命令停止 NameNode,在指定 NameNode 上以 hdfs 身份运行

[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon stop namenode

运行脚本以停止 DataNode,作为 hdfs

[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon stop datanode

如果配置了 etc/hadoop/workers 和 ssh 受信任访问(请参阅 单节点设置),则可以使用实用程序脚本停止所有 HDFS 进程。作为 hdfs

[hdfs]$ $HADOOP_HOME/sbin/stop-dfs.sh

使用以下命令停止 ResourceManager,在指定 ResourceManager 上以 yarn 身份运行

[yarn]$ $HADOOP_HOME/bin/yarn --daemon stop resourcemanager

运行脚本以在工作节点上以 yarn 身份停止 NodeManager

[yarn]$ $HADOOP_HOME/bin/yarn --daemon stop nodemanager

如果配置了 etc/hadoop/workers 和 ssh 受信任访问(请参阅 单节点设置),则可以使用实用程序脚本停止所有 YARN 进程。作为 yarn

[yarn]$ $HADOOP_HOME/sbin/stop-yarn.sh

停止 WebAppProxy 服务器。在 WebAppProxy 服务器上以 yarn 身份运行。如果使用多台服务器进行负载平衡,则应在每台服务器上运行

[yarn]$ $HADOOP_HOME/bin/yarn stop proxyserver

使用以下命令停止 MapReduce JobHistory Server,在指定服务器上以 mapred 身份运行

[mapred]$ $HADOOP_HOME/bin/mapred --daemon stop historyserver

Web 界面

Hadoop 集群启动并运行后,请按以下说明检查组件的 Web UI

守护程序 Web 界面 备注
NameNode http://nn_host:port/ 默认 HTTP 端口为 9870。
ResourceManager http://rm_host:port/ 默认 HTTP 端口为 8088。
MapReduce JobHistory Server http://jhs_host:port/ 默认 HTTP 端口为 19888。