本文档介绍如何安装和配置 Hadoop 集群,从几个节点到拥有数千个节点的超大型集群。要使用 Hadoop,您可能首先希望在单台机器上安装它(请参阅 单节点设置)。
本文档不涵盖高级主题,例如高可用性。
重要提示:所有生产 Hadoop 集群都使用 Kerberos 对调用者进行身份验证并保护对 HDFS 数据的访问以及限制对计算服务的访问(YARN 等)。
这些说明不涵盖与任何 Kerberos 服务的集成,- 每个启动生产集群的人都应将连接到其组织的 Kerberos 基础设施作为部署的关键部分。
有关如何保护集群的详细信息,请参阅 安全性。
安装 Hadoop 集群通常涉及在集群中的所有机器上解压缩软件或通过适用于您操作系统的打包系统进行安装。重要的是将硬件按功能划分。
通常,集群中的一台机器被指定为 NameNode,另一台机器被指定为 ResourceManager,它们是专用的。这些是主节点。其他服务(例如 Web 应用程序代理服务器和 MapReduce 作业历史记录服务器)通常在专用硬件或共享基础设施上运行,具体取决于负载。
集群中的其他机器充当 DataNode 和 NodeManager。这些是工作者。
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 作业历史记录服务器也将运行。对于大型安装,这些通常在单独的主机上运行。
管理员应使用 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
本节介绍在给定配置文件中要指定的重要的参数
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。 |
参数 | 值 | 备注 |
---|---|---|
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 | 启用或禁用日志聚合的配置 |
参数 | 值 | 备注 |
---|---|---|
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 列表。 |
参数 | 值 | 备注 |
---|---|---|
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.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 管理历史文件所在的目录。 |
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,要么由运行状况检查器脚本识别出故障。
在 etc/hadoop/workers
文件中按行列出所有工作器主机名或 IP 地址。帮助脚本(如下所述)将使用 etc/hadoop/workers
文件一次在多台主机上运行命令。它不用于任何基于 Java 的 Hadoop 配置。为了使用此功能,必须为用于运行 Hadoop 的帐户建立 ssh 信任(通过无密码 ssh 或其他一些方法,例如 Kerberos)。
许多 Hadoop 组件具有机架感知功能,并利用网络拓扑来提高性能和安全性。Hadoop 守护程序通过调用管理员配置的模块来获取集群中工作器的机架信息。有关更具体的信息,请参阅 机架感知 文档。
强烈建议在启动 HDFS 之前配置机架感知。
Hadoop 通过 Apache Commons Logging 框架使用 Apache log4j 进行日志记录。编辑 etc/hadoop/log4j.properties
文件以自定义 Hadoop 守护程序的日志记录配置(日志格式等)。
完成所有必要的配置后,将文件分发到所有机器上的 HADOOP_CONF_DIR
目录。这应该是所有机器上的同一目录。
通常,建议 HDFS 和 YARN 作为独立用户运行。在大多数安装中,HDFS 进程以“hdfs”身份执行。YARN 通常使用“yarn”帐户。
要启动 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
使用以下命令停止 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
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。 |