2、Hadoop集群的设置
2.1、目的
本文档描述了如何安装和配置Hadoop集群,从少数节点到拥有数千个节点的超大集群。要使用Hadoop,您可能首先希望将其安装在一台机器上(参见单节点安装)。
本文档不涉及高级主题,如安全性或高可用性。
2.2、先决条件
- 安装Java。查看Hadoop Wiki以获得已知的好版本。
- 从Apache镜像下载一个稳定的Hadoop版本。
2.3、安装
安装Hadoop集群通常需要在集群中的所有机器上解包软件,或者通过适合您的操作系统的打包系统进行安装。将硬件按功能划分是很重要的。
通常,集群中的一台机器被指定为NameNode,另一台机器被指定为ResourceManager。这些都是masters。其他服务(如Web App Proxy Server和MapReduce Job History Server)通常在专用硬件或共享基础设施上运行,具体取决于负载。
集群中的其余机器同时充当DataNode和NodeManager。这些是工作节点。
2.4、非安全模式下配置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作业历史记录服务器也将运行。对于大型安装,它们通常在单独的主机上运行。
2.4.1、配置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使用并行gc和一个4GB的Java堆,应该在hadoop-env.sh中添加以下语句:
export HDFS_NAMENODE_OPTS="-XX:+UseParallelGC -Xmx4g"
其他示例参见etc/hadoop/hadoop-env.sh。
其他可以自定义的有用配置参数包括:
HADOOP_PID_DIR—存储daemon进程id文件的目录。
HADOOP_LOG_DIR——存储守护进程日志文件的目录。如果日志文件不存在,则自动创建它们。
HADOOP_HEAPSIZE_MAX—用于Java堆大小的最大内存量。这里也支持JVM支持的单元。如果没有单位,它将被假定为以兆字节为单位。默认情况下
Hadoop将让JVM决定使用多少。可以使用上面列出的相应的_OPTS变量覆盖每个守护进程的这个值。例如,设置HADOOP_HEAPSIZE_MAX=1g
hadoop_namende_opts =”-Xmx5g”,将NameNode配置为5GB堆。
在大多数情况下,您应该指定HADOOP_PID_DIR和HADOOP_LOG_DIR目录,这样它们只能被将要运行hadoop守护进程的用户写入。否则可能会发生符号链接攻击。
在系统范围的shell环境配置中配置HADOOP_HOME也是一种传统做法。例如,/etc/profile.d中的一个简单脚本:
HADOOP_HOME=/path/to/hadoop
export HADOOP_HOME
2.4.2、配置Hadoop守护进程
本节讨论在给定配置文件中需要指定的重要参数:
- etc/ hadoop / core-site.xml
| Parameter | Value | Notes |
| —- | —- | —- |
|
fs.defaultFS
| NameNode URI | hdfs://host:port/ | |io.file.buffer.size
| 131072 | SequenceFiles中使用的读/写缓冲区的大小。 |
etc/hadoop/hdfs-site.xml
Configurations for NameNode:
Parameter | Value | Notes |
---|---|---|
dfs.namenode.name.dir |
本地文件系统上的路径,NameNode在其中持久化存储命名空间和事务日志。 | 如果这是一个逗号分隔的目录列表,那么名称表将被复制到所有目录中,以实现冗余。 |
dfs.hosts / dfs.hosts.exclude |
允许/不允许的datanode列表。 | 如果有必要,可以使用这些文件来控制允许的数据节点列表。 |
dfs.blocksize |
268435456 | 对于大型文件系统,HDFS块大小为256MB。 |
dfs.namenode.handler.count |
100 | 更多的NameNode服务器线程来处理来自大量datanode的rpc。 |
- Configurations for DataNode:
| Parameter | Value | Notes |
| —- | —- | —- |
|
dfs.datanode.data.dir
| DataNode的本地文件系统上以逗号分隔的路径列表,它应该在其中存储它的块。 | 如果这是一个逗号分隔的目录列表,那么数据将存储在所有命名的目录中,通常在不同的设备上。 |
etc/hadoop/yarn-site.xml
Configurations for ResourceManager and NodeManager:
Parameter | Value | Notes |
---|---|---|
yarn.acl.enable |
true / false |
Enable ACLs? Defaults to false. |
yarn.admin.acl |
Admin ACL | ACL设置集群上的管理员。acl用于逗号分隔的用户,空格分隔的组。默认为特殊值,表示任何人_。just _space*的特殊值表示没有人可以访问。 |
yarn.log-aggregation-enable |
false | 启用或禁用日志聚合的配置 |
- Configurations for ResourceManager:
| Parameter | Value | Notes |
| —- | —- | —- |
| yarn.resourcemanager.address |
ResourceManager
host:port for clients to submit jobs. | host:port If set, overrides the hostname set inyarn.resourcemanager.hostname
. | | yarn.resourcemanager.scheduler.address |ResourceManager
host:port for ApplicationMasters to talk to Scheduler to obtain resources. | host:port If set, overrides the hostname set inyarn.resourcemanager.hostname
. | | yarn.resourcemanager.resource-tracker.address |ResourceManager
host:port for NodeManagers. | host:port If set, overrides the hostname set inyarn.resourcemanager.hostname
. | | yarn.resourcemanager.admin.address |ResourceManager
host:port for administrative commands. | host:port If set, overrides the hostname set inyarn.resourcemanager.hostname
. | |yarn.resourcemanager.webapp.address
|ResourceManager
web-ui host:port. | host:port If set, overrides the hostname set inyarn.resourcemanager.hostname
. | |yarn.resourcemanager.hostname
|ResourceManager
host. | host Single hostname that can be set in place of setting allyarn.resourcemanager*address
resources. Results in default ports for ResourceManager components. | |yarn.resourcemanager.scheduler.class
|ResourceManager
Scheduler class. |CapacityScheduler
(recommended),FairScheduler
(also recommended), orFifoScheduler
. Use a fully qualified class name, e.g.,org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler
. | |yarn.scheduler.minimum-allocation-mb
| Minimum limit of memory to allocate to each container request at theResource Manager
. | In MBs | |yarn.scheduler.maximum-allocation-mb
| Maximum limit of memory to allocate to each container request at theResource Manager
. | In MBs | |yarn.resourcemanager.nodes.include-path
/yarn.resourcemanager.nodes.exclude-path
| List of permitted/excluded NodeManagers. | 如果需要,使用这些文件来控制允许的nodemanager列表。 |
- Configurations for 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 | 附加到远程日志目录的后缀。日志将被聚合到{user}/${thisParam}仅在启用日志聚合时适用。 | |yarn.nodemanager.aux-services
| mapreduce_shuffle | Map Reduce应用需要设置的Shuffle服务。 | |yarn.nodemanager.env-whitelist
| 容器从NodeManagers继承的环境属性 | For mapreduce application in addition to the default values HADOOP_MAPRED_HOME should to be added. Property value should 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 |
- Configurations for History Server (Needs to be moved elsewhere):
| Parameter | Value | Notes |
| —- | —- | —- |
|
yarn.log-aggregation.retain-seconds
| -1 | 在删除聚合日志之前保留多长时间。1禁用。请注意,将此设置得太小,您将滥发名称节点。 | |yarn.log-aggregation.retain-check-interval-seconds
| -1 | 聚合日志保留检查之间的时间间隔。如果设置为0或负值,则该值将计算为聚合日志保留时间的十分之一。请注意,将此设置得太小,您将滥发名称节点。 |
etc/hadoop/mapred-site.xml
- Configurations for MapReduce Applications:
| Parameter | Value | Notes |
| —- | —- | —- |
|
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 | 为reduce的子jvm设置更大的堆大小。 | |mapreduce.task.io.sort.mb
| 512 | 为提高效率而对数据进行排序时的内存限制更高。 | |mapreduce.task.io.sort.factor
| 100 | 在对文件进行排序时,更多的流同时合并。 | |mapreduce.reduce.shuffle.parallelcopies
| 50 | 运行更多的并行副本可以减少从大量的映射中获取输出。 |
- Configurations for MapReduce JobHistory Server:
| Parameter | Value | Notes |
| —- | —- | —- |
|
mapreduce.jobhistory.address
| MapReduce JobHistory Server host:port | Default port is 10020. | |mapreduce.jobhistory.webapp.address
| MapReduce JobHistory Server Web UI host:port | Default port is 19888. | |mapreduce.jobhistory.intermediate-done-dir
| /mr-history/tmp | MapReduce作业写历史文件的目录。 | |mapreduce.jobhistory.done-dir
| /mr-history/done | 由MR JobHistory Server管理历史文件的目录。 |
2.5、监视NodeManagers的健康状态
Hadoop提供了一种机制,管理员可以通过这种机制配置NodeManager,定期运行管理员提供的脚本,以确定节点是否健康。
管理员可以通过在脚本中执行他们所选择的任何检查来确定节点是否处于健康状态。如果脚本检测到节点处于不健康状态,则必须将字符串ERROR开头的一行打印到标准输出。NodeManager定期生成脚本并检查其输出。如果脚本的输出包含如上所述的字符串ERROR,则该节点的状态被ResourceManager报告为不健康状态,并被列入黑名单。不会再将任何任务分配给此节点。但是,NodeManager会继续运行该脚本,因此如果该节点再次恢复健康,它将自动从ResourceManager上的黑名单节点中删除。管理员可以通过ResourceManager web界面查看节点的健康状况和脚本的输出(如果不健康)。在web界面上还会显示节点处于健康状态的时间。
以下参数可用于控制etc/hadoop/yarn-site.xml中的节点运行状况监视脚本。
Parameter | Value | Notes |
---|---|---|
yarn.nodemanager.health-checker.script.path |
Node health script | Script to check for node’s health status. |
yarn.nodemanager.health-checker.script.opts |
Node health script options | Options for script to check for node’s health status. |
yarn.nodemanager.health-checker.interval-ms |
Node health script interval | Time interval for running health script. |
yarn.nodemanager.health-checker.script.timeout-ms |
Node health script timeout interval | Timeout for health script execution. |
如果只有一些本地磁盘坏了,健康检查程序脚本不应该给出ERROR。NodeManager能够定期检查本地磁盘的健康状况(特别是检查NodeManager -local-dirs和NodeManager -log-dirs),以及在达到坏目录数量的阈值后(根据配置属性yarn.nodemanager.disk-health-checker设置的值)。最小健康状态的磁盘,整个节点被标记为不健康状态,该信息也被发送到资源管理器。启动磁盘被抄查,或者启动磁盘中的故障由运行状况检查器脚本标识。
2.6、Slaves文件
在etc/hadoop/workers文件中列出所有worker主机名或IP地址,每行一个。Helper脚本(如下所述)将使用etc/hadoop/workers文件在多个主机上同时运行命令。它不用于任何基于java的Hadoop配置。为了使用此功能,必须为用于运行Hadoop的帐户建立ssh信任(通过无密码ssh或其他一些方法,如Kerberos)。
2.7、Hadoop机架感知
许多Hadoop组件都是机架感知的,并利用网络拓扑来提高性能和安全性。Hadoop守护进程通过调用管理员配置的模块来获取集群中worker的机架信息。更多具体信息请参见机架感知文档。
强烈建议在启动HDFS之前配置机架感知。
2.8、日志记录
Hadoop通过Apache Commons Logging框架使用Apache log4j进行日志记录。编辑等/ hadoop / log4j。属性文件来定制Hadoop守护进程的日志配置(日志格式等)。
2.9、操作Hadoop集群
完成所有必要的配置后,将文件分发到所有机器上的HADOOP_CONF_DIR目录。在所有机器上,这个目录应该是相同的。
一般情况下,建议HDFS和YARN作为单独的用户运行。在大多数安装中,HDFS进程以“HDFS”的形式执行。YARN通常使用“YARN”帐户。
2.9.1、启动
要启动Hadoop集群,您需要同时启动HDFS和YARN集群。
第一次打开HDFS时,必须对其进行格式化。将一个新的分布式文件系统格式化为hdfs:
[hdfs]$ $HADOOP_HOME/bin/hdfs namenode -format <cluster_name>
在指定的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]$ $HADOOP_HOME/sbin/start-yarn.sh
使用以下命令启动MapReduce JobHistory Server,在指定的服务器上以mapred的形式运行:
[mapred]$ $HADOOP_HOME/bin/mapred --daemon start historyserver
2.9.2、关闭
停止NameNode,在hdfs指定的NameNode上执行如下命令:
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon stop namenode
以hdfs的形式运行脚本停止DataNode:
[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
运行一个脚本在一个worker上以yarn的形式停止一个NodeManager:
[yarn]$ $HADOOP_HOME/bin/yarn --daemon stop nodemanager
如果配置了etc/hadoop/workers和ssh可信访问(参见单节点设置),所有的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
2.10、web接口
一旦Hadoop集群启动并运行,检查组件的web-ui如下所示:
Daemon | Web Interface | Notes |
---|---|---|
NameNode | http://nn_host:port/ | Default HTTP port is 9870. |
ResourceManager | http://rm_host:port/ | Default HTTP port is 8088. |
MapReduce JobHistory Server | http://jhs_host:port/ | Default HTTP port is 19888. |