二、Hadoop集群

 

目的

这篇文档描述了如何安装、配置和管理从几个节点到几千个节点的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/
posted on 2015-05-25 17:33  飞机说之代码也疯狂  阅读(488)  评论(0编辑  收藏  举报