目的
本文档介绍如何安装和配置Hadoop集群,从少数节点到数千个节点的超大型集群。 要使用Hadoop,您可以首先将其安装在一台机器上(请参阅单节点安装http://hadoop.apache.org/docs/r3.0.0/hadoop-project-dist/hadoop-common/SingleCluster.html)。本文档不包括安全性或高可用性等高级主题。
准备
安装Java
下载hadoop安装包
安装
安装Hadoop集群通常涉及在群集中的所有计算机上解压缩软件,或者通过适合您操作系统的安装包。
通常,集群中的一台机器被指定为NameNode,另一台机器被指定为ResourceManager。 这些是master。 其他服务(如Web应用程序代理服务器和MapReduce作业历史记录服务器)通常在专用硬件或共享基础结构上运行,具体取决于负载。
集群中其余的机器既充当DataNode又充当NodeManager。 这些是worker。
配置非安全模式的hadoop
Hadoop的Java配置由两种重要的配置文件驱动:
只读的默认配置 - core-default.xml,hdfs-default.xml,yarn-default.xml和mapred-default.xml。
Site-specific 的配置 - etc/hadoop/core-site.xml,etc/hadoop/hdfs-site.xml,etc/hadoop/yarn-site.xml和etc/hadoop和/mapred-site.xml。
此外,你可以控制分布式目录的bin里面的脚本,设置site-specific 值通过 etc/hadoop/hadoop-env.sh 和etc/hadoop/yarn-env.sh.
要配置Hadoop集群,您需要配置Hadoop守护程序执行的environment 以及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 |
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 Heap,应该在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 的HEAPSIZE最大内存量。 JVM支持的单元也支持这里。 如果没有单位存在,它将被认为是以兆字节为单位的数字。 默认情况下,Hadoop会让JVM决定使用多少。 使用上面列出的相应_OPTS变量,可以在每个守护进程基础上覆盖此值。 例如,设置HADOOP_HEAPSIZE_MAX = 1g和HADOOP_NAMENODE_OPTS =“ - Xmx5g”将以5GB heap配置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 存储namespace和持久化日志存储的本地文件系统路径 |
如果是以逗号分隔的目录列表,那么数据将被复制到所有目录中,以实现冗余。 |
dfs.hosts / dfs.hosts.exclude |
permitted/excluded DataNodes表 |
如有必要,使用这些文件来控制允许的datanode列表 |
dfs.blocksize |
268435456 |
HDFS块大小为256MB。 |
dfs.namenode.handler.count |
100 |
用来处理来自DataNode的RPC请求的线程数量 |
配置datanode
参数 |
值 |
说明 |
dfs.datanode.data.dir |
逗号分隔的DataNode的本地文件系统上应该存储块的路径列表。 |
如果这是逗号分隔的目录列表,则数据将存储在所有指定的目录中,通常位于不同的devices上。 |
dfs.datanode.data.dir主要用来扩容,当旧目录已经满,添加新的磁盘的时候,可以使用此属性。更多参考
如何扩容DataNode及遇到问题总结
etc/hadoop/yarn-site.xml
配置ResourceManager和NodeManager:
参数 |
值 |
说明 |
yarn.acl.enable |
true / false |
是否启用ACL, 默认为false。 |
yarn.admin.acl |
Admin ACL |
ACL在集群上设置管理员。ACLs 适用于 comma-separated-usersspacecomma-separated-groups。默认值为*,代表任何人可以访问。指定为space值代表没有人可以访问 |
yarn.log-aggregation-enable |
false |
启用或禁用日志聚合的配置 |
yarn.admin.acl:以逗号分隔的用户列表+空格+以逗号分隔的用户组列表",例如 "user1,user2 group1,group2"。如果只有组信息,需要在最前端加入一个空格,例如" group1,group2"。【参考鈞少的博客】
配置ResourceManager:
参数 |
值 |
说明 |
yarn.resourcemanager.address |
ResourceManager host:port :客户端通过该地址向RM提交作业 | 如果设置host:port ,会覆盖在yarn.resourcemanager.hostname 中设置的hostname |
yarn.resourcemanager.scheduler.address |
ResourceManager host:port ApplicationMasters 与Scheduler通信获取资源. ResourceManager 对ApplicationMaster暴露的访问地址 |
如果设置host:port , 会覆盖yarn.resourcemanager.hostname 中设置的hostname |
yarn.resourcemanager.resource-tracker.address |
ResourceManager 对NodeManager暴露的地址 |
如果设置host:port , 会覆盖yarn.resourcemanager.hostname中 设置的hostname |
yarn.resourcemanager.admin.address |
ResourceManager 对管理员暴露的访问地址 |
如果设置host:port , 会覆盖yarn.resourcemanager.hostname 中设置的hostname |
yarn.resourcemanager.webapp.address |
ResourceManager对外web ui地址 |
如果设置host:port , 会覆盖yarn.resourcemanager.hostname 中设置的hostname |
yarn.resourcemanager.hostname |
ResourceManager host. |
hostname设置,可以被上述替换 |
yarn.resourcemanager.scheduler.class |
CapacityScheduler(推荐),FairScheduler(也推荐) 或FifoScheduler。 使用完全限定的类名,例如org.apache.hadoop.yarn.server.resourcemanager. scheduler.fair.FairScheduler。 |
|
yarn.scheduler.minimum-allocation-mb |
在资源管理器上分配给每个容器请求的内存的最小限度。 |
In MBs |
yarn.scheduler.maximum-allocation-mb |
在资源管理器上分配给每个容器请求的内存的最大限度 |
In MBs |
yarn.resourcemanager.nodes.include-path / yarn.resourcemanager.nodes.exclude-path |
NodeManagers permitted/excluded列表 |
如果需要,使用这些文件控制允许的NodeManagers列表。 |
配置NodeManager:
参数 |
值 |
Notes |
yarn.nodemanager.resource.memory-mb |
资源即可用的物理内存,以MB为单位,用于给定的NodeManager |
定义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上保留日志文件的缺省时间(以秒为单位) 仅在 log-aggregation禁用的情况下适用 |
yarn.nodemanager.remote-app-log-dir |
/logs |
应用程序完成时,日志被转移到的HDFS目录。需要设置适当权限。 仅在启用log-aggregation的情况下适用。 |
yarn.nodemanager.remote-app-log-dir-suffix |
logs |
追加到远程日志目录。日志将会聚合到 ${yarn.nodemanager.remote-app-log-dir}/${user}/${thisParam} , 仅适用于log-aggregation启用 |
yarn.nodemanager.aux-services |
mapreduce_shuffle |
Shuffle服务需要设置map reduce应用程序 |
yarn.nodemanager.env-whitelist |
环境属性应该继承制NodeManagers的Containers |
对于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禁用此功能。注意不要设置太小 |
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 |
每个Map Task需要的内存量 |
mapreduce.map.java.opts |
-Xmx1024M |
map子jvm的最大 heap-size |
mapreduce.reduce.memory.mb |
3072 |
每个reduce需要的最大内存 |
mapreduce.reduce.java.opts |
-Xmx2560M |
reduces子jvm的最大 heap-size |
mapreduce.task.io.sort.mb |
512 |
当数据排序时,更高的memory-limit |
mapreduce.task.io.sort.factor |
100 |
当排序文件时,一次合并更多的流 |
mapreduce.reduce.shuffle.parallelcopies |
50 |
reduce运行更多数量的的并行的copies,获取map大量的输出 |
配置MapReduce JobHistory Server:
参数 |
值 |
说明 |
mapreduce.jobhistory.address |
MapReduce JobHistory Server 访问地址 |
默认端口10020. |
mapreduce.jobhistory.webapp.address |
MapReduce JobHistory Server Web UI 访问地址 |
默认端口knnaauudnerom19888. |
mapreduce.jobhistory.intermediate-done-dir |
/mr-history/tmp |
mapreduce job所写历史文件的路径 |
mapreduce.jobhistory.done-dir |
/mr-history/done |
MR JobHistory Server管理历史文件的目录 |
监测NodeManagers的健康状况
Hadoop提供了一种机制,管理员可以通过该机制将NodeManager配置为定期运行管理员提供的脚本,以确定节点是否健康。
管理员可以通过在脚本中执行任何选择检查来确定节点是否处于健康状态。如果脚本检测到节点处于不健康状态,则必须以字符串ERROR打印一行到标准输出。 NodeManager定期生成脚本并检查其输出。如果脚本的输出包含ERROR字符串(如上所述),那么节点的状态将报告为不健康,并且该节点将被ResourceManager列入黑名单。没有进一步的任务将被分配给这个节点。但是,NodeManager继续运行该脚本,以便节点再次变得健康时,它将自动从ResourceManager中的黑名单节点中删除。节点的运行状况和脚本的输出(如果运行状况不佳)可供管理员在ResourceManager Web界面中使用。节点健康以来的时间也显示在Web界面上。
以下参数可用于控制etc/hadoop/yarn-site.xml中的节点运行状况监视脚本。
参数 |
值 |
说明 |
yarn.nodemanager.health-checker.script.path |
Node health script |
脚本监测节点的健康状态 |
yarn.nodemanager.health-checker.script.opts |
Node health script options |
脚本选项检查节点的健康状态。 |
yarn.nodemanager.health-checker.interval-ms |
Node health script interval |
运行健康脚本的时间间隔。 |
yarn.nodemanager.health-checker.script.timeout-ms |
Node health script timeout interval |
健康脚本执行超时。 |
如果本地磁盘损坏,健康脚本监测不支持给出Error。NodeManager能定期监测本地磁盘的健康状态(特别是检查nodemanager-local-dirs和nodemanager-log-dirs),并且在根据配置属性yarn.nodemanager.disk-health-checker.min-healthy-disks设置的值达到坏目录数量的阈值,整个节点被标记为不健康,并且这个信息也被发送到资源管理器。引导磁盘被攻击,或者引导磁盘中的故障由运行状况检查程序脚本识别。
Slaves文件
在etc/hadoop/workers文件中,列出所有的worker的hostname或则IP地址。一行一个。辅助脚本将会使用etc/hadoop/workers文件在多台机器上一起运行命令。它不用任何基于Java的hadoop配置。必须为用于运行Hadoop的帐户建立ssh信任(通过无密码ssh或其他方式,如Kerberos)。【注释:这里前面版本不同的是修改文件名称,由slaves文件改为workers文件】
hadoop机架感知
许多Hadoop组件都具有机架感知功能,并利用网络拓扑来提高性能和安全性。 Hadoop守护进程通过调用管理员配置的模块获取集群中worker的机架信息。 有关更多具体信息,请参阅RackAware(http://hadoop.apache.org/docs/r3.0.0/hadoop-project-dist/hadoop-common/RackAwareness.html)文档。
日志
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]$ $HADOOP_HOME/bin/hdfs namenode -format <cluster_name>
在指定节点上使用以下命令启动HDFS NameNode:
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start namenode
在每个指定的节点上使用以下命令启动HDFS数据节点:
[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服务器。运行webappproxy服务器为Yarn用户。如果使用多个服务器进行负载平衡,则应该在每个服务器上运行它们:
[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
集群关闭
使用下面命令停止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服务器。运行webappproxy服务器为Yarn用户。如果使用多个服务器进行负载平衡,则应该在每个服务器上运行它们:
[yarn]$ $HADOOP_HOME/bin/yarn stop proxyserver
停止MapReduce JobHistory Server使用下面命令,在指定的机器上运行
[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. |