l  Hadoop的配置文件

1.      Hadoop-site.xml, *-default.xml,*-site.xml,

2.      Core-default.xml: 默认的核心hadoop属性文件。该配置文件位于下面JAR文件中:Hadoop-common-2.2.0.jar

3.      Hdfs-default.xml : 默认的HDFS属性配置文件,文件位于下面的JAR文件中:hadoop-hdfs-2.2.0.jar

4.      Mapred-default.xml : 默认mapreduce属性配置文件,位于mapreduce-client-core-2.2.0.jar

5.      Yarn-default.xml: 默认的YARN属性配置文件,位于yarn-common-2.2.0.jar

 

l  Hadoop集群特定配置文件

1.      core-site.xml :特定通用hadoop属性配置文件,该配置文件的配置项会覆盖core-default.xml中的相同配置项

2.      hdfs-site.xml: 配置文件的配置项会覆盖hdfs-default.xml中的相同配置项.

3.      Mapred-site.xml: 配置文件的配置项会覆盖mapred-default.xml的相同配置.

4.      Yarn.xml:配置文件的配置项会覆盖yarn-default.xml的相同配置.

 

l  配置hadoop守护进程

1.      可以使用下面的脚本文件进行配置hadoop集群:

Hadoop-env.sh, yarn-env.sh, mapred.env.sh, 这些脚本文件负责设置java主目录,不同的日志文件位置,用于各种守护进程JVM等属性

 

2.      守护进程配置变量

名称节点: HADOOP_NAMENODE_OPTS

数据节点: HADOOP_DATANODE_OPTS

辅助名称节点: HADOOP_SECONDARYNAMENODE_OPTS

资源管理器: YARN_RESOURCEMANAGER_OPTS

节点管理器: YARN_NODEMANAGER_OPTS

 

比如配置名称节点使用parallelGC,下面的命令行应该添加到hadoop-env.sh

Export HADOOP_NAMENODE_OPTS = “-XX:+UseParallelGC${HADOOP+NAME_OPTS}”

 

其它可供配置的一些有用的配置项

1.      YARN_LOG_DIR:计算节点上存放日志文件的目录位置,如果这些目录不存在,在集群启动的时候会被自动创建.

2.      YARN_HEAPSIZE:指定堆的大小,单位MB.其默认值1000,意味着hadoop集群默认为每个守护进程分配1G大小的堆空间.如果想为每个服务配置不同的堆大小,需要给以下两个变量分别赋值:YARN_RESORCEMANAGER_HEAPSIZE,YARN_NODEMANAGER_HEAPSIZE

 

 

l  Hadoop配置文件的优先级

Hadoop以以下次序应用到 系统中

1.      MapReduce任务初始化的时候,由JobConf or Job对象指定的值

2.      客户端节点的*_site.xml

3.      从节点的*_site.xml

4.      *-default.xml文件中的默认值,这个文件是集群中的所有节点都相同

   如果有些属性的设置是不想被客户端or程序修改的,需要把这些属性标记为final.

<property>
                     <name>{PROPETY_NAME}</name>
                     <value>{PROPETY_VALUE}</value>
       <final>true</final>
 </property>

   这样客户端上的*-site.xml配置文件不能修改这个属性

 

l  Core-site.xml

Core-site.xml关键属性

1.  Hadoop-tmp-dir:其它所有临时目录的根目录,其default值/tmp/Hadoop-${user.name}.在hdfs-site.xml文件中有几个属性,其配置值都是路径名,它们的根目录就是在hadoop-tmp-dir中配置。

2.  fs.defaultFs:在没有特殊配置的情况下,HDFS客户端使用的默认路径前缀由该属性配置。如hdfs://localhost:9000中的名称节点指定的名称和端口

3.  io.file.buffer-size:指定了文件流的缓冲大小,决定了数据读取和写入操作过程缓冲多少数据,default为4096.

4.  io.bytes.per.checksum:在写入时会计算校验和,并在读取数据时进行校验,default值:512 字节.

5.  io.compression.codes:这个参数值是一个由逗号分隔的可用压缩编码类的列表,这些类会用来压缩/解压数据,

 

l  hdfs-*.xml

1.dfs.namenode.name.dir:名称节点本地文件系统中存放元数据文件表(fsimage文件)的目录。属性default值: file://${hadoop.tmp.dir}/dfs/name. Hadoop.tmp.dir的属性值会在core-site.xml指定,如果core-site没有指定,就在core-default.xml中指定

2.dfs.namenode.edit.dir:名称节点本地文件系统中存储元数据事务处理(metadata

transaction)文件(edits文件)的目录。如果该属性值是一个逗号分隔的目录列表,该事务

处理文件会被copy到所有目录中,default值与dfs.namenode.name.dir相同

3.      dfs.namecode.checkpoint.dir:决定了辅助名称节点中存放临时fsimage文件的目录。

Default值:file://${Hadoop.tmp.dir}/dfs/namesecondary

4.      dfs.namenode.checkpoint.edits.dir:存放从名称节点edits的目录, default值与dfs.namenode.checkpoint.dir相同

5.      dfs.namenode.checkpoint.period:两个检查点之间的间隔秒数,设定后,检查点操作就开始执行,合并edits 和fsimage.

6.      dfs.blocksize:指定新文件的默认数据块大小,单位是字节,default值:128M, 注意:这个参数不是系统全局参数,可以针对单个文件指定.

7.      dfs.replication:默认的数据块备份量,default值:3

8.      dfs.namenode.handler.count:这个决定了名称节点与数据节点通信的服务器线程数,default为10,但推荐其值为集群节点数量的10%,最小值为10.

9.      dfs.datanode.du.reserved:为每卷磁盘中的保留存储空间(字节),这个空间保留供非HDFS使用,default为0,但建议其值为10G和整理空间大小的25%两者之间的较小值.

10.  dfs.host:这个属性指定了指向一个文件的完整路径名,指向的文件包含了一个允许与名称节点通信的主机列表,如果没有设置这属性,集群中的所有节点都允许与名称节点通信.

 

l  Mapred-site.xml

MR v2中作业跟踪器的功能被划分为四个不同的服务:

1.      资源管理器(ResourceManager),这是一个YARN服务,它接收请求且启动程序管理器(Application Master)实例。

2.      一个可拔插的调度器组件,其作用是给即将运行的进程分配资源。它不监视or跟踪进程使用的资源。

3.      资源管理器启动应用程序管理器,应用程序管理器来管理MapReduce程序.

4.      原先作业跟踪器负责收集已完成作业的信息,现这任务交给了历史作业server(Job History Server)

 

l  Maperd-site.xml关键属性:

1.      Mapreduce.framework.name:决定mapreduce作业是提交到 YARN集群还是使用本地作业执行器本地执行。这属性合法值方yarn or local。

2.      Mapred.child.java.opts:运行map or reduce任务的JVM堆大小,default值:-Xmx200m,根据需求建议设备更高一些的数值,比如500M or 1G, 设置的值应该小于或等于mapreduce.map.memory.mb和mapreduce.reduce.memory.mb中设置值。

Map and Reduce任务按照mapred.child.opts属性设定的JVM堆大小在容器中执行。

如果mapred.child.opts属性值大于mapreduce.*.memory.mb属性值,任务会失败.

3.      Mapreduce.map.memory.mb:设定分配运行Map任务的容器的内存大小,default:1024M。

4.      Mapreduce.reduce.memory.mb:设定分配运行reduce任务的容器内存大小,default:1024M

5.      Mapreduce.cluster.local.dir:mapreduce存储中间数据文件的本地目录。它可以是逗号分隔的存在不同设备的目录的列表,这样可以提高磁盘I/O.默认值是${Hadoop.tmp.dir}/mapred/local,这与value dfs.du.reserved属性值(core-site.xml)相关。一般建议设置不超过75%的硬盘空间来存放HDFS数据,25%硬盘空间用于存放中间数据文件.

6.      Mapreduce.jobtracker.handler.count:作业跟踪器(相当于yarn)的server进程数量,该属性值应大约为集群中从节点数量的4%,其最小值为10, default值:10

7.      Mapreduce.job.reduce.slowstart.completedmaps:在作业中高度reducer之前,作业中map完成百分比,默认:0.05, 但值建议是0.5到0.8之间。

8.      Mapreduce.jobtracker.taskscheduler:该类负责任务的高度,其默认值为FIFO高度策略,其属性值为org.apache.hadoop.mapred.JobQueueTaskScheduler.但我们推荐设置公平高度器(Fair Scheduler) or 计算能力调度器(CapacityScheduler)

9.      Mapreduce.map.maxattempts:每个map任务重试的最大次数,默认为4.

10.  Mapreduce.reduce.maxattempts:每个reduce任务重试的最大次数,默认为4.

 

l  Yarn-site.xml

1.      Yarn.resourcemanager.hostname:资源管理器所在节点的主机名

2.      Yarn.resourcemanager.address:运行资源管理器服务的主机名及其端口号,其默认值 :http://${yarn.resourcemanager.hostname}:8032

3.      Yarn.nodemanager.local-dirs:一个逗号分隔的本地文件目录表。节点管理器初始化而生成的容器,在容器运行过程中存储文件的目录,此类文件通常是附加配置文件,通过分布缓存分发每个计算节点的作业运行需要的数据文件函数库,当程序运行结束时,这些文件都会被删除。

4.      Yarn.nodemanager.aux-services:一个逗号分隔的辅助服务列表,这些服务由节点管理器执行。该属性默认为空。

5.      Yarn.nodemanager.resource.memory-mb:可分配给容器的物理内存总和,这些容器是由在节点上运行的节点管理器来初始化,其default:8192。

6.      Yarn.nodemanager.vmem-pmem-ratio:配置容器在内存限制时,virtual内存与物理内存的比值。如果yarn.scheduler.maximum属性设置为其默认值8192, 比值设定2.1,这样每个容器允许使用的virtual内存上限为8G*2.1=16.2G,如果超过这一比例,yarn框架会启动容器失败.

7.      Yarn.scheudler.minimum-allocation-mb:启动每个容器,需要向资源管理器申请的最小内存量,单位是MB.低于这个配置值的内存请求会被忽略,且按照该设定值来请求内存使用量,default值为1024.

8.      Yarn.scheudler.maximum-allocation-mb:启动每个容器,需要向资源管理器申请的最大内存量,单位是MB,高于这个配置值的内存请求会按照该配置值来请求内存量,其默认值为8192.

9.      Yarn.scheduler.minimum-allocation-vcores:启动每个容器,需要向资源管理器申请的最小virtual cpu内核数。低于该配置值的请求不会生效,且会按照该设定值来分配,default值:1

10.  Yarn.scheduler.maximum-allocation-vcores:启动每个容器,需要向资源管理器申请的最大virtual cpu 内核数,default值:32

 

l  YARN中的内存分配

1.      Hadoop默认给每个hadoop守护进程分配1G内存,每个节点上的节点管理器和数据节点进程分别占用1G. 属性yarn.nodemanager.resource.memory-mb,默认值8192M.在集群中的从节点中成功启动hadoop容器,必须确保至少8192+2000M.

2.      当应用运行map or reduce, 资源管理器向节点管理器发出请求,启动一个容器,该容器占用内存的大小由属性mapreduce.map.memory.mb( or mapreduce.reduce.memory.mb)指定。在已启动了容器的节点上,这样可以大量减小可用内存的占用,以便启动更多容器。在YARN启动所有容器所占用的内存量总和(MB),由属性yarn.nodemanager.resource.memory-mb决定 。

3.      如一个36G RAM Server, 其中24G被YARN容器占用,8G用于其它,yarn.nodemanager.resource.memory-mb设备24576,如属性mapreduce.map.memory.mb设置2G,这样启动一个运行map任务的容器之后,该节点上用于启动其它容器所能使用的可用内存从24G低为22G

4.      当节点容器启动一个容器后,该容器会启动一个JVM运行MAP or Reduce任务,其堆大小由参数mapred.child.java.opts决定。需要注意的是,父进程拥有的内存量应该大于JVM.

 

l  调度器

之前版本使用FIFO调度器,随后hadoop系统使用了工作优先级的机制,可以为每个作业设置mapred.job.priority属性,下列值之一:

VERY_HIGH, HIGH, NORMAL, LOW, VERY_LOW

Mapred.job.priority属性一定程度上解决作业高度的问题,但由于不支持作业抢占机制,随后Hadoop采用公平高度器和计算能力高度器

 

l  计算能力调度器

计算能力调度器通过如下配置来实现对多租户的支持:

1.      按照企业组来配置分配集群资源

2.      配置资源限制,以避免部份大型应用程序独占集群资源

3.      针对企业组的不同用户配置资源和访问控制

其属性文件在$HADOOP_CONF_DIR/yarn-site.xml

属性:yarn.resourcemanager.scheduler.class

属性值:org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler

 

计算能力调度器有自己的配置文件,文件位置:$HADOOP_CONF_DIR/capacity-scheduler.xml

 

n  配置确保企业各部门的资源使用(案例)

1.      Yarn.scheduler.capacity.root.queues=”operations,marketing,manufacturing”

2.      计算能力高度器的配置文件$HADOOP_CONF_DIR/capacity-scheduler.xml,配置属性语法

<property>
                <name>yarn.scheduler.capacity.root.queues</name>
                <value>operations,marketing, manufacturing</value>
                <description>The queuesbelow the root queue
                </description>
</property>

3.      进行百分比分配

Yarn.scheduler.capacity.root.operations.capacity=40

Yarn.scheduler.capacity.root.marketing.capacity=20

Yarn.scheduler.capacity.root.manufacturing.capacity=40

(运营部占40%资源,市场部占20%,生产部占40%)

4.      实施计算能力限制

将集群闲置的资源调给市场部用,但限制最大值50%,该配置项在yarn.xml配置如下:

Yarn.scheduler.capacity.root.marketing.maximum-capacity=50

5.      设置能力限制

yarn.scheduler.capacity.root.queues=”operations,operation-long,marketing,manufacturing”

Yarn.scheduler.capacity.root.operation-long.capacity=20

Yarn.scheduler.capacity.root.operations-long.maximun-capacity=20

6.      实施访问控制限制

每个组中的用户也是需要被限制。

配置允许各个用户提交作业到一个队列:

Yarn.scheduler.capacity.root.operations.acl_submit_applications=”joe,james,ahmed,ricardo,maria”

然后,限制这些用户向集群申请资源的能力:

Yarn.scheduler.capacity.root.operations.minimum-user-limit-percent=20

通过上面配置,限制了运营组中每个用户可占用的集群资源量为该组可使用的所有资源量的20%.

7.      更新择集群计算能力限制的更改

不用重启service即可刷新调度器的配置:

$HADOOP_YARN_HOME/bin/yarnrmadmin –refreshQueues

 

l  公平调度器

公平平等地共享使用集群资源,空闲的集群资源会平均地分配给这些要运行的作业,每个作业会得到大体相同数量的集群资源

$HADOOP_CONF_DIR/yarn-site.xml为所在属性文件

属性:yarn.resourcemanager.scheduler.class

属性值:org.apacheh.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler

 

n  公平调度器的目的在于:

1.      允许多用户共享集群资源

2.      允许短时的临时作业与长时作业共享集群资源

3.      允许根据比例来管理集群资源,确保集群资源的有效利用.

 

n  公平调度器配置

1.      公平调度器有以下4个队列:

Root.operations , root.operations-long,root.marketing, root.manufacturing

2.      引入扩展类:org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.SchedulingPolicy

3.      有如下policy可用:

FIFO

Fair:基于内存数量来调度分配资源

DominantResourceFairness(drf):基于内存量和cpu资源来调度分配资源

4.      配置公平调度器涉及两个配置文件

$HADOOP_CONF_DIR/yarn-site.xml

Allocation Filelisting:该文件位置由文件yarn-site.xml中的yarn.scheduler.fair.allocation.file属性决定,该文件每隔10秒会被加载一次

l  Yarn-site.xml配置

用于配置公平调度器配置项:

1.      yarn.scheduler.fair.allocation.file:调度policy文件path.如果该路径是一个相对路径,文件会从classpath中的路径寻找到(通常$HADOOP_CONF_DIR),该属性的default值为:fair-scheduler.xml

2.      yarn.scheduler.fair.preemption:抢占机制,default是false.

3.      Yarn.scheduler.fair.sizebaseweight:决定按照作业的大小来给每个作业分配资源,还是不论作业大小而平均给它分配集群资源,属性的值默认值为false.

l  Policy 文件的格式和配置

自定义policy文件(Allocation File)在文件yarn-site.xml中配置.这个policy文件是用来配置队列及其运行时属性,比如分配的最小和最大资源、调度策略权重、子队列和队列中的用户级别约束

<?xmlversion=”1.0”?>
<allocations>
 <queue name=”sample_queue”>
            <minResources>10000mb,Ovcores</minResources>
            <maxResources>90000mb,Ovcores</maxResources>
            <maxRunningApps>50</maxRunningApps>
            <weight>2.0</weight>
            <schdulingPolicy>fair</schdulingPolicy>
            <queuename=”sample_sub_queue”>
                       <minResources>5000mb, Ovcores</minResources>
            </queue>
            </queue>
            <user name=”sample_user”>
                       <maxRunningApps>30</maxRunningApps>
            </user>
            <userMaxAppsDefault>5</userMaxAppsDefault>
            </allocations>

Queue代表了队列的属性:

1.      minResources:分配给该队列的最小资源量,“X mb, Y cores”, 当schedulingPolicy的属性值是fair时,其cores值被忽略

2.      maxResources:分配给该队列的最大资源量。

3.      maxRunningApps:该队列中可以执行作业数量的最大值.

4.      Weight:允许集群不按照平均比例来分配资源,default值1

5.      SchedulingPolicy:该配置项指定了该队列采用的高度policy. 分别:FIFO, fair, drf, 默认值:fair.当然,还可以配置自定义的schedulingPolicy,该类继承自:org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.SchedulingPolicy.

这个属性会受minResource属性影响。

User标签中定义了用户的行为属性:

1.      maxRunningApps:同一个用户可以同时运行的作业的最大数量

2.      userMaxAppsDefault:如果userMaxAppsDefault没有设置,该属性设置值即为同一个用户可以同时运行的作业的最大数量.

3.      defaultQueuSchedulingPolicy:如果schedulingPolicy没有设置,该属性设置值即为该队列的调度policy,default为fair.

 

 

l  按照drf策略来确定优势资源的分配

n  Drf调度需要指定两种集群资源: 内存、CPU

n  每种资源受限于minResources and maxResources

 

l  从属文件 :从服务器的主机名or IP存放在$HADOOP_CONF_DIR/slaves文件中,文件中的一行代表一台从服务器。

 

l  机架感知

为了使hadoop可以机架感知,$HADOOP_CONF_DIR/core-site.xml文件中下列参数需要被修改

1.      Topology.node.switch.mapping.impl:指定一个java类的实现.我们可以把自己编写的类配置在这里,其默认值:org.apache.hadoop.net.ScriptBaseMapping.这个类实现采用了一个用户提供的脚本。

2.      Net.topology.script.file.name:指定被java类执行的脚本文件的名称及其路径,执行该脚本文件的java类由上文参数的默认设置指定。这个脚本的作用是输入DNS名称,并把这些DNS名称解析为在网络拓扑的名字。如:该脚本可以把10.1.1.1转换为/rack1并输出。如果该IP没有对应的设置,返回默认值/default-rack.

3.      Net.topology.script.number.args:由net.topology.script.file.name运行指定的脚本所需要参数的最大数量。每个参数是一个DNS名称or IP,默认值为100

4.      Net.topology.script.file.name示例

HADOOP_CONF=$HADOOP_HOME/etc/Hadoop/
While[ $# -gt 0 ]; do
       nodeArg=$1
       exec < ${HADOOP_CONF}/topology.data
       result=””
       while read line; do
                 ar=($line)
                 if [ “${ar[0]}”=”$nodeArg”];then
                            result=”${ar[1]}”
                 fi
       done
       shift
       if [ -z “$result” ]; then
                 echo –n “/default/rack “
       else
                 echo –n “$result”
       fi
done

以上这个脚本解析$HADOOP_CONF_DIR/topology.data文本文件

5.      $HADOOP_CONF_DIR/topology.data示例

Hadoop1 /dc1/rack1
Hadoop2 /dc1/rack1
Hadoop3 /dc1/rack1
10.1.1.1        /dc1/rack2
10.1.1.2        /dc1/rack3

 

当集群启动之后,读取hdfs-site.xml文件中的dfs.host属性。如果设置了上文提到的$HADOOP_CONF_DIR/slaves文件的完整路径,会调用以上脚本把从服务器文件(slaves files)中的所有主机名一次处理完毕。每次调用处理的从服务器主机名的最大数量由net.topology.script.number.args决定。如果dfs.hosts属性值为空,脚本会在每个数据节点调用一次。返回的结果在集群启动的时候汇报给名称节点。

 

l  集群管理工具

所有的命令都通过$HADOOP_HOME/bin/hdfs来调用执行

n  检查HDFS:检测HDFS系统中文件块的损害or丢失

示例:

Bin/hdfs fsck/:获取整个文件系统报告
Bin/hdfs fsck /-files:获取HDFS中所有文件的报告.
Bin/hdfs fsck /-files –block:获取数据块报告,以及每块数据块的位置.
Bin/hdfs fsck /-files –block racks:获取数据块的报告,以及每块数据块所在的机架

n  HDFS管理命令行

1.      Hdfs dfsadmin –report:HDFS集群健康报告

2.      Hdfs dfsadmin –metasavefilename(获得更细节的状态信息)

3.      dfs.hosts:这是一个指向包含了一系列节点的文件路径名,文件中的节点允许与名称节点进行通信

4.      dfs.hosts.exclude:文件中的节点不允许与名称节点进行通信

5.      从集群中添加/删除节点,需要修改上面提及文件,并执行以下指令:hdfs dfsadmin –refreshNodes:

6.      设定HDFS为安全模式:hdfs dfsadmin –safemode action

Action: enter:hdfs进入安全模式

                   Leave:强制hdfs离开安全模式

                            Get:返回一个字符串on or off,代表当前安全模式状态

                            Wait:等待退出安全模式并返回

 

n  均衡HDFS上数据分布

1.      均衡器工具是由下面这个类来实现

Org.apache.hadoop.hdfs.server.balancer.Balancer

2.      均衡器脚本的语法如下所示:

Bin/start-balancer.sh–threshold utilization-threshold%

例如:bin/start-balancer.sh–threshold 5, 指均衡器会使得HDFS中所有数据节点利用率差距在5%内,节点利用率差距越小,均衡器需要花费的时间就越久。

3.      Bin/stop-balancer.sh :停止均衡

4.      配置属性dfs.datanode.balance.bandwidthPerSec,指均衡自己的数据存储时来限制每秒传输的字节数量

 

n  从HDFS中复制海量数据

Hadoop安装分布式拷贝(distcp)工具:

1.      Bin/Hadoop distcp srcdir desdir

2.      Srcdir:源目录的完全限定路径,如:/usr/mydir, hdfs://namenode:9000/usr/mydir

3.      Desdir:目的目录路径

4.      S3路径可以按照S3://bucker-name/key来指定