@changedi
2016-04-25T10:43:56.000000Z
字数 8852
阅读 5427
大数据
Hadoop
原文:http://hadoop.apache.org/docs/r2.6.4/hadoop-project-dist/hadoop-common/ClusterSetup.html
需要在集群每台机器上解压安装Hadoop的发行版本。典型的场景是,集群中的一台机器作为NameNode,一台机器作为ResourceManager。这些是master。其他的机器作为DataNode和NodeManager。作为slave。
下面的部分描述了如何配置一个Hadoop集群。
配置文件
Hadoop的配置是由两类配置文件来驱动的:
只读的默认配置: core-default.xml, hdfs-default.xml, yarn-default.xml 和 mapred-default.xml。
站点相关的配置:conf/core-site.xml, conf/hdfs-site.xml, conf/yarn-site.xml 和 conf/mapred-site.xml。
额外的,你可以通过设置站点相关的值来改变conf/hadoop-env.sh和yarn-env.sh,以达到控制bin/目录下的Hadoop脚本的目的。
站点配置
为了配置Hadoop集群,你需要配置Hadoop程序运行的环境和程序所需参数。
Hadoop相关的进程包括NameNode/DataNode 和 ResourceManager/NodeManager。
管理员通过conf/hadoop-env.sh和conf/yarn-env.sh脚本来配置定制的站点相关的Hadoop进程环境。
最少要做到每台远程节点都配置JAVA_HOME。
在大多数情况下,你需要声明 HADOOP_PID_DIR 和 HADOOP_SECURE_DN_PID_DIR 来指明可以被准备运行hadoop进程的用户写的目录。否则会有潜在的符号链接攻击风险。
管理员可以配置独立的进程,通过如下表的配置选项:
Daemon | 环境变量 |
---|---|
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 | 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 :使用的堆的最大容量(单位是MB),比如设置为1000,那么堆大小就是1000MB。默认值是1000。如果想为不同的节点程序选择不同的堆配置,可以参考如下设置。
Daemon | 环境变量 |
---|---|
ResourceManager | YARN_RESOURCEMANAGER_HEAPSIZE |
NodeManager | YARN_NODEMANAGER_HEAPSIZE |
WebAppProxy | YARN_PROXYSERVER_HEAPSIZE |
Map Reduce Job History Server | HADOOP_JOB_HISTORYSERVER_HEAPSIZE |
本段描述的参数均通过如下的配置文件提供:
参数 | 值 | 备注 |
---|---|---|
fs.defaultFS | NameNode的URI | hdfs://host:port/ |
io.file.buffer.size | 131072 | SequenceFile读写buffer的大小。 |
conf/hdfs-site.xml
参数 | 值 | 备注 |
---|---|---|
dfs.namenode.name.dir | NameNode存储namespace和transaction日志的本地文件系统路径。 | 如果是一个逗号分隔的目录列表,那么name table会冗余复制到所有的目录里。 |
dfs.namenode.hosts / dfs.namenode.hosts.exclude | 允许/排除的DataNode列表。 | 如有必要的话,可以使用这些文件来控制准入的DataNode。 |
dfs.blocksize | 268435456 | HDFS的blocksize,对于大型文件系统是256MB。 |
dfs.namenode.handler.count | 100 | 对于有大量的DataNode的情况,配置多数NameNode服务器的线程来处理DataNode发起的RPC。 |
参数 | 值 | 备注 |
---|---|---|
dfs.datanode.data.dir | 逗号分隔的本地文件系统路径列表,用来声明DataNode存储block的位置。 | 如果是逗号分隔的列表,那么数据会被存储到所有列出的目录下,尤其是不同机器上的情况。 |
conf/yarn-site.xml
参数 | 值 | 备注 |
---|---|---|
yarn.acl.enable | true / false | 是否开启ACL?默认是false。 |
yarn.admin.acl | Admin的ACL | 设置集群admin的ACL。ACL是comma-separated-usersspacecomma-separated-groups。默认是*对所有人都生效,意味着没有人有访问的权限。 |
yarn.log-aggregation-enable | false | 开启或禁止日志聚合功能。 |
参数 | 值 | 备注 |
---|---|---|
yarn.resourcemanager.address | ResourceManager对客户端提交作业开放的host:port | 如果设置了host:port,会覆盖在yarn.resourcemanager.hostname里设置的hostname。 |
yarn.resourcemanager.scheduler.address | ResourceManager对ApplicationMasters与Scheduler通信获取资源的host:port | 如果设置了host:port,会覆盖在yarn.resourcemanager.hostname里设置的hostname。 |
yarn.resourcemanager.resource-tracker.address | ResourceManager对NodeManagers开放的host:port。 | 如果设置了host:port,会覆盖在yarn.resourcemanager.hostname里设置的hostname。 |
yarn.resourcemanager.admin.address | ResourceManager对管理命令开放的host:port | 如果设置了host:port,会覆盖在yarn.resourcemanager.hostname里设置的hostname。 |
yarn.resourcemanager.webapp.address | ResourceManager的web-ui的 host:port。 | 如果设置了host:port,会覆盖在yarn.resourcemanager.hostname里设置的hostname。 |
yarn.resourcemanager.hostname | ResourceManager的host。 | host 这个hostname可以适用yarn.resourcemanager*address类的host,端口是ResourceManager的默认端口。 |
yarn.resourcemanager.scheduler.class | ResourceManager Scheduler 类 | CapacityScheduler (推荐使用), FairScheduler (同样推荐 ), 或者 FifoScheduler |
yarn.scheduler.minimum-allocation-mb | ResourceManager为每个容器请求分配的最小内存限制。 | In MBs |
yarn.scheduler.maximum-allocation-mb | ResourceManager为每个容器请求分配的最大内存限制。 | In MBs |
yarn.resourcemanager.nodes.include-path / yarn.resourcemanager.nodes.exclude-path | 允许/排除的NodeManager列表。 | 如有必要的话,可以使用这些文件来控制准入的NodeManagers。 |
参数 | 值 | 备注 |
---|---|---|
yarn.nodemanager.resource.memory-mb | 对于给定NodeManager可用物理内存的配置,单位是MB。 | 为NodeManager定义总的可用内存,从而可以运行容器。 |
yarn.nodemanager.vmem-pmem-ratio | 任务虚拟内存超过物理内存的最大比率。 | 每个任务使用的虚拟内存可以按照这个比率超过实际物理内存的限制。NodeManager上面所有任务的总的虚拟内存使用量可以按照这个比率超过实际物理内存总量。 |
yarn.nodemanager.local-dirs | 中间数据被写入本地文件系统目录的列表,逗号分隔。 | 多个路径帮助提升磁盘io |
yarn.nodemanager.log-dirs | 日志被写入的本地系统目录列表,逗号分隔。 | 多个路径帮助提升磁盘io |
yarn.nodemanager.log.retain-seconds | 10800 | 如果log聚合是disable的,这个配置项提供默认的NodeManager的日志文件保存时间(秒)。 |
yarn.nodemanager.remote-app-log-dir | /logs | 如果log聚合是enable的,应用日志在应用结束时移动到的目标HDFS目录。需要设置特定的权限。 |
yarn.nodemanager.remote-app-log-dir-suffix | logs | 远程日志文件目录的后缀。如果log聚合是enable的,日志会被聚合到{user}/${thisParam} |
yarn.nodemanager.aux-services | mapreduce_shuffle | MapReduce应用要设置的Shuffle服务。 |
参数 | 值 | 备注 |
---|---|---|
yarn.log-aggregation.retain-seconds | -1 | 聚合日志保存多久的配置。-1表示关闭这个配置。设置太短的时间可能会导致NameNode变脏。 |
yarn.log-aggregation.retain-check-interval-seconds | -1 | 检查聚合文件的时间周期。如果设置为0或者负值,表示值是聚合日志保留时间的十分之一。设置太短的时间可能会导致NameNode变脏。 |
conf/mapred-site.xml
参数 | 值 | 备注 |
---|---|---|
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 | reduce的并行备份数,这些reduce负责从大量的map中获取输出。 |
参数 | 值 | 备注 |
---|---|---|
mapreduce.jobhistory.address | MapReduce JobHistory 服务器 host:port | 默认端口是10020 |
mapreduce.jobhistory.webapp.address | MapReduce JobHistory Server Web UI host:port | 默认端口是19888. |
mapreduce.jobhistory.intermediate-done-dir | /mr-history/tmp | 写到MapReduce作业的历史文件的目录。 |
mapreduce.jobhistory.done-dir | /mr-history/done | MR JobHistory服务器管理的历史文件的目录。 |
HDFS和YARN的组件都是rack-aware的。
NameNode和ResourceManager通过调用API来获取集群里slave的rack信息,而API是管理员配置的。
API解析DNS(IP地址)为一个rack id。
site相关的模块可以用topology.node.switch.mapping.impl来配置。默认实现方式与topology.script.file.name配置的命令脚本实现相同。如果topology.script.file.name没有被设置,默认的rack的id将作为返回值返回给调用的所有入参IP地址。
Hadoop提供了一种机制,管理员可以配置NodeManager定期运行管理员提供的脚本来检测一个node是否健康。
管理员可以在他的脚本里做任意的检查来检测node的健康状态。如果脚本检测到一个node处于不健康的状态,脚本会在标准输出里打印一行ERROR的记录。NodeManager会定时的运行这个脚本并检查它的输出。如果脚本输出包含ERROR,也就是说node状态异常,这时ResourceManager会把它列入黑名单。以后不会再有任务被分配到这个node上。当然NodeManager的这个脚本是持续运行的,当node恢复正常后,ResourceManager会检测到并自动将其移出黑名单。node的健康状况在ResourceManager的web界面上也是可以由管理员观察的。node恢复健康时,web界面也会同步显示。
conf/yarn-site.xml里的以下这些参数可以控制node的健康监控脚本。
参数 | 值 | 备注 |
---|---|---|
yarn.nodemanager.health-checker.script.path | node健康脚本 | 检查node健康状态的脚本。 |
yarn.nodemanager.health-checker.script.opts | node健康脚本的 options | 检查node健康状态的脚本的 options |
yarn.nodemanager.health-checker.script.interval-ms | node健康检查时间间隔 | 运行脚本的时间间隔。 |
yarn.nodemanager.health-checker.script.timeout-ms | node健康脚本超时的时间间隔。 | 脚本执行的超时间隔 |
健康检查脚本当本地磁盘坏掉时候不支持报ERROR。NodeManager有定期检查本地磁盘的能力(特别要检查nodemanager-local-dirs和nodemanager-log-dirs),并且在检查到损坏的目录数超过配置项yarn.nodemanager.disk-health-checker.min-healthy-disks设定的阈值时,整个node都会被标记为非健康且信息要发送到resource manager。boot磁盘要么是raid的,要么就是可以被健康检查脚本出错识别的。
典型的场景,你可以选择集群中的一台机器作为NameNode,再选一台机器作为ResourceManager。其他机器都作为DataNode和NodeManager。
在conf/slaves文件下列出所有的slave的hostname和IP,每行一个。
Hadoop通过Apache Commons Logging使用Apache log4j来作为日志框架。编辑conf/log4j.properties文件来自定义log的配置。
一旦所有配置都好了后,将这些配置文件都分发到所有机器的HADOOP_CONF_DIR目录下。
启动一个Hadoop集群,你需要同时启动HDFS和YARN集群。
格式化一个新的分布式文件系统:
$ $HADOOP_PREFIX/bin/hdfs namenode -format <cluster_name>
在NameNode上运行下面的命令启动HDFS:
$ $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
在ResourceManager上运行下面的命令启动YARN:
$ $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
启动一个独立运行的WebAppProxy服务器。如果通过负载均衡运行多台服务器,那么每台机器都需要运行:
$ $HADOOP_YARN_HOME/sbin/yarn-daemon.sh start proxyserver --config $HADOOP_CONF_DIR
在指定的服务器上通过如下命令启动MapReduce JobHistory Server:
$ $HADOOP_PREFIX/sbin/mr-jobhistory-daemon.sh start historyserver --config $HADOOP_CONF_DIR
在指定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
运行一个脚本来停止所有slave上的NodeManager:
$ $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
在指定的服务器上通过如下命令停止MapReduce JobHistory Server:
$ $HADOOP_PREFIX/sbin/mr-jobhistory-daemon.sh stop historyserver --config $HADOOP_CONF_DIR
Hadoop集群一旦启动,通过下面的web-ui界面来检查各个组件的状态:
程序 | Web界面 | 备注 |
---|---|---|
NameNode | http://nn_host:port/ | 默认HTTP port是50070. |
ResourceManager | http://rm_host:port/ | 默认HTTP port是8088. |
MapReduce JobHistory Server | http://jhs_host:port/ | 默认HTTP port是19888. |