Hadoop-2.X较Hadoop-1.X有了很大的变化,比如YARN将JobTracker的两个主要功能资源管理和作业调度监控分开为独立的后台进程,配置文件及参数也有了很大变化,目录结构的调整等。另外在Hadoop-2.X版本中,通常专门指定一台主机为NameNode,另一台主机做为ResourceManager,这两台主机为masters,集群中剩余的主机既做为DataNode也做为NodeManager,为slaves,这也与Hadoop-1.X中不同。
Hadoop-2.X有两种类型的配置文件,一种为只读的默认的配置文件,分别为core-default.xml,hdfs-default.xml,yarn-default.xml 和mapred-default.xml。另一种为不同模块的特定配置文件,分别为etc/hadoop/core-site.xml,etc/hadoop/hdfs-site.xml,etc/hadoop/yarn-site.xml和etc/hadoop/mapred-site.xml。另外还可以通过etc/hadoop/hadoop-env.sh和etc/hadoop/yarn-env.sh对执行环境,如:配置文件存放目录,日志目录,Java堆大小等进行配置管理。下面将从Hadoop守护进程的运行环境和守护进程的配置管理参数两方面学习Hadoop的配置管理。
正如上面提到了可以通过etc/hadoop/hadoop-env.sh和etc/hadoop/yarn-env.sh对Hadoop守护进程的执行环境进行定制。在hadoop-env.sh中至少需要正确设置JAVA_HOME为java的安装目录,否则会出现如下的错误:
[hadoop@hadoopsbin]$ ./start-dfs.sh 14/08/26 10:17:41WARN util.NativeCodeLoader: Unable to load native-hadoop library for yourplatform... using built in-java classes where applicable Startingnamenodes on [localhost] localhost: Error:JAVA_HOME is not set and could not be found. localhost:Error: JAVA_HOME is not set and could not be found. Startingsecondary namenodes [0.0.0.0] 0.0.0.0: Error:JAVA_HOME is not set and could not be found.
在多数情况下应该设置HADOOP_PID_DIR和HADOOP_SECURE_DN_PID_DIR为只能被运行hadoop守护进程的用户写入的目录,默认值为/tmp。
可以通过下表中的环境变量对守护进程进行管理。
守护进程 |
环境变量 |
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}",默认值为:exportHADOOP_NAMENODE_OPTS="-Dhadoop.security.logger=${HADOOP_SECURITY_LOGGER:-INFO,RFAS}-Dhdfs.audit.logger=${HDFS_AUDIT_LOGGER:-INFO,NullAppender}$HADOOP_NAMENODE_OPTS"。
其它几个重要的参数有:守护进程日志目录HADOOP_LOG_DIR / YARN_LOG_DIR,守护进程的最大堆HADOOP_HEAPSIZE / YARN_HEAPSIZE,单位为MB,默认值为1000。如果想为每个守护进程设置不同的堆大小,可以使用下面的参数YARN_RESOURCEMANAGER_HEAPSIZE、YARN_NODEMANAGER_HEAPSIZE、YARN_PROXYSERVER_HEAPSIZE和HADOOP_JOB_HISTORYSERVER_HEAPSIZE分别为ResourceManager、NodeManager、WebAppProxy和Map ReduceJob History Server设置堆大小。
可以通过etc/hadoop/core-site.xml,etc/hadoop/hdfs-site.xml,etc/hadoop/yarn-site.xml和etc/hadoop/mapred-site.xml中的特定参数对守护进程进行配置管理,这些文件除了提供基本的配置参数外,也提供了高级配置功能,下面将介绍常用的配置参数,其它更复杂的参数需要结合实际情况调试优化。
core-site.xml
参数 |
值 |
描述 |
fs.defaultFS |
NameNode 的URI |
hdfs://host:port/,取代了fs.default.name |
io.file.buffer.size |
4096 |
SequenceFiles中用于读写的缓存大小 |
hdfs-site.xml
参数 |
值 |
描述 |
dfs.namenode.name.dir |
NameNode持久存储命名空间和事务日志的本地文件系统目录 |
如果该值为逗号分隔的目录列表,那么名称表将被复制到所有目录中 |
dfs.hosts dfs.hosts.exclude |
允许和排除的DataNode列表 |
如果必要,使用这些文件控制允许和禁止的DataNodes列表 |
dfs.blocksize |
134217728(128M) |
HDFS块大小,默认为128M,可以使用后缀k、m、g、t等指定大小,如128m |
dfs.namenode.handler.count |
10 |
用于处理来自DataNode的RPC的服务线程数 |
dfs.datanode.data.dir |
DataNode存储块的本地文件目录
|
如果该值为逗号分隔的目录列表,数据将会存储在所有目录中,通常位于不同的设备中 |
mapred-site.xml
参数 |
值 |
描述 |
mapreduce.framework.name |
yarn |
执行MapReduce作业的框架,可以为local,classic和yarn,默认为local |
mapreduce.map.memory.mb |
1536 |
Mapper使用的物理内存大小 |
mapreduce.map.java.opts |
-Xmx1024M |
Mapper的子jvm的堆大小 |
mapreduce.reduce.memory.mb |
3072 |
Reducer使用的物理内存 |
mapreduce.reduce.java.opts |
-Xmx2560M |
Reducer的子jvm的堆大小 |
mapreduce.task.io.sort.mb |
100 |
排序文件时使用的缓存大小 |
mapreduce.task.io.sort.factor |
10 |
排序文件时一次合并的流数,决定了打开文件句柄的数量 |
mapreduce.reduce.shuffle. parallelcopies |
5 |
在洗牌时被Reducer运行的并行传输的数量 |
mapreduce.jobhistory.address |
|
MapReduce JobHistory 服务器host:port,默认端口为 10020 |
mapreduce.jobhistory.webapp.address |
|
MapReduce JobHistory 服务器的 Web地址host:port,默认端口为19888 |
mapreduce.jobhistory.intermediate-done-dir |
/tmp/hadoop-yarn/staging /history/done_intermediate |
被MapReduce作业写入的历史文件目录 |
mapreduce.jobhistory.done-dir |
/tmp/hadoop-yarn/staging /history/done |
被MR作业历史服务器管理的存放历史文件的目录 |
由于之前没有接触过yarn-site.xml(Hadoop-1.X中不存在该文件),所以将会结合yarn-default.xml学习yarn-site.xml中管理ResourceManager、NodeManager的参数。首先是对ResourceManager、NodeManager都起作用的参数:
参数 |
值 |
描述 |
yarn.acl.enable |
true /false |
是否启用访问控制列表,默认值为false |
yarn.admin.acl |
Admin ACL |
ACL中可以管理集群的人员。ACL中使用逗号分隔用户,使用空格分隔用户和组,使用逗号分隔组。默认值为*允许所有人,空格表示任何人都没有权限 |
yarn.log-aggregation-enable |
false |
是否启用日志聚合,默认为false |
其次是专门用于ResourceManager的参数:
参数 |
值 |
描述 |
yarn.resourcemanager.address |
host:port |
客户端提交作业的主机和端口号,默认端口为8032。如果设置该参数会覆盖 yarn.resourcemanager.hostname设置的主机名 |
yarn.resourcemanager.scheduler.address |
host:port |
调度器地址。ApplicationMasters通过该地址与调度器会话以取得资源,默认端口8030 |
yarn.resourcemanager.resource-tracker.address |
host:port |
默认端口8031。NodeManager通过该地址与ResourceManager会话 |
yarn.resourcemanager.admin.address |
host:port |
RM管理命令的地址,默认端口为8033 |
yarn.resourcemanager.webapp.address |
host:port |
RM的web接口地址,默认端口为8088 |
yarn.resourcemanager.hostname |
host |
RM主机名,所有yarn.resourcemanager*address 都是用了该值 |
yarn.resourcemanager.scheduler.class |
调度器类名 |
资源调度器的类名,默认为org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler,还可以为 FairScheduler 或者 FifoScheduler |
yarn.scheduler.minimum-allocation-mb |
1024 |
RM中为每个容器请求分配的最小内存,单位为MB。小于该值的请求不会生效并会分配该最小值 |
yarn.scheduler.maximum-allocation-mb |
8192 |
RM中为每个容器请求分配的最大内存,单位为MB。大于该值的求不会生效并分配该最大值 |
yarn.resourcemanager.nodes.include-path yarn.resourcemanager.nodes.exclude-path |
若必要,使用该值指定的文件控制允许和禁止的NodeManagers |
然后是管理NodeManager的参数:
参数 |
值 |
描述 |
yarn.nodemanager.resource.memory-mb |
8192 |
可以分配给容器的物理内存,单位MB |
yarn.nodemanager.vmem-pmem-ratio |
2.1 |
任务使用的虚拟内存乘以该比例可能超过物理内存 |
yarn.nodemanager.local-dirs |
${hadoop.tmp.dir}/nm-local-dir |
用逗号分隔的用于写入中间文件的本地文件系统目录 |
yarn.nodemanager.log-dirs |
${yarn.log.dir}/userlogs |
逗号分隔的存放日志的本地文件系统目录 |
yarn.nodemanager.log.retain-seconds |
10800 |
日志保留的时间,单位秒,只有在日志聚合禁用的情况下该参数才可用 |
yarn.nodemanager.remote-app-log-dir |
/tmp/logs |
当应用程序完成时应用程序日志移动到什么位置,需要设置正确地权限。只有在日志聚合禁用的情况下该参数才可用 |
yarn.nodemanager.remote-app-log-dir-suffix |
logs |
日志将会聚合到${yarn.nodemanager.remote-app-log-dir}/${user}/${该参数} 。只有在日志聚合禁用的情况下该参数才可用 |
yarn.nodemanager.aux-services |
mapreduce_shuffle |
MapReduce程序需要的洗牌服务 |
最后是管理历史服务器的参数:
参数 |
值 |
描述 |
yarn.log-aggregation.retain-seconds |
-1 |
在删除之前保存聚合日志多久。默认值为-1,禁用。 |
yarn.log-aggregation.retain-check-interval-seconds |
-1 |
检查聚合日志的时间间隔,如果该值为0或负数,则该值为十分之一聚合日志保留时间 |