Hadoop 集群设置
目的
先决条件
安装
在非安全模式下配置 Hadoop
配置 Hadoop 守护程序的环境
配置 Hadoop 守护程序
监控 NodeManager 的运行状况
Slaves 文件
Hadoop 机架感知
日志记录
操作 Hadoop 集群
Hadoop 启动
Hadoop 关机
Web 界面
目的
本文档介绍如何安装和配置 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.xml、hdfs-default.xml、yarn-default.xml 和 mapred-default.xml。
特定于站点的配置 - etc/hadoop/core-site.xml、etc/hadoop/hdfs-site.xml、etc/hadoop/yarn-site.xml 和 etc/hadoop/mapred-site.xml。
此外,可以通过 etc/hadoop/hadoop-env.sh 和 etc/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.sh 和 etc/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=1g 和 HADOOP_NAMENODE_OPTS="-Xmx5g" 将使用 5GB 堆配置 NameNode。
在大多数情况下,您应该指定 HADOOP_PID_DIR 和 HADOOP_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。