Hadoop 集群安装

May 2, 2016


安装简介

Hadoop集群的安装, 实际上就是解压软件到所有的机器或者通过包管理系统安装到所有的机器, 然后开始配置每个机器的职责.

集群上的机器可以分为两种类型: master(主), slave(从)

  • master: NameNode, ResourceManager
  • slave: DataNode, NodeManager

除此之外还有一些服务: Web App Proxy Server, MapReduce Job History, 这些都是用专门的机器来提供服务.

一般情况下, NameNode和ResourceManager属于不同的机器, DataNode和NodeManager由同一机器负责.

配置非安全模式的Hadoop

Hadoop的Java配置文件主要有两种类型: 只读配置文件, 地点配置文件

  • 只读配置文件:

      core-default.xml
      hdfs-default.xml
      yarn-default.xml
      mapred-default.xml
    
  • 地点配置文件

      core-site.xml
      hdfs-site.xml
      yarn-site.xml
      mapred-site.xml
    
  • Hadoop脚本文件:

      hadoop-env.sh
      yarn-env.sh
      mapred-env.sh
    

接下来看一下这些配置文件的详细设置参数:

Daemons环境变量设置

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_PID_DIR daemons进程id文件存储位置
HADOOP_LOG_DIR daemons日志文件存粗位置
HADOOP_HEAPSIZE / YARN_HEAPSIZE 最大的堆大小

大多数情况下都应该指定HADOOP_PID_DIRHADOOP_LOG_DIR这两个位置, 这样才能保证文件由对应的daemon进程去修改. 否则可能会出现符号链接攻击.

传统地, 人们经常配置HADOOP_PREFIX环境变量, 这个环境变量用于shell环境, 例如在/etc/profile.d脚本文件中加入下面的命令:

HADOOP_PREFIX=/path/to/hadoop
export HADOOP_PREFIX

至于堆大小的环境变量如下表所示:

Daemon进程 堆大小环境变量
ResourceManager YARN_RESOURCEMANAGER_HEAPSIZE
NodeManager YARN_NODEMANAGER_HEAPSIZE
WebAppProxy YARN_PROXYSERVER_HEAPSIZE
Map Reduce Job History Server HADOOP_JOB_HISTORYSERVER_HEAPSIZE

Daemons设置

  • core-site.xml

    参数 取值 说明
    fs.defaultFS NameNode URI地址 hdfs://host:port/
    io.file.buffer.size 131072 SequenceFiles读写缓冲区大小
  • hdfs-site.xml

    针对NameNode:

    参数 取值 说明
    dfs.namenode.name.dir 本地文件系统上, NameNode保存namespace和transactions logs的目录 如果这是一个逗号分割的目录集合, 那么这些目录都会保存
    dfs.hosts / dfs.hosts.exclude 允许/排除的DataNode集合 控制管理DataNode
    dfs.blocksize 268435456 HDFS blocksize(256M)
    dfs.namenode.handler.count 100 管理RPC的线程数, 这些RPC对象是DataNode

    针对DataNode:

    参数 取值 说明
    dfs.datanode.data.dir DataNode节点在本地文件系统保存block的目录 如果这是一个逗号分割的目录集合, 那么这些目录都会保存
  • yarn-site.xml

    针对ResourceManager和NodeManager:

    参数 取值 说明
    yarn.acl.enable true / false 允许ACLs? 默认值是false.
    yarn.admin.acl Admin ACL 集群的管理权限ACL. 默认值是*, 表示所有人. ‘ ‘表示没有一个人
    yarn.log-aggregation-enable false 日志整合开关

    针对ResourceManager:

    参数 取值 说明
    yarn.resourcemanager.address ResourceManager host:port 客户提交job的地址. 如果设置则覆盖yarn.resourcemanager.hostname
    yarn.resourcemanager.scheduler.address ResourceManager host:port ApplicationMasters向Scheduler获取资源的地址. 如果设置则覆盖yarn.resourcemanager.hostname
    yarn.resourcemanager.resource-tracker.address ResourceManager host:port 供NodeManagers访问的地址. 如果设置则覆盖yarn.resourcemanager.hostname
    yarn.resourcemanager.admin.address ResourceManager host:port 供管理员命令访问的地址. 如果设置则覆盖yarn.resourcemanager.hostname
    yarn.resourcemanager.webapp.address ResourceManager host:port. 供web-ui访问的地址. 如果设置则覆盖yarn.resourcemanager.hostname
    yarn.resourcemanager.hostname ResourceManager host 设置hostname全局变量, 如果其他setting指明则被覆盖掉
    yarn.resourcemanager.scheduler.class ResourceManager Scheduler class CapacityScheduler (推荐), FairScheduler (推荐), 或者FifoScheduler
    yarn.scheduler.minimum-allocation-mb integer container request的内存分配下限(MB为单位)
    yarn.scheduler.maximum-allocation-mb integer container request的内存分配上限(MB为单位)
    yarn.resourcemanager.nodes.include-path / yarn.resourcemanager.nodes.exclude-path 允许/排除的NodeManagers集合 控制管理NodeManagers

    针对NodeManager:

    参数 取值 说明
    yarn.nodemanager.resource.memory-mb integer 内存容量使用限制
    yarn.nodemanager.vmem-pmem-ratio integer 虚拟内存使用限制, 可以比物理内存多使用的比率
    yarn.nodemanager.local-dirs 中间结果保存的目录集合 如果这是一个逗号分割的目录集合, 那么这些目录都会保存
    yarn.nodemanager.log-dirs 日志文件保存的目录集合 如果这是一个逗号分割的目录集合, 那么这些目录都会保存
    yarn.nodemanager.log.retain-seconds 10800 日志文件默认保存时间(秒). 日志整合开关是关闭状态才有效
    yarn.nodemanager.remote-app-log-dir /logs 应用日志文件保存目录. 需要适当的权限. 日志整合开关是开启状态才有效
    yarn.nodemanager.remote-app-log-dir-suffix logs 应用日志文件后缀. 格式是${yarn.nodemanager.remote-app-log-dir}/${user}/${thisParam}. 日志整合开关是开启状态才有效
    yarn.nodemanager.aux-services mapreduce_shuffle MapReduce应用的Shuffle service

    针对History Server:

    参数 取值 说明
    yarn.log-aggregation.retain-seconds -1 整合日志的保存时间. -1表示无效参数. 如果设置太小会导致大量信息发送给NameNode
    yarn.log-aggregation.retain-check-interval-seconds -1 检查整合日志的保存时间. 0或者-1表示整合日志保存时间的1/10. 如果设置太小会导致大量信息发送给NameNode
  • mapred-site.xml

    针对MapReduce应用:

    参数 取值 说明
    mapreduce.framework.name 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 并发复制的附加数量

    针对MapReduce JobHistory Server:

    参数 取值 说明
    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 /mr-history/tmp MapReduce jobs的历史文件保存目录
    mapreduce.jobhistory.done-dir /mr-history/done MR JobHistory Server合并的历史文件目录

NodeManagers健康状况管理

NodeManager的健康状况管理是通过脚本的方式来监听的, 一旦变成不健康状况, 监听脚本就会向标准输出ERROR信息, 而监听标准输出的脚本一旦检测到ERROR信息, 就会向ResourceManager报告从而使得NodeManager变为不健康状况, 被列入黑名单之中.

在这之后监听脚本还是继续运行, 如果NodeManager恢复为健康状况, 那么会自动地从ResourceManager的黑名单中排除.

NodeManager的健康状况是可以通过web ui进行查看的.

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.script.interval-ms Node health script interval 监听脚本运行时间间隔
yarn.nodemanager.health-checker.script.timeout-ms Node health script timeout interval 监听脚本超时时间

出现少量磁盘错误是不会导致ERROR信息产生的, 只有达到阀值yarn.nodemanager.disk-health-checker.min-healthy-disks才会触发ERROR信息产生

slave文件

Hadoop支持对集群上多个机器的不同文件同时进行操作, 这些文件访问路径要写在etc/hadoop/slaves文件中, 然后通过辅助脚本进行执行操作.

为了支持这个机制, hadoop运行账户的ssh信任必须建立.

Hadoop Rack识别

很多hadoop组件都能够进行rack识别, 因此可以充分利用网络拓扑结构, 从而提升性能和安全.

hadoop daemon是通过调用管理员配置模块进行rack信息的收集. 有关rack识别请参考这里

一般情况下都推荐开启这个机制.

日志记录

hadoop的日志机制是借助Apache Commons Logging框架的apache log4j进行的. 通过配置etc/hadoop/log4j.properties来自定义我们hadoop daemon日志配置.

Hadoop集群操作

一旦所有的配置都完成了, 那么就把配置文件分发给集群上所有机器的HADOOP_CONF_DIR目录. 这样才能统一集群机器的配置, 但是要保证所有机器的HADOOP_CONF_DIR都是一样的.

通常情况下, 我们需要有两个管理用户, 一个hdfs用户管理HDFS相关操作, 另一个yarn用户管理YARN相关操作

下面介绍集群的开启操作和关闭操作:

  • hadoop集群开启操作

开启hadoop集群需要两个步骤: 开启HDFS集群, 开启YARN集群, 开启MapReduce JobHistory服务器[可选]

开启HDFS集群:

  1. 开启HDFS, 需要格式化

     [hdfs]$ $HADOOP_PREFIX/bin/hdfs namenode -format <cluster_name>
    
  2. 开启HDFS NameNode

     [hdfs]$ $HADOOP_PREFIX/sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script hdfs start namenode
    
  3. 开启所有HDFS DataNode

     [hdfs]$ $HADOOP_PREFIX/sbin/hadoop-daemons.sh --config $HADOOP_CONF_DIR --script hdfs start datanode
    

如果slave文件机制开启了且hdfs账户也通过了ssh信任, 那么可以使用脚本来执行上面的步骤:

[hdfs]$ $HADOOP_PREFIX/sbin/start-dfs.sh

开启YARN集群:

  1. 开启ResourceManager

     [yarn]$ $HADOOP_YARN_HOME/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR start resourcemanager
    
  2. 开启所有NodeManager

     [yarn]$ $HADOOP_YARN_HOME/sbin/yarn-daemons.sh --config $HADOOP_CONF_DIR start nodemanager
    
  3. 开启WebAppProxy服务器

     [yarn]$ $HADOOP_YARN_HOME/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR start proxyserver
    

同样, 如果slave文件机制开启了且yarn账户也通过了ssh信任, 那么可以使用脚本来执行上面的步骤:

[yarn]$ $HADOOP_PREFIX/sbin/start-yarn.sh

开启MapReduce JobHistory服务器:

[mapred]$ $HADOOP_PREFIX/sbin/mr-jobhistory-daemon.sh --config $HADOOP_CONF_DIR start historyserver
  • hadoop集群关闭操作

关闭HDFS集群:

  1. 关闭NameNode

     [hdfs]$ $HADOOP_PREFIX/sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script hdfs stop namenode
    
  2. 关闭所有的DataNode

     [hdfs]$ $HADOOP_PREFIX/sbin/hadoop-daemons.sh --config $HADOOP_CONF_DIR --script hdfs stop datanode
    

如果slave文件机制开启了且hdfs账户也通过了ssh信任, 那么可以使用脚本来执行上面的步骤:

[hdfs]$ $HADOOP_PREFIX/sbin/stop-dfs.sh

关闭YARN集群:

  1. 关闭ResourceManager

     [yarn]$ $HADOOP_YARN_HOME/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR stop resourcemanager
    
  2. 关闭所有的NodeManager

     [yarn]$ $HADOOP_YARN_HOME/sbin/yarn-daemons.sh --config $HADOOP_CONF_DIR stop nodemanager
    
  3. 关闭WebAppProxy服务器

     [yarn]$ $HADOOP_YARN_HOME/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR stop proxyserver
    

同样, 如果slave文件机制开启了且yarn账户也通过了ssh信任, 那么可以使用脚本来执行上面的步骤:

[yarn]$ $HADOOP_PREFIX/sbin/stop-yarn.sh

关闭MapReduce JobHistory服务器:

[mapred]$ $HADOOP_PREFIX/sbin/mr-jobhistory-daemon.sh --config $HADOOP_CONF_DIR stop historyserver

Web管理接口

daemon进程 Web接口 说明
NameNode http://nn_host:port/ 默认HTTP端口是50070
ResourceManager http://rm_host:port/ 默认HTTP端口是8088
MapReduce JobHistory Server http://jhs_host:port/ 默认HTTP端口是19888

上一篇博客:Minimum Size Subarray Sum
下一篇博客:Hadoop RPC 原理与实例