目的
这篇文档描述了从少量到数以千计节点有价值的Hadoop集群的安装,配置和管理。如果你想玩Hadoop,你也许想知道在一个单机上的安装方法。(请参考:Single Node Setup)
安装前准备
从Apache mirrors中下载一个稳定的Hadoop版本
安装
Hadoop集群典型的安装是在集群上的所有机器解压这个软件或者安装RPMS。典型的集群是一个机器被设计为NameNode,另外一个机器被设计为ResourceManager,这些都是Masters节点。集群中剩下的机子都扮演着DataNode和NodeManager,这写都是slaves节点。
非安全模式下运行Hadoop
下面这段描述了怎么去配置一个Hadoop集群。
文件配置
Hadoop配置是被两种重要的配置文件所驱动:
只读默认配置-core-default.xml,hdfs-default.xml,yarn-default.xml and mapred-default.xml. 具体节点配置- conf/core-site.xml, conf/hdfs-site.xml, conf/yarn-site.xml and conf/mapred-site.xml.另外,你可以找到Hadoop安装文件中的bin/目录来控制Hadoop脚本,设置节点具体的值通过conf/hadoop-env.sh 和 yarn-env.sh文件。
节点配置
配置HADOOP集群,你将需要配置环境变量,HADOOP守护进程很好执行需要这些配置的参数。
Hadoop守护进程是: NameNode/DataNode 和 ResourceManager/NodeManager。
Hadoop守护进程环境变量配置
管理员应该使用conf/hadoop-env.sh和conf/yarn-env.sh脚本去具体指定自定义Hadoop守护进程环境。至少您应该在各个远程节点上正确的指定JAVA_HOME。
在大多数情况下,你也应该指定HADOOP_PID_DIR和HADOOP_SECURE_DN_PID_DIR的目录,这些目录只能由将要运行Hadoop守护进程的用户所写。否则有一个symlink攻击的可能性。
管理员可以使用下面表格显示的配置选项来配置自定义的守护进程:
Daemon | Environment Variable |
NameNode | HADOOP_NAMENODE_OPTS |
DataNode | HADOOP_DATANODE_OPTS |
Secondary NameNode | HADOOP_SECONDARYNAMENODE_POTS |
ResourceNanager | YARN_RESOURCEMANAGER_OPTS |
NodeManager | YARN_NODEMANAGER_OPTS |
WebProxy | YARN_PROXYSERVER_OPTS |
Map Reduce Job History Server | HADOOP_JOB_HISTORYSERVER_OPTS |
例如,配置一个NameNode去使用parallelGC,应该在hadoop-env.sh文件中添加下面这句话:
export HADOOP_NAMENODE_OPTS="-XX:+UseParallelGC ${HADOOP_NAMENODE_OPTS}"
另外,你可以自定义如下其他常用的配置参数:
- HADOOP_LOG_DIR/YARN_LOG_DIR- 这个目录存放守护进程的日志,如果不存在它们将会自动创建。
- HADOOP_HEAPSIZE/YARN_HEAPSIZE- heap的最大使用数量,是以MB为单位,如果变量设置为1000,则head的大小被设为1000MD。 这个用来给HADOOP坚守进程配置堆大小,默认值为1000MB 。如果你想分别为每个守护进程想配置值,便可以使用这个配置参数。
Daemon Environment Variable ResourceManager YARN_RESOURCEMANAGER_HEAPSIZE NodeManager YARN_NODEMANAGER_HEAPSIZE WebProxy YARN_PROXYSERVER_HEAPSIZE Map Reduce Job History Server HADOOP_JOB_HISTORYSERVER_HEAPSIZE
非安全模式下Hadoop守护线程的配置
这段为指定的配置文件给出重要的参数:
conf/core-site.xml
Parameter | Value | Notes |
fs.defaultFS | NameNode URI | hdfs://host:port/ |
io.file.buffer.size | 131072 | Size of write/read buffer used in SequenceFile |
conf/hdfs-site.xml
Configurations for NameNode:
Parameter | Value | Notes |
dfs.namenode.name.dir | NameNode 存储namespace 和 事务日志的本地目录 | 如果这个参数设置为多个目录,那么这些目录下都保存着元信息的多个备份,多个目录以逗号分隔 |
dfs.namenode.hosts dfs.namenode.hosts.exclude | 允许/排除数据节点列表 | 如果必要,使用这些文件来控制允许的数据节点列表。 |
dfs.block.size | 268435456 | HDFS文件系统最大的块时256MB |
dfs.namenode.handler.count | 100 | 使用更多的NameNode服务线程去处理大量来自DataNode的远程程序调用 |
Configurations for DataNode:
Parameter | Value | Notes |
dfs.datanode.data.dir | DataNode块存储在本地文件系统的位置,多个位置以逗号分隔 | 如果这是一个以逗号分隔的目录,这些数据将会存放在所有被命名的目录,典型的是存放在不同的设备。 |
conf/yarn-site.xml
ResourceManager和NodeManager的配置:
Parametr | Value | Notes |
yarn.acl.enable | true/false | 是否允许ACL,默认为false |
yarn.admin.acl | Admin ACL | ACL设置集群上的管理员。使用逗号分隔用户空间和用户组。默认是指定值为*,表示任何人。特别的是空格表示皆无权限。 |
yarn.log-aggregation-enable | false | 配置允许日志聚合与否 |
ResourceManager的配置:
Parameter | Value | Notes |
yarn.resourcemanager.address | ResourceManager host:port ,,用于用户提交作业. | host:port |
yarn.resourcemanager.scheduler.address | ResourceManagerhost:port,用于应用管理者向Scheduler获取资料 | host:port |
yarn.resourcemaneger.resource-tracker.address | ResourceManagerhost:port , 用于节点管理 | host:port |
yarn.resourcemanager.admin.address | ResourceManagerhost:port, 用于管理命令 | host:port |
yarn.resourcemanager.webapp.address | ResourceManager host:port, WEB URL | host:port |
yarn.resourcemanager.scheduler.class | ResourceManagerScheduler class | CapacityScheduler(推荐),FairScheduler(也推荐), or FifoScheduler |
yarn.scheduler.minimum-allocation-mb | 在ResourceManger上每个请求容器的最大分配内存 | In MBs |
yarn.scheduler.maxmum-allocation-mb | 在ResourceManager上每个请求容器的最小限度内存 | In MBs |
yarn.resourcemanager.nodes.include-path yarn.resouremanager.nodes.exclude-path | 列出允许/排除的NodeManager | 如果有必要,使用这些节点去控制允许NodeManager的列表 |
NodeManager的配置:
Paramter | Value | Notes |
yarn.nodemanager.resource.memory-mb | 为NodeManager分配可用的物理内存资源,单位为M | 在NodeManager上定义总共可用的资源,并让这些可用的资源运行在容器中 |
yarn.nodemanager.vmem-pmem-ratio | 虚拟内存的使用的比率可能会超过物理内存 | The virtual memory usage of each task may exceed its physical memory limit by this ratio. The total amount of virtual memory used by tasks on the NodeManager may exceed its physical memory usage by this ratio. |
yarn.nodemanager.local-dirs | 当中间数据被写入的时候,以逗号分隔本地文件系统的路径 | 多路径帮助传播磁盘I/O |
yarn.nodemanager.log-dirs | 当日志被写入的时候,以逗号列表分隔本地文件系统的路径 | 多路径帮助传播磁盘I/O |
yarn.nodemanager.log.retain-seconds | 10080 | 如果日志聚合被禁用, 默认的时间(秒)适当的将日志文件保存在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程序设置洗牌服务 |
History Server的配置:
Parameter | Value | Notes |
yarn.log-aggregation.retain-seconds | -1 | 在删除日志之前,多长时间聚集一次日志。-1表示不允许。注意,设置的太小你将会手动name node的垃圾邮件 |
yarn.log-aggregation.retain-check-interval-seconds | -1 | 多长时间检查一次保留的聚集日志。如果设置0或者一个负数, 聚集日志保留时间的十分之一将会作为它的值。 |
conf/mapred-site.xml
Mapreduce Applictions的配置:
Parameter | Valu | 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 | 从非常大的map中拉取输出,高数量的并行副本被reduce执行 |
MapReduce JobHistory Server的配置:
Paramter | 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 | /mp-history/tmp | 历史文件通过mapreduce被写到这个文件 |
mapreduce.jobhistory.done-dir | /mp-history/done | MR JobHistory Server通过这个目录去管理历史文件 |
Hadoop机架感知
HDFS和YARN组件是机架感知的。
NameNode和ResourceManager通过请求一个administrator配置模块中的API来获取集群中slaves节点机架的信息。
该API汇报DNS(IP也是如此)的名称给一个机架id。
site-specific模块可以使用配置项topology.node.switch.mapping.impl来配置。同样的,默认实现使用topology.script.file.name来运行一个script命令。如果topology.script.file.name没有被设置,机架id/default-rack会被返回传过去的任何IP地址。
NodeManagers健康监控
Hadoop 提供了一个administrator能通过配置NodeManager去周期性地运行一个脚本去检测一个节点健康有否的机制。
administrator能通过在脚本中执行他们的任意选择来检测一个节点是否处在健康状态。如果脚本检测到节点处在非健康状态,它必定会以ERROR开头在标准输出上打印一行。NodeManager 周期性地大量生产脚本并检查它的输出。如果输出包含字符串ERROR,如上所述,节点的状态就会报告为非健康,节点就会被ResourceManager列入黑 名单。不会再有任务分发给这个节点。然而,NodeManager持续运行这个脚 本,如果节点又变得健康了,它就会自动从ResourceManager 的黑 名单中移除。节点的健康伴随着脚本的输出,如果是不健康的,administrator就会在ResourceManager 的浏览器界面中看到。节点变得健康后也会从web见面中消失。
下面的参数是在conf/yarn-site.xml中用来控制节点健康检测脚 本。
Paramter | Value | Notes |
yarn.nodemanager.health-checker.script.path | node health script | 检查节点健康状态的脚本 |
yarn.nodemanager.health-checker.script.opts | node health script options | 检查节点健康状态脚本的选项 |
yarn.nodemanager.health-checker.script.interval-ms | node health script interval | 定时的运行health脚本 |
yarn.nodemanager.health-checker.script.tomeout-ms | node health script timeout interval | 执行health脚本超时 |
如果一些本地磁盘坏了的话,健康检测脚 本就不能给出ERROR了。NodeManager 有能力周期性地检查本地磁盘的健康状态(特别是检查nodemanager-local-dirs 和nodemanager-log-dirs)和在达到基于配置的属性yarn.nodemanager.disk-health-checker.min-healthy-disks坏目录阀值后,整个节点被标记为不健康,同时这个信息也会发送给resource manager。引导盘要么突然坏了要么引导盘中的一个失效被健康检测脚本识别。
从属文件
一般在集群中你唯一地选择一台机器作为 NameNode ,一台机器作为 ResourceManager. 剩下的机器既作为 DataNode 也作为 NodeManager 并被叫做 slaves.
在你的conf/slaves文件上列出所有slave机器名或IP地址,一个一行。
日志
Hadoop 通过 Apache Commons Logging 框架 用 Apache log4j 记录日志。编辑 conf/log4j.properties 文件定制 Hadoop 守护进程的日志配置(日志标准等等)。
Hadoop集群操作
一旦所有的必要配置完成了,发布文件到所有机器的 HADOOP_CONF_DIR 目录上。
开启Hadoop
启动一个Hadoop集群你将需要启动HDFS和YARN。
格式化一个新的分布式文件系统:
$ $HADOOP_PREFIX/bin/hdfs namenode -format <cluster_name>
使用下面的命令开启HDFS,运行在指定的NameNode上:
$ $HADOOP_PREFIX/sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script hdfs start namenode
运行一个脚本启动,启动所有slave节点的DataNode:
$ $HADOOP_PREFIX/sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script hdfs start datanode
使用下面的命令启动YARN,运行在指定的ResourceManager上:
$ $HADOOP_YARN_HOME/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR start resourcemanager
运行一个脚本启动所有slave节点的NodeManager:
$ $HADOOP_YARN_HOME/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR start nodemanager
$ $HADOOP_YARN_HOME/sbin/yarn-daemon.sh start proxyserver --config $HADOOP_CONF_DIR
使用下面的命令启动MapReduce JobHistory服务,运行在指定的服务器上:
$ $HADOOP_PREFIX/sbin/mr-jobhistory-daemon.sh start historyserver --config $HADOOP_CONF_DIR
关闭Hadoop
使用下面的命令停止NameNode,运行在指定的NameNode上:
$ $HADOOP_PREFIX/sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script hdfs stop namenode
运行一个脚本停止所有slave节点上的DataNode:
$ $HADOOP_PREFIX/sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script hdfs stop datanode
使用下面的命令停止ResourceManager,运行在指定的ResourceManager上:
$ $HADOOP_YARN_HOME/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR stop resourcemanager
$ $HADOOP_YARN_HOME/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR stop nodemanager
停止WebAppProxy服务,若多个服务器被使用负载均衡,它应该运行在每一个负载均衡节点上:
$ $HADOOP_YARN_HOME/sbin/yarn-daemon.sh stop proxyserver --config $HADOOP_CONF_DIR
$ $HADOOP_PREFIX/sbin/mr-jobhistory-daemon.sh stop historyserver --config $HADOOP_CONF_DIR
Hadoop 集群操作
一旦所有的必要配置完成了,发布文件到所有机器的 HADOOP_CONF_DIR 目录上。
本节还介绍了各种UNIX用户应该启动的各部件及使用相同的UNIX帐户和组。
启动Hadoop
启动Hadoop集群你将必须启动HDFS和YARN。
格式化一个新的文件系统作为HDFS:
[hdfs]$ $HADOOP_PREFIX/bin/hdfs namenode -format <cluster_name>
使用下面的命令启动HDFS,运行在指定的NameNode作为hdfs:
[hdfs]$ $HADOOP_PREFIX/sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script hdfs start namenode
作为一个root用户并设置特殊的环境变量HADOOP_SECURE_DN_USER运行一个基本启动所有slave节点的DataNode:
[root]$ HADOOP_SECURE_DN_USER=hdfs $HADOOP_PREFIX/sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script hdfs start datanode
[yarn]$ $HADOOP_YARN_HOME/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR start resourcemanager
运行一个脚本启动所有slave节点的NodeManager作为yarn:
[yarn]$ $HADOOP_YARN_HOME/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR start nodemanager
启动一个单独的WebAppProxy server, 运行WebAppProxy服务作为一个yarn,如果多个如果多个服务器被用于负载均衡,它(WebAppProxy)应该运行在每个负载均衡的节点上:
[yarn]$ $HADOOP_YARN_HOME/bin/yarn start proxyserver --config $HADOOP_CONF_DIR
使用下面的命令启动MapReduce JobHistory服务,运行在指定的服务器上作为mapred:
[mapred]$ $HADOOP_PREFIX/sbin/mr-jobhistory-daemon.sh start historyserver --config $HADOOP_CONF_DIR
关闭Hadoop
[hdfs]$ $HADOOP_PREFIX/sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script hdfs stop namenode
[root]$ $HADOOP_PREFIX/sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script hdfs stop datanode
使用下面的命令停止ResourceManager, 作为yarn运行指定的ResourceManger:
[yarn]$ $HADOOP_YARN_HOME/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR stop resourcemanager
[yarn]$ $HADOOP_YARN_HOME/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR stop nodemanager
停止WebProxy服务,作为yarn运行WebAppProxy server。若多个服务器被使用负载均衡,它应该运行在每一个负载均衡节点上:
[yarn]$ $HADOOP_YARN_HOME/bin/yarn stop proxyserver --config $HADOOP_CONF_DIR
[mapred]$ $HADOOP_PREFIX/sbin/mr-jobhistory-daemon.sh stop historyserver --config $HADOOP_CONF_DIR
网页接口
一旦Hadoop启动并运行,可通过如下的描述检查其组件:
Daemon | Web Interface | Notes |
NameNode | http://nn_host:port/ | 默认HTTP端口是50070 |
ResourceManager | http://rm_host:port/ | 默认HTTP端口是8088 |
MapReduce JobHistory Server | http://jhs_host:port/ | 默认HTTP端口是19888 |