HDFS参数调优
core-site.xml
hadoop.tmp.dir 默认值: /tmp
说明: 尽量手动配置这个选项,否则的话都默认存在了里系统的默认临时文件/tmp里。并且手动配置的时候,如果服务器是多磁盘的,每个磁盘都设置一个临时文件目录,这样便于mapreduce或者hdfs等使用的时候提高磁盘IO效率。
fs.trash.interval 默认值: 0
说明: 这个是开启hdfs文件删除自动转移到垃圾箱的选项,值为垃圾箱文件清除时间(分钟)。一般开启这个会比较好,以防错误删除重要文件。最好使用一天(1440)
io.file.buffer.size 默认值:4096 ,4kb
说明:SequenceFiles在读写中可以使用的缓存大小,可减少 I/O 次数。在大型的 Hadoop集群,建议可设定为 65536(64kb) 到 131072(128kb)。
hdfs-site.xml
dfs.blocksize 默认值:134217728
说明: 这个就是hdfs里一个文件块的大小了,CDH5中默认128M。太大的话会有较少map同时计算,太小的话也浪费可用map个数资源,而且文件太小namenode就浪费内存多。根据需要进行设置。
dfs.namenode.handler.count 默认值:10
说明:设定 namenode server threads 的数量,这些 threads 會用 RPC 跟其他的 datanodes 沟通。当 datanodes 数量太多时会发現很容易出現 RPC timeout,解決方法是提升网络速度或提高这个值,但要注意的是 thread 数量多也表示 namenode 消耗的内存也随着增加
MapReduce参数调优
mapred-default.xml
mapred.child.Java.opts 默认值:-Xmx200m
说明:JVM启动的子线程可以使用的最大内存。建议值-XX:-UseGCOverheadLimit -Xms512m -Xmx2048m -verbose:gc -Xloggc:/tmp/@taskid@.gc
mapreduce.jobtracker.handler.count 默认值:10
说明:JobTracker可以启动的线程数,一般为tasktracker节点的4%。
mapreduce.tasktracker.http.threads 默认值:40
说明:map和reduce是通过http进行数据传输的,这个是设置传输的并行线程数。
mapreduce.map.output.compress 默认值:false
说明: map输出是否进行压缩,如果压缩就会多耗cpu,但是减少传输时间,如果不压缩,就需要较多的传输带宽。配合 mapreduce.map.output.compress.codec使用,默认是 org.apache.hadoop.io.compress.DefaultCodec,可以根据需要设定数据压缩方式(org.apache.hadoop.io.compress.SnappyCodec)。
mapreduce.task.io.sort.mb 默认值:100
说明: Map Task缓冲区所占内存大小。这个参数控制 map 端 memory buffer 大小,越大每次 map 要 spill 的 file 就越大,总 spill file 个数越少; 所以如果你的 Hadoop Job map output 很多,适当增加这个参数有助于 performance;
mapreduce.map.sort.spill.percent 这个参数控制 map memory buffer 到达多少比例时开始 spill. 我们知道 spill 是写 IO 操作,所以需要时间。如果 percentage 太高,有可能当 spill 还没有完成时,map output 已经把 memory buffer 填满,这样影响 performance;同样,太低会造成太多 spill fie;(默认值 0.80)
mapreduce.reduce.shuffle.merge.percent 默认值: 0.66
说明:reduce归并接收map的输出数据可占用的内存配置百分比。类似mapreduce.reduce.shuffle.input.buffer.percent属性。如果reduce占用内存不是特别大,可以将参数调整至0.9
mapreduce.task.io.sort.factor 默认值:10
说明:Reduce Task中合并小文件时,一次合并的文件数据,每次合并的时候选择最小的前10进行合并。
mapreduce.reduce.shuffle.parallelcopies 默认值:5
说明:reuduce shuffle阶段并行传输数据的线程数。Fetcher线程数,这里改为10。集群大可以增大。
mapreduce.reduce.shuffle.memory.limit.percent 默认值: 0.25
说明:一个单一的shuffle的最大内存使用限制。
mapreduce.job.reduces 默认值:1
说明:默认启动的reduce数。通过该参数可以手动修改reduce的个数。
mapred.job.reuse.jvm.num.tasks(mapreduce.job.jvm.numtasks) 默认值: 1
说明:一个jvm可连续启动多个同类型任务,默认值1,若为-1表示不受限制。
推测执行参数优化
mapreduce.map.speculative:如果为true则Map Task可以推测执行,即一个Map Task可以启动Speculative Task运行并行执行,该Speculative Task与原始Task同时处理同一份数据,谁先处理完,则将谁的结果作为最终结果。默认为true。对于生产环境,最好关闭map task推测执行。
mapreduce.reduce.speculative:同上,默认值为true。对于生产环境最好关闭reduce task推测执行。
mapreduce任务数据压缩配置参数
mapreduce.job.reduces:手动设置reduce个数。
mapreduce.map.output.compress:map输出结果是否压缩。
mapreduce.map.output.compress.codec:压缩格式。
mapreduce.output.fileoutputformat.compress: job输出结果是否压缩。
mapreduce.output.fileoutputformat.compress.type: 默认RECORD。
mapreduce.output.fileoutputformat.compress.codec: 压缩格式。
hadoop压缩
https://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop-compression-analysis/
调优原则
一般的原则是给shuffle分配尽可能多的内存,但前提是要保证Map、Reduce任务有足够的内存
对于Map,主要就是避免把文件写入磁盘,例如使用Combiner,增大io.sort.mb的值
对于Reduce,主要是把Map的结果尽可能地保存到内存中,同样也是要避免把中间结果写入磁盘。默认情况下,所有的内存都是分配给Reduce方法的,如果Reduce方法不怎消耗内存,可以mapreduce.reduce.merge.inmem.threshold设置成0,mapreduce.reduce.shuffle.input.buffer.percent设成1.0在任务监控中可通过Spilled records counter来监控写入磁盘的数,但这个值是包括map和reduce的对于IO方面,可以Map的结果可以使用压缩,同时增大buffer size(io.file.buffer.size,默认4kb)
MR任务指定队列
作业提交到的队列:mapreduce.job.queuename
作业优先级:mapreduce.job.priority
优先级默认有5个:LOW VERY_LOW NORMAL(默认) HIGH VERY_HIGH
1、静态设置
1.1 Hive版本
SET mapreduce.job.queuename=root.etl.distcp;
SET mapreduce.job.priority=HIGH;
1.2 MapReduce版本:
hadoop jar app.jar -Dmapreduce.job.queuename=root.etl.distcp -Dmapreduce.job.priority=HIGH
2、动态调整
如果是已经在运行中的任务,可以动态调整任务所属队列及其优先级。
2.1 调整优先级
hadoop1.0及以下版本:
hadoop job -set-priority job_201707060942_6121418 VERY_HIGH
hadoop2.0及以上版本:(未证实是否可用)
yarn application -appId application_1478676388082_963529 -updatePriority VERY_HIGH
2.2 动态调整队列
hadoop2.0及以上版本可以通过下面命令
yarn application -movetoqueue appID -queue targetQueueName
yarn application -movetoqueue application_1478676388082_963529 -queue root.etl
其中application_1478676388082_963529为yarn applition id,queue后跟的是需要move到的队列。
Hadoop组件默认端口
这里包含我们使用到的组件:HDFS, YARN, HBase, Hive, ZooKeeper:
组件 | 节点 | 默认端口 | 配置 | 用途说明 |
HDFS | DataNode | 50010 | dfs.datanode.address | datanode服务端口,用于数据传输 |
HDFS | DataNode | 50075 | dfs.datanode.http.address | http服务的端口 |
HDFS | DataNode | 50475 | dfs.datanode.https.address | https服务的端口 |
HDFS | DataNode | 50020 | dfs.datanode.ipc.address | ipc服务的端口 |
HDFS | NameNode | 50070 | dfs.namenode.http-address | http服务的端口 |
HDFS | NameNode | 50470 | dfs.namenode.https-address | https服务的端口 |
HDFS | NameNode | 8020 | fs.defaultFS | 接收Client连接的RPC端口,用于获取文件系统metadata信息。 |
HDFS | journalnode | 8485 | dfs.journalnode.rpc-address | RPC服务 |
HDFS | journalnode | 8480 | dfs.journalnode.http-address | HTTP服务 |
HDFS | ZKFC | 8019 | dfs.ha.zkfc.port | ZooKeeper FailoverController,用于NN HA |
YARN | ResourceManager | 8032 | yarn.resourcemanager.address | RM的applications manager(ASM)端口 |
YARN | ResourceManager | 8030 | yarn.resourcemanager.scheduler.address | scheduler组件的IPC端口 |
YARN | ResourceManager | 8031 | yarn.resourcemanager.resource-tracker.address | IPC |
YARN | ResourceManager | 8033 | yarn.resourcemanager.admin.address | IPC |
YARN | ResourceManager | 8088 | yarn.resourcemanager.webapp.address | http服务端口(用于查看YRAN任务) |
YARN | NodeManager | 8040 | yarn.nodemanager.localizer.address | localizer IPC |
YARN | NodeManager | 8042 | yarn.nodemanager.webapp.address | http服务端口 |
YARN | NodeManager | 8041 | yarn.nodemanager.address | NM中container manager的端口 |
YARN | JobHistory Server | 10020 | mapreduce.jobhistory.address | IPC |
YARN | JobHistory Server | 19888 | mapreduce.jobhistory.webapp.address | http服务端口 |
HBase | Master | 60000 | hbase.master.port | IPC |
HBase | Master | 60010 | hbase.master.info.port | http服务端口 |
HBase | RegionServer | 60020 | hbase.regionserver.port | IPC |
HBase | RegionServer | 60030 | hbase.regionserver.info.port | http服务端口 |
HBase | HQuorumPeer | 2181 | hbase.zookeeper.property.clientPort | HBase-managed ZK mode,使用独立的ZooKeeper集群则不会启用该端口。 |
HBase | HQuorumPeer | 2888 | hbase.zookeeper.peerport | HBase-managed ZK mode,使用独立的ZooKeeper集群则不会启用该端口。 |
HBase | HQuorumPeer | 3888 | hbase.zookeeper.leaderport | HBase-managed ZK mode,使用独立的ZooKeeper集群则不会启用该端口。 |
Hive | Metastore | 9083 | /etc/default/hive-metastore中 export PORT=<port>来更新默认端口 | |
Hive | HiveServer | 10000 | /etc/hive/conf/hive-env.sh中 export HIVE_SERVER2_THRIFT_PORT=<port>来更新默认端口 | |
ZooKeeper | Server | 2181 | /etc/zookeeper/conf/zoo.cfg中clientPort=<port> | 对客户端提供服务的端口 |
ZooKeeper | Server | 2888 | /etc/zookeeper/conf/zoo.cfg中 server.x=[hostname]:nnnnn[:nnnnn] | follower用来连接到leader,只在leader上监听该端口。 |
ZooKeeper | Server | 3888 | /etc/zookeeper/conf/zoo.cfg中 server.x=[hostname]:nnnnn[:nnnnn] | 用于leader选举的。只在electionAlg是1,2或3(默认)时需要。 |