Hadoop Cluster Setup(2.2)
【Installation】
下载hadoop安装文件并在解压在指定路径下,通常把hadoop安装在所有nodes中的相同路径下,便于集群管理。典型的拓扑结构为,集群中一个node为namenode,其他多个节点为datanodes;在mapreduce中,其中一个节点作为ResourceManager,其他多个节点作为NodeManager;其中Namenode和ResourceManager分别为HDFS、YARN(Mapreduce)的master,DataNodes和NodeManager分别为HDFS、YARN的slavers。Namenode和ResourceManager可以部署在不同的节点上(而且通常是),NodeManager节点必须为HDFS集群节点的子集,而且通常不会在NameNode上启用nodemanager。
【Running Hadoop in Non-Secure Mode】
Hadoop中有2种配置文件,其中系统默认配置“core-default.xml”"hdfs-default.xml""yarn-default.xml""mapred-default.xml"为只读,不能修改(除非重新编译打包);在hadoop的安装目录下($HADOOP_HOME/etc/hadoop)下与上述对应的几个文件是可以修改的,例如“core-site.xml”"hdfs-size.xml"等,通常开发者需要修改这些文件来指定相关配置信息。
<> 环境变量
此外,hadoop-env.sh,yarn-env.sh分别为hdfs和yarn的启动脚本,我们也可以在这两个文件中修改配置文件所在的路径。比如修改hadoop-env.sh中“HADOOP_CONF_DIR”,或者在yarn-env.sh中修改“YARN_CONF_DIR”。不过只能修改路径,配置文件的名称不能改变。
对于管理员而言,需要修改hadoop-env.sh和yarn-env.sh,来指定hadoop的各个守护集成的环境参数,其中JAVA_HOME是必须要调整的:
##hadoop-env.sh,yarn-env.sh中指定 export JAVA_HOME=/opt/app/jdk1.6.0_45
大多数情况下,还需要指定HADOOP_PID_DIR/HADOOP_SECURE_DN_PID_DIR,即守护进程启动后PID信息写入的路径。
export HADOOP_PID_DIR=/var/hadoop/pids export HADOOP_SECURE_DN_PID_DIR=${HADOOP_PID_DIR}
因为hadoop是基于JVM,所以我们还需要为它的各个守护进程分配合适的HEAP大小以及GC策略,如下配置仅供参考,hadoop-env.sh:
export HADOOP_HEAPSIZE=1024 export HADOOP_NAMENODE_INIT_HEAPSIZE="512" # default for all,will append to name_node/data_node OPTS export HADOOP_OPTS="$HADOOP_OPTS -Djava.net.preferIPv4Stack=true -XX:MaxPermSize=256M -XX:SurvivorRatio=6 -XX:+UseConcMarkSweepGC -XX:MaxTenuringThreshold=3 -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSCompactAtFullCollection" # Command specific options appended to HADOOP_OPTS when specified export HADOOP_NAMENODE_OPTS="-Dhadoop.security.logger=${HADOOP_SECURITY_LOGGER:-INFO,RFAS} -Dhdfs.audit.logger=${HDFS_AUDIT_LOGGER:-INFO,NullAppender} $HADOOP_NAMENODE_OPTS -Xmx2048M" export HADOOP_DATANODE_OPTS="-Dhadoop.security.logger=ERROR,RFAS $HADOOP_DATANODE_OPTS -Xmx2048M" export HADOOP_SECONDARYNAMENODE_OPTS="-Dhadoop.security.logger=${HADOOP_SECURITY_LOGGER:-INFO,RFAS} -Dhdfs.audit.logger=${HDFS_AUDIT_LOGGER:-INFO,NullAppender} $HADOOP_SECONDARYNAMENODE_OPTS -Xmx2048M"
yarn进程也需要简单的调整JVM相关参数,yarn-env.sh:
# Specify the max Heapsize for the ResourceManager using a numerical value # in the scale of MB. # This value will be overridden by an Xmx setting specified in either YARN_OPTS # and/or YARN_RESOURCEMANAGER_OPTS. export YARN_RESOURCEMANAGER_HEAPSIZE=1024 export YARN_RESOURCEMANAGER_OPTS="" # Specify the max Heapsize for the NodeManager using a numerical value # in the scale of MB. # This value will be overridden by an Xmx setting specified in either YARN_OPTS # and/or YARN_NODEMANAGER_OPTS. export YARN_NODEMANAGER_HEAPSIZE=1024 export YARN_NODEMANAGER_OPTS=""
管理员可以像hadoop-env.sh中那样,为yarn指定JVM OPTS,本例中省略了此值。
JVM环境变量配置项参考表:
进程 | 环境变量 |
NameNode | HADOOP_NAMENODE_OPTS |
DataNode | HADOOP_DATANODE_OPTS |
Secondary NameNode | HADOOP_SECONDARYNAMENODE_OPTS |
ResourceManager | YARN_RESOURCEMANAGER_OPTS |
NodeManager | YARN_NODEMANAGER_OPTS |
Mapreduce Job History Server | HADOOP_JOB_HISTORYSERVER_OPTS |
JVM Heap大小配置所对应的环境变量:
进程 | 环境变量 |
ResourceManager | YARN_RESOURCEMANAGER_HEAPSIZE |
NodeManager | YARN_NODEMANAGER_HEAPSIZE |
NameNode/DataNode | HADOOP_HEAPSIZE(默认为1G) |
MapReduce Job History Server | HADOOP_JOB_HISTORYSERVER_HEAPSIZE |
上述环境变量分别在hadoop-env.sh和yarn-env.sh中配置。
此外还有一个很重要的参数,就是日志文件的路径,通常我们需要修改“HADOOP_LOG_DIR”、“YARN_LOG_DIR”两个参数的值。
<>重要参数配置
1. core-site.xml(Hadoop-Common组件)
参数 | 参考值 | 描述 |
fs.defaultFS | NameNode URI | hdfs://host:port/ 原”fs.default.name” |
file.blocksize | 134217728 | HDFS Block文件大小,默认为64M 建议为128或者更大。 将由“dfs.blocksize”覆盖 |
hadoop.tmp.dir | /var/hadoop/tmp | 临时文件路径 |
file.replication | 1 | bloick的备份个数 事实上此参数不会产生效果,将有 hdfs-site.xml中的“dfs.replication”覆盖 |
hadoop.security.authorization | false | 是否启用授权验证 |
io.file.buffer.size | 131072 | hdfs文件读写缓冲区大小 |
io.compression.codecs | <空> | 文件采用的压缩算法 |
2. hdfs-site.xml(HDFS组件)
参数 | 参考值 | 备注 |
dfs.replication | 3 | hdfs block备份个数,默认为3 |
dfs.blocksize | 128m | block大小,可以使用“m”“g”等字母 后缀表示单位 |
dfs.client.block.write.retries | 3 | 当写入失败时,最多重试次数 |
dfs.heartbeat.interval | 3 | datanode与namenode的心跳时间间隔,单位:秒 |
dfs.namenode.replication.interval | 3 | namenode检测数据备份情况的时间间隔,单位:秒 |
dfs.namenode.handler.count | 32 | namenode并发处理请求的线程数, 默认为10 |
dfs.namenode.name.dir | /data/hadoop/dfs/name | namenode存储namespace信息的 本地路径 |
dfs.datanode.data.dir | /data/hadoop/dfs/data | datanode存储实际数据block的文件路径 |
dfs.namenode.checkpoint.dir | /data/hadoop/dfs/namesecondary | SecondaryNamode/Checkpoint Node 保存checkpoint信息的路径 |
dfs.permissions.enabled | false | 默认为true,文件读写时,是否检测权限。 |
dfs.datanode.address | 0.0.0.0:50010 | datanode启动的端口号 |
dfs.namenode.hosts / dfs.namenode.hosts.exclude |
<空> | 在namenode上生效,用来设定允许通讯 的datanode列表 |
dfs.namenode.logging.level | info | namenode上日志级别 |
3. yarn-site.xml(YARN组件)
参数 | 参考值 | 备注 |
yarn.acl.enable | false | 是否开启yarn资源控制 |
yarn.log-aggregation-enable | false | 是否开启log的聚合功能 |
参数 | 参考值 | 备注 |
yarn.resourcemanager.address | rm-host:8032 | resourceManager的通讯地址 host:port |
yarn.resourcemanager.scheduler.address | rm-host:8030 | resourceManager上用来 与ApplicationMasters 通讯的地址, host必须为resourceManager地址 |
yarn.resourcemanager.resource-tracker.address | rm-host:8031 | |
yarn.resourcemanager.webapp.address | rm-host:8088 | resourcemanager web页面 |
yarn.resourcemanager.scheduler.class | 资源调度器,class类全名,必须为ResourceScheduler子类 默认为org.apache.hadoop.yarn.server. resourcemanager.scheduler.capacity.CapacityScheduler 其他可选:FairScheduler,FifoScheduler |
|
yarn.scheduler.minimum-allocation-mb | 1024 | ResourceManager可为资源请求者分配Container的最小内存量,单位Mb,默认1024 如果任务较小可以适度减少此值,一般为512 |
yarn.scheduler.maximum-allocation-mb | 8192 | ResourceManager允许请求分配Container的最大内存量,单位mb,默认为8192, 如果任务较小或者物理内存较少, 可以减少此值,一般为2048 |
yarn.resourcemanager.nodes.include-path / yarn.resourcemanager.nodes.exclude-path |
<空> | ResourceManager允许(不允许)获取资源的nodemanager列表 此处为本地路径的一个文件,文件每行一个nodemanager的host地址 |
参数 | 参考值 | 备注 |
yarn.nodemanager.resource.memory-mb | 4096 | 当前nodemanager可供Containers使用的总物理内存量。 此值不能大于platform下可供JVM使用的最大内存。 |
yarn.nodemanager.vmem-pmem-ratio | 2.1 | 默认值为2.1,当container使用内存超过其分配的内存时, 可已使用虚拟内存为其物理内存的比例。swap! |
yarn.nodemanager.local-dirs | /data/hadoop/yarn/local | nodemanager产生临时数据的保存地址。 |
yarn.nodemanager.log-dirs | /data/hadoop/yarn/logs | 日志保存地址,默认为/logs |
yarn.nodemanager.log.retain-seconds | 10800 | 当log-aggregation关闭时,nodemanager保存用户日志的时长, 单位:秒。 |
yarn.nodemanager.aux-services | mapreduce_shuffle | mappreduce使用的shuffle服务,目前只能为此值 |
yarn.application.classpath | 建议保持默认,yarn框架依赖的classpath,如果开发者额外的调整 框架的服务,在默认值的基础上,增加jar路径。 |
4. mapred.xml(mapreduce组件)
参数 | 参考值 | 备注 |
mapreduce.framework.name | yarn local |
mapreduce使用的框架名称,可选“yarn”或者“local” 对于hadoop 2.2+,必须使用yarn。 |
mapreduce.map.memory.mb | 1024 | map任务所能使用的最大内存量 |
mapreduce.map.java.opts mapreduce.reduce.java.opts |
-Xms1024m | JVM进程参数 |
mapreduce.reduce,memory.mb | 2048 | reduce任务进程所能消耗的最大内存量, reduce涉及到大量排序和key分组,建议内存 设置比map稍大 |
mapreduce.task.io.sort.mb | 512 | map、reduce在排序时使用内存缓冲区的大小 越大排序效率越高,建议256,默认为100,单位:mb |
mapreduce.task.io.sort.factor | 100 | 在排序时,“merge”阶段,每次最大规约的文件个数 |
mapreduce.reduce.shuffle.parallelcopies | 12 | reduce进程在shuffle阶段,并发copy远程文件的 并发数。此值越大copy效率越高,性能消耗越大。 |
mapreduce.cluster.local.dir | mapreduce保存数据的本地路径 | |
mapreduce.job.maps | 2 | 每个job默认map的个数 在yarn框架下,可能无效。 在新mapreduce api下无效 |
mapreduce.job.reduces | 1 | 每个job默认reduce的个数 在yarn框架下,可能无效。 |
mapreduce.task.timeout | 30000 | task未响应时间超过此值,将会被kill |
mapreduce.map.maxattempts | 3 | map任务在失败时最大重试的次数 |
mapreduce.reduce.maxattemts | 3 | |
mapreduce.jobtracker.restart.recover | false | yarn下可能无效 |
mapreduce.job.ubertask.enable | false | 默认为false,是否开启“ubertask”, 此后小的job将会依次在同一个JVM中运行。 |
mapreduce.job.ubertask.maxmaps | 4 | 如果job中map的个数小于此值,那么次job将 被认为是“ubertask” |
mapreduce.job.ubertask.maxreduces | 1 | 同上 |
mapreduce.job.ubertask.maxbytes | 如果job的输入文件大小小于此值,此job将 被认为是“ubertask”,默认为dfs.blocksize |
|
mapreduce.map.output.compress | false | map的输出结果是否启动压缩 可以在job jar中配置。 |
yarn.app.mapreduce.am.resource.mb | 1024 | applicationMaster进程需要占用的内存。 |
mapreduce新api中所有的参数均已"mapreduce."开头,基于yarn框架时以“yarn.”开头的参数被支持,在yarn下,部分mapreduce参数将不能发挥效果。
5. slaves
在ect/hadoop目录下,有个slaves文件,这个文件中, 保存所有的DataNodes或者NodeManagers节点的地址,此文件可以帮助hadoop master轮流启动整个集群。NameNode的地址可以在hdfs-site.xml配置,ResourceManager的地址可以在yarn-site.xml中配置,如果你希望NameNode节点上也可以启动DataNode进程,也可以在slaves文件中配置;通常在集群中,除了Namenode和ResourceManager之外的其他所有节点,都应该配置在slaves文件中。
此外,master文件已经不再需要,其中secondaryNameNode、backup Node的位置,可以在hdfs-site.xml中配置。
【Hadoop Rack Awareness】
HDFS和yarn组件都是Rack-aware的。[机架感知]
NameNode和ResourceManager通过管理员配置的“Resolve API”获取slaves节点的rack信息,API将DNS Name解析成相应的Rack id标识。
可以通过core-site.xml中的"net.topology.node.switch.mapping.impl"和“net.topology.script.file.name”两个配置项来实现Rack Id的解析。其中"net.topology.script.file.name"用来指定“解析DNS Name”的脚本名称,一般为.sh文件,通常放置在etc/hadoop目录下,这个脚本的作用,就是接收一个序列的DNS参数列表,并按照顺序返回对应的Rack ID名称。"net.topology.node.switch.mapping.impl"默认值为"org.apache.hadoop.net.ScriptBasedMapping",将使用上述指定的脚本来解析Rack,如果没有配置脚本文件,那么所有的节点的rack Id为“/default-rack”。
此外开发者可以根据时机情况来自定义“net.topology.node.switch.mapping.impl”的实现,通常继承“AbstractDNSToSwitchMapping”类即可。
【Logging】
Hadoop使用apache log4j作为日志输出框架,开发者可以通过修改etc/hadoop/log4j.properties文件来调整相关日志参数,对于mapreduce/cascading等第三方日志输出,也可以(而且是必须)修改此log4j.properties文件以增加相关的日志输出控制。例如我们希望在自己的mapreduce程序中输出日志:
##customer mapreduce log log4j.appender.STATISTIC=org.apache.log4j.DailyRollingFileAppender log4j.appender.STATISTIC.File=/data/logs/statistic/mapred-all.log log4j.appender.STATISTIC.DatePattern=.yyyy-MM-dd log4j.appender.STATISTIC.layout=org.apache.log4j.PatternLayout log4j.appender.STATISTIC.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} %5p %c{1} [%L]-%m%n ##所有的com.thirdpart.statistic.mapred包下的日志全部输出 log4j.logger.com.thirdpart.statistic.mapred=INFO,STATISTIC
【分布式操作】
当一台机器的所有配置文件调整完毕后,需要把配置文件同步到所有节点上,即确保集群中所有的机器上配置文件一致,不过slaves文件可以只在NameNode、SecondaryNameNode、ResourceManager上。
“rsync”辅助工具可以帮我们做到这些,如果没有安装rsync,可以首先安装和配置rsync同步server列表。
因为hadoop会使用ssh做无密码登录,所以进群中所有的节点必须安装ssh套件,以及配置相关的授权信息。
1) 集群配置完成后,首先在NameNode上,进入bin目录下,运行"./hdfs namenode -format";此命令为“格式化”命令,将会为进群生成cluster相关的约束性信息。
2) 启动hdfs集群:进入sbin目录,执行“start-dfs.sh”。此命令还可以指定hadoop的相关配置文件路径。关闭dfs可以使用"stop-dfs.sh"。
3) 如果集群需要运行yarn集群或者mapreduce框架(包括cascading、hive、spark等),则需要通过“start-yarn.sh”启动yarn进程。可以通过“stop-yarn.sh”来关闭yarn进程。