Hadoop Cluster Setup
hadoop集群设置
目的
本文档描述了如何安装和配置Hadoop集群,范围从几个节点到具有数千个节点的超大集群。要使用Hadoop,您可能首先希望在一台机器上安装它(请参阅单个节点设置)。本文档不涉及安全性或高可用性等高级主题。
预备条件
- 安装Java。
- 下载hadoop的稳定版本。
安装
安装Hadoop集群通常需要在集群中的所有机器上解压软件,或者通过适合你的操作系统的打包系统安装软件。
通常,集群中的一台机器被指定为NameNode,另一台机器被指定为ResourceManager。这些都是主节点。其他服务(如Web应用程序代理服务器和MapReduce作业历史服务器)通常在专用硬件或共享基础设施上运行,这取决于负载。
集群中的其他机器同时充当DataNode和NodeManager。这些是workers。
在非安全模式下配置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集群,您需要配置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。
管理员可以使用下表所示的配置选项来配置各个进程:
Daemon | Environment Variable |
---|---|
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中添加以下语句:
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 op_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
Parameter | Value | Notes |
---|---|---|
fs.defaultFS | NameNode URI | hdfs://host:port/ |
io.file.buffer.size | 131072 | 在序列文件中使用的读/写缓冲区的大小。 |
- etc/hadoop/hdfs-site.xml
- NameNode的配置:
Parameter | Value | Notes |
---|---|---|
dfs.namenode.name.dir | NameNode在本地文件系统上持久化存储名称空间和事务日志的路径。 | 如果这是一个以逗号分隔的目录列表,那么名称表将复制到所有目录中,以实现冗余。 |
dfs.hosts / dfs.hosts.exclude | 允许/排除的数据节点列表。 | 如有必要,使用这些文件控制允许的数据节点列表。 |
dfs.blocksize | 268435456 | 对于大型文件系统,HDFS块大小为256MB。 |
dfs.namenode.handler.count | 100 | 更多的NameNode服务器线程来处理大量的数据节点的RPC。 |
- DataNode的配置:
Parameter | Value | Notes |
---|---|---|
dfs.datanode.data.dir | 数据节点的本地文件系统上的路径列表(以逗号分隔),其中应存储其块。 | 如果这是一个以逗号分隔的目录列表,那么数据将存储在所有命名的目录中,通常存储在不同的设备上。 |
- etc/hadoop/yarn-site.xml
- ResourceManager 和 NodeManager的配置:
Parameter | Value | Notes |
---|---|---|
yarn.acl.enable | true / false | 是否启用ACL?默认值为false。 |
yarn.admin.acl | 管理ACL | 用于在集群上设置管理员的ACL。默认为特殊值*表示任何人。空值意味着没有人可以访问。 |
yarn.log-aggregation-enable | false | 配置启用或禁用日志聚合 |
- ResourceManager的配置:
Parameter | Value | Notes |
---|---|---|
yarn.resourcemanager.address | ResourceManager主机:客户端提交作业的端口。 | 如果主机:端口设置了,则覆盖yarn.resourcemanager.hostname中设置的主机名。 |
yarn.resourcemanager.scheduler.address | ResourceManager主机:应用程序管理器与调度器通信以获取资源的端口。 | 如果主机:端口设置了,则覆盖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.fair scheduler。 |
yarn.scheduler.minimum-allocation-mb | 在资源管理器上分配给每个容器请求的最小内存限制。 | In MBs |
yarn.scheduler.maximum-allocation-mb | 在资源管理器上分配给每个容器请求的最大内存限制。 | In MBs |
yarn.resourcemanager.nodes.include-path / yarn.resourcemanager.nodes.exclude-path | 允许/排除的节点管理器列表。 | 如有必要,使用这些文件控制允许的节点管理器列表。 |
- NodeManager的配置:
Parameter | Value | Notes |
---|---|---|
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 | 容器从NodeManagers继承的环境属性 | 对于mapreduce应用程序,除了默认值之外,还应添加HADOOP_MAPRED_HOME。属性有JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME。 |
- 历史服务器的配置(需要移动到其他地方):
Parameter | Value | Notes |
---|---|---|
yarn.log-aggregation.retain-seconds | -1 | 在删除聚合日志之前保持聚合日志的时间。-1表示禁用。请注意,设置得太小,您将发送垃圾信息到namenode。 |
yarn.log-aggregation.retain-check-interval-seconds | -1 | 检查聚合日志保留之间的时间。如果设置为0或负值,则计算该值为聚合日志保留时间的十分之一。请注意,设置得太小,您将发送垃圾信息到namenode。 |
- etc/hadoop/mapred-site.xml
- MapReduce应用的配置
Parameter | Value | Notes |
---|---|---|
mapreduce.framework.name | yarn | 执行框架设置为Hadoop YARN。 |
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服务器的配置:
Parameter | Value | Notes |
---|---|---|
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服务器管理的目录。 |
监测NodeManagers的健康状况
hadoop提供了一种机制,管理者可以配置NodeManager 周期性地运行管理者提供的脚本去确认一个节点是否健康。
管理员可以通过在脚本中执行他们选择的任何检查来确定节点是否处于健康状态。如果脚本监测到节点处于不健康的状态,它将在标准输出打印一行以ERROR开头的字符串。NodeManager周期性地生成脚本并检查其输出。如果脚本的输出包含上述描述的ERROR字符串,节点的状态将被报告为不健康的,并且该节点被资源管理器列入黑名单。不再向此节点分配其他任务。但是,NodeManager将继续运行该脚本,以便如果节点再次恢复健康,它将自动从ResourceManager上的黑名单中删除。如果节点和脚本的输出不健康,管理员可以在ResourceManager web界面中发现。节点处于健康状态的时间也显示在web界面上。
以下etc/hadoop/yarn-site.xml中的参数可用于控制节点健康监测脚本。
Parameter | Value | Notes |
---|---|---|
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 | 节点健康脚本超时时间 | 运行健康脚本的超时时间。 |
如果只是某些本地磁盘出现问题,则健康检查程序脚本不会报错。NodeManager能够定期检查本地磁盘的健康状况(特别检查 nodemanager-local-dirs 和 nodemanager-log-dirs)并且到达配置属性yarn.nodemanager.disk-health-checker.min-healthy-disks的损坏目录临界值时,节点将会被标记为不健康,并把信息发送个ResourceManager。健康检查脚本已经定义了启动硬盘被攻击或者出现问题这些情况。
从节点文件
在etc/hadoop/workers文件中每一行列出了所有worker(从节点)主机名和ip地址。帮助脚本(如下所述)将使用etc/hadoop/workers文件在多个主机上同时运行命令。它不用于任何基于java的Hadoop配置。为了使用这个功能,必须为用于运行Hadoop的帐户建立ssh信任(通过无密码的ssh或其他一些方法,如Kerberos)。
Hadoop机架感知
许多Hadoop组件是支持机架感知的,并利用网络拓扑来提高性能和安全性。Hadoop进程通过调用管理员配置的模块来获取集群中workers(从节点)的机架信息。有关更具体的信息,请参阅机架感知文档。
强烈建议在启动HDFS之前配置机架感知。
日志
Hadoop通过Apache Commons日志记录框架使用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 <cluster_name>
用以下命令在指定节点开启HDFS的NameNode:
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start namenode
用以下命令在每个指定节点开启HDFS的DataNode:
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start datanode
如果配置了etc/hadoop/workers和ssh(请参见单个节点设置),则可以使用通用的程序脚本启动所有HDFS进程:
[hdfs]$ $HADOOP_HOME/sbin/start-dfs.sh
使用以下命令启动YARN,在指定的ResourceManager上运行:
[yarn]$ $HADOOP_HOME/bin/yarn --daemon start resourcemanager
在每个指定主机上运行脚本启动NodeManager:
[yarn]$ $HADOOP_HOME/bin/yarn --daemon start nodemanager
启动一个独立的WebAppProxy服务器。在YARN作为WebAppProxy服务器上运行。如果使用多个服务器进行负载平衡,则应该在每个服务器上运行:
[yarn]$ $HADOOP_HOME/bin/yarn --daemon start proxyserver
如果配置了etc/hadoop/workers和ssh(请参见单个节点设置),则可以使用通用的程序脚本启动所有YARN进程:
[yarn]$ $HADOOP_HOME/sbin/start-yarn.sh
在指定的服务器上使用以下命令启动MapReduce JobHistory服务器:
[mapred]$ $HADOOP_HOME/bin/mapred --daemon start historyserver
Hadoop的关闭
在指定的NameNode上用以下命令停止NameNode:
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon stop namenode
运行脚本来停止DataNode:
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon stop datanode
如果配置了etc/hadoop/workers和ssh(请参见单个节点设置),则可以使用通用的程序脚本关闭所有HDFS进程:
[hdfs]$ $HADOOP_HOME/sbin/stop-dfs.sh
在指定的ResourceManager上使用以下命令关闭ResourceManager:
[yarn]$ $HADOOP_HOME/bin/yarn --daemon stop resourcemanager
在worker上运行一个脚本来关闭NodeManager:
[yarn]$ $HADOOP_HOME/bin/yarn --daemon stop nodemanager
如果配置了etc/hadoop/workers和ssh(请参见单个节点设置),则可以使用通用的程序脚本关闭所有YARN进程:
[yarn]$ $HADOOP_HOME/sbin/stop-yarn.sh
停止WebAppProxy服务器。在YARN作为WebAppProxy服务器上运行。如果使用多个服务器进行负载平衡,则应该在每个服务器上运行:
[yarn]$ $HADOOP_HOME/bin/yarn stop proxyserver
在指定的服务器上使用以下命令关闭MapReduce JobHistory服务器:
[mapred]$ $HADOOP_HOME/bin/mapred --daemon stop historyserver
web界面
Hadoop集群启动并运行后,检查组件的web-ui,如下所述:
Daemon | Web Interface | Notes |
---|---|---|
NameNode | http://nn_host:port/ | 默认HTTP端口为9870 |
ResourceManager | http://rm_host:port/ | 默认HTTP端口为8088 |
MapReduce JobHistory Server | http://jhs_host:port/ | 默认HTTP端口为19888 |