Hadoop 集群安装
目标
本文描述了如何从少数节点到包含上千节点的大规模集群上安装和配置 Hadoop 集群。如果只是为了尝试,你可以先从单台机器上安装开始(参阅单节点安装)。
本文并不包含诸如安全和高可用等高级话题。
前提
- 按照 Java. 请参阅 Hadoop 百科 以选择合适的版本。
- 从 Apache 镜像下载一个 Hadoop 的稳定版本。
安装
安装 Hadoop 集群一般需要在所有机器上解压发行包,并通过你操作系统配置的包管理系统进行安装。将硬件设备根据功能进行划分非常重要。
通常,集群内有一台机器被指派为 NameNode,另一台为 ResourceManager。这两台机器承担 Master 角色。 其他的服务,如 Web App Proxy Server和 MapReduce Job History server,根据集群负荷,要么运行在独占的硬件上,要么和其他服务共享基础设施。
集群内的其他机器扮演 Worker 的角色,同时运行 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
另外在发行包的 bin/ 目录下有一些 Hadoop 的脚本,你可以在 etc/hadoop/hadoop-env.sh 和 etc/hadoop/yarn-env.sh
为了配置 Hadoop 集群,你需要设定守护进程的运行环境和启动参数。
HDFS 的守护进程包括 NameNode、SecondaryNameNode 和 DataNode,Yarn 的守护进程包括 ResourceManager、NodeManager 和 WebAppProxy。如果启用了 MapReduce,也需要运行 MapReduce Job History Server。对于大规模部署,这些守护进程一般运行在不同的主机上。
配置 Hadoop 守护进程的运行环境
管理员应使用 etc/hadoop/hadoop-env.sh 或者次要的 the etc/hadoop/mapred-env.sh 和 etc/hadoop/yarn-env.sh
至少,你需要为每个远端节点提供正确的 JAVA_HOME
管理员可以使用如下的环境变量来个性化配置各个守护进程。
守护进程 | 环境变量 |
NameNode | HDFS_NAMENODE_OPTS |
DataNode | HDFS_DATANODE_OPTS |
Secondary NameNode | HDFS_SECONDARYNAMENODE_OPTS |
ResourceManager | YARN_RESOURCEMANAGER_OPTS |
NodeManager | YARN_NODEMANAGER_OPTS |
WebAppProxy | YARN_PROXYSERVER_OPTS |
Map Reduce Job History Server | 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
- HADOOP_LOG_DIR
- HADOOP_HEAPSIZE_MAX - 分配给 Java 堆的最大内存量。JVM 支持的数量单位在这里同样可用。如果没有单位,那么会被认定是 MB。通常,Hadoop 会让 JVM 自行决定使用多少。每个守护进程的这个数值可以被上述 _OPTS 后缀的环境变量覆盖。举例来说,设定 HADOOP_HEAPSIZE_MAX=1g 和 HADOOP_NAMENODE_OPTS="-Xmx5g"
大多数情况,你应该指明 HADOOP_PID_DIR 和 HADOOP_LOG_DIR,这样 Hadoop 守护进程就知道该往哪个目录写文件。否则,这里会有潜在的链接攻击的危险。
在系统级别的环境里配置 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持久化命名空间和事务日志的本地目录路径。 | 如果用逗号分割了多个目录路径,为了冗余存储, name table 会被多副本地写到这些目录中。 |
dfs.hosts / dfs.hosts.exclude | 允许/排除的 DataNode 列表。 | 如有必要,使用从节点配置文件来列出所有允许的 DataNode。 |
dfs.blocksize | 268435456 | 对于大规模文件系统,HDFS 的块大小为 256MB。 |
dfs.namenode.handler.count | 100 | NameNode 服务器响应来自大量 DataNode 的 RPC 请求的线程数量。 |
- DataNode 配置:
参数 | 取值 | 注释 |
dfs.datanode.data.dir | DataNode 存储块数据的本地目录路径。 | 如果用逗号分割了多个目录路径(通常属于不同的外接设备),数据会被多副本地写到这些目录中。 |
- etc/hadoop/yarn-site.xml
- 同时影响 ResourceManager 和 NodeManager 的配置:
参数 | 取值 | Notes |
yarn.acl.enable | true / false | 是否开启 ACL。默认是 false。 |
yarn.admin.acl | Admin ACL | 集群中具有管理员权限的用户或用户组。 如果由多个,用逗号分隔。默认值是 *,代表任何账户都可以;空白表示不设管理员。 |
yarn.log-aggregation-enable | false | 是否启动日志聚合。 |
- ResourceManager 配置:
参数 | 取值 | 注释 |
yarn.resourcemanager.address | ResourceManager | host:port 如果设定了,会覆盖 yarn.resourcemanager.hostname 中配置的主机名。 |
yarn.resourcemanager.scheduler.address | ResourceManager | host:port 如果设定了,会覆盖 yarn.resourcemanager.hostname 中配置的主机名。 |
yarn.resourcemanager.resource-tracker.address | ResourceManager | host:port 如果设定了,会覆盖 yarn.resourcemanager.hostname 中配置的主机名。 |
yarn.resourcemanager.admin.address | ResourceManager | host:port 如果设定了,会覆盖 yarn.resourcemanager.hostname 中配置的主机名。 |
yarn.resourcemanager.webapp.address | ResourceManager | host:port 如果设定了,会覆盖 yarn.resourcemanager.hostname 中配置的主机名。 |
yarn.resourcemanager.hostname | ResourceManager | host 适用于所有 yarn.resourcemanager*address |
yarn.resourcemanager.scheduler.class | ResourceManager | CapacityScheduler(推荐)、FairScheduler(次要推荐)或 FifoScheduler。使用完整的类名,如 org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler。 |
yarn.scheduler.minimum-allocation-mb | 针对容器的请求,ResourceManager 每次分配的最小内存量。 | 单位是 MB。 |
yarn.scheduler.maximum-allocation-mb | 针对容器的请求,ResourceManager 每次分配的最大内存量。 | 单位是 MB。 |
yarn.resourcemanager.nodes.include-path / yarn.resourcemanager.nodes.exclude-path | 允许/排除的 NodeManager 列表。 | 如有必要,使用从节点配置文件来列出所有允许的 NodeManager。 |
- NodeManager 配置:
参数 | 取值 | 注释 |
yarn.nodemanager.resource.memory-mb | 对于所在节点,以 MB 为单位的由 Yarn 管理的物理内存大小。 | 决定了 NodeManager |
yarn.nodemanager.vmem-pmem-ratio | 相比于物理内存大小,虚拟内存可以使用的比例。 | 在分配的物理内存之外,每个任务分配的虚拟内存大小。以及相比于 yarn.nodemanager.resource.memory-mb,所在节点所有任务消耗的虚拟内存总量。 |
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 | MapReduce 程序需要的 Shuffle 服务。 |
yarn.nodemanager.env-whitelist | 容器从 NodeManager 继承的环境变量 | 对于 MapReduce 程序,该值代表了除默认包含的 HADOOP_MAPRED_HOME 以外要继承的环境变量。合法的环境变量包括 JAVA_HOME、HADOOP_COMMON_HOME、HADOOP_HDFS_HOME、HADOOP_CONF_DIR、CLASSPATH_PREPEND_DISTCACHE、HADOOP_YARN_HOME和HADOOP_MAPRED_HOME等。 |
- History Server 配置(日志文件需要被移动到其他地方):
参数 | 取值 | 注释 |
yarn.log-aggregation.retain-seconds | -1 | 对于聚合的日志,保留多少秒。-1 代表禁用。小心,取值越小,对 NameNode 干扰越大。 |
yarn.log-aggregation.retain-check-interval-seconds | -1 | 对于日志的存续时长,多久检查一次。 如果设置为 0 或者负数值,取值将为 yarn.log-aggregation.retain-seconds 的十分之一。小心,取值越小,对 NameNode 干扰越大。 |
- etc/hadoop/mapred-site.xml
- MapReduce 程序的配置:
参数 | 取值 | 注释 |
mapreduce.framework.name | yarn | 使用 Yarn 作为 Hadoop 的执行框架。 |
mapreduce.map.memory.mb | 1536 | MAP 任务的内存限量。 |
mapreduce.map.java.opts | -Xmx1024M | MAP 任务的 JVM 启动参数。 |
mapreduce.reduce.memory.mb | 3072 | REDUCE 任务的内存限量。 |
mapreduce.reduce.java.opts | -Xmx2560M | REDUCE 任务的 JVM 启动参数。 |
mapreduce.task.io.sort.mb | 512 | 排序数据的内存限量,影响执行效率。 |
mapreduce.task.io.sort.factor | 100 | 排序文件时一次可以同时归并的文件数量。 |
mapreduce.reduce.shuffle.parallelcopies | 50 | REDUCE 任务从远端拉取数据时一次可以同时连接的 MAP 任务数量。 |
- MapReduce JobHistory Server 配置:
参数 | 取值 | 注释 |
mapreduce.jobhistory.address | MapReduce JobHistory Server host:port | 默认端口是 10020。 |
mapreduce.jobhistory.webapp.address | MapReduce JobHistory Server 网站接口 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 关键词,当前节点的状态将被汇报为不健康并被 Resource Manager 拉入黑名单,后续的任务将不会被分配到该节点。但 NodeManager 将继续执行该脚本,这样该节点酱油再次恢复健康的机会,从 ResourceManager 的黑名单中自动移除。管理员可以通过 Resource Manager 的网站接口查看各个节点的健康状态以及检查脚本的输出。节点最近一次以来的健康持续时间同样可以会显示在网页中。
在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 设定)后, 整个节点会被标记为不健康并把该信息发送给 ResourceManager。引导盘要么阵列冗余化,要么由健康检查脚本来监控。
从节点配置文件
在 etc/hadoop/workers 文件中逐行列出从节点的主机名或IP地址。辅助脚本将基于 etc/hadoop/workers
Hadoop 机架感知
许多 Hadoop 组件可以利用机架信息表达的网络拓扑结构来改善性能和安全性。通过触发管理员配置的模块,Hadoop 守护进程获取集群中从节点的机架信息。请参阅机架感知以获得更多信息。
强烈建议在启动 HDFS 之前先配置机架感知。
日志
Hadoop 通过 Apache Commons Logging 框架使用 Apache log4j 记录日志信息。 请编辑 etc/hadoop/log4j.properties
管理 Hadoop 集群
一旦所有配置就绪,分发 HADOOP_CONF_DIR
建议使用不同的用户名来运行 HDFS 和 YARN。在大多数的部署中,HDFS 进程以“hdfs”为用户名,YARN 通常使用“yarn”。
启动 Hadoop
要启动 Hadoop 集群,你需要同时启动 HDFS 和 YARN。
第一次启动 HDFS 时,必须先进行格式化。使用 hdfs 账户,执行如下命令:
[hdfs]$ $HADOOP_HOME/bin/hdfs namenode -format <cluster_name>
在指派的主节点上启动 NameNode。使用 hdfs 账户,执行如下命令:
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start namenode
在各台从节点上启动 DataNode。使用 hdfs 账户,执行如下命令:
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start datanode
如果配置了 etc/hadoop/workers 和 ssh 可信访问(参阅单节点安装),所有的 HDFS 进程都可以用一个辅助脚本来启动。使用 hdfs 账户,执行如下命令:
[hdfs]$ $HADOOP_HOME/sbin/start-dfs.sh
在指派的主节点上启动 ResourceManager。使用 yarn 账户,执行如下命令:
[yarn]$ $HADOOP_HOME/bin/yarn --daemon start resourcemanager
在各台从节点上启动 NodeManager。使用 yarn 账户,执行如下命令:
[yarn]$ $HADOOP_HOME/bin/yarn --daemon start nodemanager
使用 yarn 账户,启动独立的 WebAppProxy 服务器。如果配置了负载均衡,那么每个实例都要执行如下命令:
[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。使用 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。使用 yarn 账户,执行如下命令:
[yarn]$ $HADOOP_HOME/bin/yarn --daemon stop resourcemanager
在各台从节点上停止 NodeManager。使用 yarn 账户,执行如下命令:
[yarn]$ $HADOOP_HOME/bin/yarn --daemon stop nodemanager
如果配置了 etc/hadoop/workers 和 ssh 可信访问(参阅单节点安装),所有的 Yarn 进程都可以用一个辅助脚本来启动。使用 yarn 账户,执行如下命令:
[yarn]$ $HADOOP_HOME/sbin/stop-yarn.sh
使用 yarn 账户,停止 WebAppProxy 服务器。如果配置了负载均衡,那么每个实例都要执行如下命令:
[yarn]$ $HADOOP_HOME/bin/yarn stop proxyserver
在指派的节点上停止 MapReduce JobHistory Server。使用 mapred 账户,执行如下命令:
[mapred]$ $HADOOP_HOME/bin/mapred --daemon stop historyserver
网站接口
一旦 Hadoop 集群启动完毕,可以访问以下网址来查看各个组件的状态:
守护进程 | 网站接口 | 注释 |
NameNode | http://nn_host:port/ | 默认端口是 9870。 |
ResourceManager | http://rm_host:port/ | 默认端口是 8088。 |
MapReduce JobHistory Server | http://jhs_host:port/ | 默认端口是 19888。 |