- 目的
- 准备工作
- 安装
- 在非保护模式下运行Hadoop
- 配置Hadoop的守护进程环境
- 在非保护模式下配置Hadoop守护进程
- Hadoop的支架意识
- 监视健康状态的节点管理器
- slaves文件
- 日志
- 操纵Hadoop集群
- 启动Hadoop
- 关闭Hadoop
- web接口
目的
这篇文档描述了如何安装、配置和管理从几个节点到几千个节点的Hadoop集群。
为了玩好Hadoop,你应该首先试着在单个机器上安装它(参考单个节点的建立)。
准备工作
从Apache所维护的镜像文件中下载一个稳定版本的Hadoop。
安装
安装一个Hadoop集群就是将解压的软件安装到集群当中的所有机器上。
典型地,在集群中的一台机器被设计成NameNode,另外一台设计成ResourceManager,它们就是主机。
在集群中余下的机器都充当着DataNode和NodeManager的角色。它们是从机。
在非保护模式下运行Hadoop
接下来的章节就描述了如何配置Hadoop集群。
配置文件
Hadoop配置有两种类型的重要配置文件:
- 默认只读-core-default.xml,hdfs-default.xml,yarn-default.xml和mapred-default.xml
- 针对站点配置-conf/core-site.xml,conf/hsdf-site.xml,conf/yarn-site.xml和conf/mapred-site.xml
另外,你能够配置目录/bin下的conf/hadoop-evn.sh和yarn-env.sh脚本文件的值来控制Hadoop的脚本。
展现配置
为了配置Hadoop集群,你需要配置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守护进程被用户写进的目录。否者存在潜在的符号链接攻击。
管理员能够使用下面的表格当中的配置选项来配置独立的守护进程:
守护进程 | 环境变量 |
---|---|
NameNode | HADOOP_NAMENODE_OPTS |
DataNode | HADOOP_DATANODE_OPTS |
Secondary NameNode | HADOOP_SECONDARYNAMENODE_OPTS |
ResourceManager | YARN_RESOURCEMANAGER_OPTS |
NodeManager | YARN_NODEMANAGER_OPTS |
WebAppProxy | YARN_PROXYSERVER_OPTS |
Map Reduce Job History Server | YARN_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 — 指定能够使用的最大的堆内存,单位为MB。比如,如果将这个变量设置成1000,那么堆的大小就是1000MB。它就是为了配置守护进程的堆的大小。默认值为1000。如果想为每个进程配置独立的值,参数如下:
守护进程 | 环境变量 |
---|---|
ResourceManager | YARN_RESOURCEMANAGER_HEAPSIZE |
NodeManager | YARN_NodeMANAGER_HEAPSIZE |
WebAppProxy | YARN_PROXYSERVER_HEAPSIZE |
Map Reduce Job History Server | HADOOP_JOB_HISTORYSERVER_HEAPSIZE |
在非保护模式下配置Hadoop守护进程
这一章节用来处理给定配置文件的一些重要参数:
- conf/core-site.xml
参数 | 值 |
---|---|
fs.defaultFS | NameNode URI |
io.file.buffer.size | 131072 |
- conf/hdfs-site.xml
- 配置NameNode:
参数 | 值 | 注意 |
---|---|---|
dfs.namenode.name.dir | 指向NameNode存储的命名空间和事务日志的本地文件系统路径 | 如果这是一个用逗号分隔开来的一组目录,那么名称表格将会复制到所有的目录,形成冗余。 |
dfs.namenode.hosts / dfs.namenode.hosts.exclude |
列出所有允许的/排斥的DataNode | 如果有必要,利用这些文件来控制允许的列表 |
dfs.blocksize |
268435456 | HDFS一块的大小为256MB |
dfs.namenode.handler.count |
100 | 大量的NameNode服务器线程从大量的DataNode处理RPC(Remote Procedure Call,远程过程调用) |
- 配置DataNode:
参数 | 值 | 注意 |
---|---|---|
dfs.datanode.data.dir |
以逗号进行分割的存储DataNode块的本地文件系统的路径 | 如果是以逗号分隔的一组目录,那么数据将会存储在所有的命名目录,一般在不同的设备 |
- conf/yarn-site.xml
- 配置ResourceManager和NodeManager:
参数 | 值 | 注意 |
---|---|---|
yarn.acl.enable |
true/false | ACL(访问控制列表)是否有效?默认是false |
yarn.admin.acl |
Admin ACL | 在即群上将ACL设置成admin。ACL是以一组用户之间为空来表示。默认的值为*,表示任何人。如果是空格意味着没有人能够访问 |
- 配置ResourceManager:
参数 | 值 | 注意 |
---|---|---|
yarn.resourcemanager.address |
ResourceManager主机:端口 为了用户能够提交作业 | 主机:端口 如果设置了,就会覆盖在yarn.resourcemanager.hostname当中设置的主机名 |
yarn.resourcemanager.scheduler.address |
ResourceManager主机:端口 为了应用主机能够与拥有资源的调度者进行会话 | 主机:端口,如果设置了,将会覆盖在yarn.resourcemanager.hostname当中设置的值 |
yarn.resourcemanager.resource-tracker.address |
ResourceManager主机:端口 为了NodeManager | 主机:端口,如果设置了,将会覆盖在yarn.resourcemanager.hostname当中设置的值 |
yarn.resourcemanager.admin.address |
ResourceManager主机:端口 为了管理员命令 | 主机:端口,如果设置了,将会覆盖在yarn.resourcemanager.hostname当中设置的值 |
yarn.resourcemanager.webapp.address |
主机:端口 为ResourceManager的web接口 | 主机:端口,如果设置了,将会覆盖在yarn.resourcemanager.hostname当中设置的值 |
yarn.resourcemanager.hostname |
ResourceManager主机 | 主机名能够替换所有配置了yarn.resourcemanager*address的资源。给ResourceManager分配默认端口 |
yarn.resourcemanager.scheduler.class |
ResourceManager Scheduler类 | CapacityScheduler(推荐类),FairScheduler(也推荐)或者FifoScheduler |
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 |
对于给定的NodeManager的Resource比如可用的物理内存,单位为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上保留日志文件的默认时间(单位秒)。只有在log-aggregation失效时,才提供。 |
yarn.nodemanager.remote-app-log-dir |
/logs | 当应用完成时,应用日志被移入到HDFS目录。有必要设置合适的权限。只有在log-aggregation有效时才提供。 |
yarn.nodemanager.remote-app-log-dir-suffix |
logs | 后缀追加到远程日志目录。日志将会aggregated to(聚集)在${yarn.nodemanager.remote-app-log-dir}/${user}/${thisParam}。只有在log-aggregation有效时才提供。 |
yarn.nodemanager.aux-services |
mapreduce_shuffle | 对于Map Reduce应用,Shuffle service(洗牌服务)需要被设置 |
- conf/mapred-site.xml
- 配置MapReduce应用:
参数 | 值 | 注意 |
---|---|---|
mapreduce.framework.name |
yarn | 将执行框架设置成Hadoop YARN |
mapreduce.map.memory.mb |
1536 | 对于map的资源限制 |
mapreduce.map.java.opts |
-Xmx1024M | map的子虚拟机的堆大小 |
mapreducereduce.memory.mb |
3072 | reduce的资源限制 |
mapreduce.reduce.java.opts |
-Xmx2560M | reduce子虚拟机的堆的大小 |
mapreduce.task.io.sort.mb |
512 | 当对数据进行排序时的内存限制 |
mapreduce.task.io.sort.factor |
100 | 当对文件排序时,一次性多少流合并 |
mapreduce.reduce.shuffle.parallelcopies |
50 | 设置reduce运行的并行拷贝数目,从大量的map中拿取output。 |
- 配置MapReduce的JobHistory服务器:
参数 | 值 | 注意 |
---|---|---|
mapreduce.jobhistory.address |
MapReduce JobHistory服务器主机:端口 | 默认端口为10020 |
MapReduce JobHistory服务器的Web接口 主机:端口 | 默认端口是19888 | |
mapreduce.jobhistory.webapp.address |
MapReduce JobHistory服务器的Web接口 主机:端口 | 默认端口是19888 |
mapreduce.jobhistory.intermediate-done-dir |
/mr-history/tmp | MapReduce作业写入的历史文件目录 |
mapreduce.jobhistory.done-dir |
/mr-history/done | 被MR JobHistory服务器所管理的历史文件目录 |
Hadoop支架意识
HDFS和YARN组件是一种支架意识。
NameNode和ResourceManager通过调用一个API解析管理员配置的模块从而获得在集群中从机的支架信息。
这个API将DNS名称(也可以是IP地址)转换成支架ID。
站点细化模块能够配置成使用topology.node.switch.mapping.impl项。默认实现与运行脚本或命令一样使用的topology.script.file.name。如果topology.script.file.name没有设置,支架ID或者默认的支架被任何传入的ip地址返回。
监视NodeManager的健康状态
Hadoop提供了一种机制,通过管理员配置NodeManager定期的运行一个管理员提供的脚本来检测节点是否处于健康状态。
如果脚本检测出节点处于不健康的状态,它必须打印出一行以ERROR开始的字符串输出。NodeManager定期的生产脚本来检测输出。如果脚本输出当中包含ERROR字符串,那么节点就报告了一个不健康的状态,那么ResourceManager就会将这个节点列入黑名单,并且将不会有任务分配给这个节点。然而,NodeManager会继续执行脚本,于是,如果节点再次处于健康状态,它就会自动从ResourceManager所管理的黑名单中移除。节点的健康状态是与输出脚本相关的,如果它不健康了,是能够在ResourceManager的Web接口当中看到的,节点健康的时间也能够在web接口当中展现出来。
下面的参数通过在conf/yarn-site.xml中监听脚本从而能够利用来控制节点健康状态
参数 | 值 | 注释 |
---|---|---|
yarn.nodemanager.health-checker.script.path | 节点健康脚本 | 检查节点健康状态的脚本 |
yarn.nodemanager.health-checker.script.opts | 节点健康脚本选项 | 检查节点健康状态的可选脚本 |
yarn.nodemanager.health-checker.script.interval-ms | 运行健康状态监测脚本的时间区间 | |
yarn.nodemanager.health-checker.script.timeout-ms | 运行健康状态监测脚超时的时间 |
如果本地磁盘损坏,健康状态检查脚本是不一定能够给出ERROR字符串的。NodeManager有能力定期的去检查本地磁盘的健康状态(尤其是检查nodemanager-local-dirs和nodemanager-log-dirs)并且在损坏目录达到属性yarn.nodemanager.disk-health-checker所配置的阀值后,所有的节点都会标记成不健康的并且这个信息将会被发送给resource manager。
slaves文件
你选择集群中的一个机器充当NameNode的角色,一台充当ResourceManger的角色。其他所有的机器都充当着DataNode和NodeManager的角色,被指定为从机。
在conf/slaves文件中列出所有的从机的主机名或者IP地址,一行一个。
日志
Hadoop使用Apache log4j通过Apache Commons日志框架来记录日志。编辑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
运行一个脚本来启动所有从机上的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
运行脚本来启动从机上的所有NodeManager:
$ $HADOOP_YARN_HOME/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR start nodemanager
启动本地化的WebAppProxy服务器。如果想使用大量的服务器来实现负载均衡,那么它就应该运行在它们各自机器之上:
$ $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:
$ $HADOOP_PREFIX/sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script hdfs stop namenode
运行脚本停止在所有从机上的所有DataNode:
$ $HADOOP_PREFIX/sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script hdfs stop datanode
通过以下命令停止ResourceManager:
$ $HADOOP_YARN_HOME/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR stop resourcemanager
运行一下脚本停止所有从机上的DataNode: $ $HADOOP_YARN_HOME/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR stop nodemanager
停止Web代理服务器: $ $HADOOP_YARN_HOME/sbin/yarn-daemon.sh stop proxyserver --config $HADOOP_CONF_DIR
通过以下命令停止MapReduce JobHistory 服务器:
$ $HADOOP_PREFIX/sbin/mr-jobhistory-daemon.sh stop historyserver --config $HADOOP_CONF_DIR
Web接口
一旦Hadoop集群被建立并且运行起来了,各个组件的web接口描述如下:
守护进程 | web接口 |
---|---|
NameNode | http://nn_host:port/ |
ResourceManager | http://rm_host:port/ |
MampReduce JobHistory Server | http://jhs_host:port/ |