Hadoop 组件性能优化思维导图
2019-01-28 17:12:37 0 举报
AI智能生成
Hadoop组件性能优化
作者其他创作
大纲/内容
Yarn
yarn-default.xml
子主题
MapReduce
mapred-default.xml
MapReduce 的压缩属性
MapReduce 的压缩属性
mapreduce.output.fileoutputformat.compress
job 输出应该压缩吗
默认 false
设置 true
mapreduce.output.fileoutputformat.compress.type
SqeuenceFile 的输出使用的压缩类型:
默认 RECORD
使用默认
mapreduce.output.fileoutputformat.compress.codec
Map 输出使用的压缩 codec
默认 org.apache.hadoop.io.compress.DefaultCodec
使用默认
开启 MapReduce 压缩
mapreduce.map.output.compress
map 的输出应该压缩之前在网络上发送。使用SequenceFile压缩
默认 false
设置 true
mapreduce.map.output.compress.codec
Map 输出使用的压缩 codec
默认 org.apache.hadoop.io.compress.DefaultCodec
使用默认值
MapRedcue 任务环境优化
mapred.child.java.opts
每一个map或是reduce进程都是一个task,都会对应启动一个JVM
默认: -Xmx200m
取值范围以及影响
mapreduce.task.io.sort.mb 的 2倍值
单节点内存 / (mapreduce.tasktracker.map.tasks.maximum + mapreduce.tasktracker.reduce.tasks.maximum)
mapreduce.map.memory.mb |mapreduce.reduce.memory.mb 会替换此值
mapreduce.map.java.opts
运行 map 任务的 JVM 环境内存,需要根据具体环境设置
计算公式 : (dfs.blocksize x 4)
设置 -Xmx512M
mapreduce.reduce.java.opts
运行 reduce 任务的 JVM 环境内存,需要根据具体环境设置
计算公式 : (dfs.blocksize x 5)
mapreduce.map.java.opts 的 2 倍
设置 -Xmx1024M
mapreduce.job.reduce.slowstart.completedmaps
map task完成数目达到5%时,开始启动reduce task
默认 0.05
mapreduce.map.memory.mb
一个Map Task可使用的资源上限(单位:MB),同 mapreduce.map.java.opts
默认 1024
取值范围
一个 Map 对应一个块,一个 Map . 计算公式 : (dfs.blocksize x 4) = 512
mapreduce.reduce.memory.mb
一个Reduce Task可使用的资源上限(单位:MB),同 mapreduce.reduce.java.opts
默认 1024
取值范围
dfs.blocksize x 8 = 1024
集群节点运行 MAP | Reduce 数
mapreduce.tasktracker.map.tasks.maximum
(集群配置)一个节点同时运行在 TaskTracker 上的最大 map task 数
集群总运行 MAP 数 = Node x mapreduce.tasktracker.map.tasks.maximum
默认 2
取值范围
根据 mapreduce.map.memory.mb 和系统可用内存,计算得得出
mapreduce.tasktracker.reduce.tasks.maximum
(集群配置)一个节同时运行在 TaskTracker 上的最大 reduce task 数
集群总运行 MAP 数 = Node x mapreduce.tasktracker.reduce.tasks.maximum
默认 2
计算公式
0.95 * ( node(计算节点) * cpu 核数)
当 map 结束,reduce 就能立即启动
1.75 * ( node(计算节点) * cpu 核数)
较快的节点,第一轮 reduce 结束后,可以开始第二轮的 reduce ,从而提高负载均衡
根据 mapreduce.reduce.memory.mb 和系统可用内存,计算得得出
mapreduce.job.maps
(本地参数)覆盖值 mapreduce.tasktracker.map.tasks.maximum
默认 2
设置成 -1 ,不限制
mapreduce.job.reduces
(本地参数)覆盖值 mapreduce.tasktracker.reduce.tasks.maximum
默认 1
设置成 -1 ,不限制
小作业优化
mapreduce.job.ubertask.enable
小作业优化,把小作业(application )的 ApplicationMaster、 Map 、 Reduce 的 Task 放在一个节点的容器中执行
默认 false
设置 true
mapreduce.job.ubertask.maxmaps
小作业 Map 的阀值,对于 app,如果 map 数量不超过,这个阀值,就使用小作业模式运行
默认 9
取值范围
根据 mapreduce.tasktracker.map.tasks.maximum +- 1 左右的值
mapreduce.job.ubertask.maxreduces
小作业 Reduce 的阀值,对于 application,如果 Reduce 数量不超过,这个阀值,就使用小作业模式运行
目前只支持 1 ,设置成 1
mapreduce.map.cpu.vcores
指定每个 map 任务需要的虚拟 CPU 个数
mapreduce.reduce.cpu.vcores
指定每个 reduce 任务需要的虚拟CPU个数
默认 1
mapreduce.job.jvm.numtasks
是否重用 JVM
默认 1
设置为 -1 表示重用
mapreduce.map.speculative
map 推测
默认 true
设置 true
mapreduce.reduce.speculative
reduce 推测
默认 true
设置 true
mapreduce.input.fileinputformat.split.maxsize
设置 一个 Map 最多同时处理的文件总数大小,HDFS n 个文件相加后的 size ,根据设定值,决定启用几个 Map 任务
默认 256000000
取值范围
mapreduce.map.memory.mb 同样大小,转换成字节
shuffle 过程属性
Map
mapreduce.task.io.sort.mb
每个 Map|Reduce 任务都有一个环形内存缓冲区 buffer,用于存储任务输出,每个 Map | Reduce
人话: 比如一个 map 输出是 600 MB,默认的 buffer 值是 100MB,则会 spill(溢出) 6 次(6 x 100) 到硬盘,如果设置为 600MB ,则只会一次
默认 buffer 100 ,MB
mapreduce.map.sort.spill.percent
mapreduce.task.io.sort.mb 属性的 buffer 的阈值
人话 : 当 buffer 达到指定阈值,会启动一个后台线程来对buffer的内容进行排序,然后写入本地磁盘(一个spill文件),直到 map 堵塞到磁盘写完为止
默认 0.8, 即 80%
mapreduce.map.combine.minspills
Map 合并阶段, 运行 combiner 所需的最少 spile 溢出文件数,达到这个数会执行 combiner 操作
默认 3
可以设置成 5
mapreduce.cluster.local.dir
溢出的内容会写到本属性配置的目录中
${hadoop.tmp.dir}/mapred/local
Reduce
mapreduce.reduce.shuffle.parallelcopies
用于把 map 的输出复制到 reduce 的线程数
默认 5
设置成 10
mapreduce.reduce.shuffle.input.buffer.percent
Reduce Shuffle 节点,如果 Map 足够小会被复制到 ReduceTask 的内存中(堆内存百分比),如果超过这个值,会复制到硬盘上
影响面
以 (mapreduce.task.io.sort.mb 或 mapreduce.reduce.memory.mb) 作为百分比
默认 0.70
mapreduce.reduce.shuffle.merge.percent
map 输出缓冲区(由 mapreduce.reduce.shuffle.input.buffer.percent 定义)的阀值使用比例,
人话: reduce 归并接收 map 的输出数据可占用的内存配置百分比
默认 0.66
使用默认值
mapreduce.reduce.merge.inmem.threshold
阈值,在内存中合并文件数量的过程。当我们积累阈值数量的文件启动内存合并和溢出到磁盘。0 或更小表示没有限制. 溢出写行为由 mapreduce.reduce.shuffle.merge.percent 属性单独控
人话: 内存中的合并文件数设置
默认 1000
使用默认值
mapreduce.reduce.input.buffer.percent
在 reduce 过程中,在内存中保存 Map 输出的空间占整个堆空间的比例。reduce 阶段开始时,内存中的 map 输出大小不能大于这个值
默认情况下,在 reduce 任务开始之前,所有 map 都合并到磁盘上,以便为 reducer 提供尽可能多的内存,如果 reduce 需要的内存少,可以增加值来最小化访问磁盘次数
这个参数设置用于在 reduce 阶段保存 map 输出的内存的百分比(相对于最大堆大小),当 shuffle 结束时,内存中剩余的 map 输出必须少于这个阈值,然后 reduce 阶段才能够开始
默认 0.0
使用默认值
通用
mapreduce.task.io.sort.factor
排序文件时,一次最多合并的流数
默认 10
设置成 100
Hive 环境优化
hive.exec.reducers.bytes.per.reducer
一个 Reduce 任务最多同时处理文件总数的大小,决定几个 Reduce Task 任务,可以与 mapreduce.input.fileinputformat.split.maxsize 配合使用
取值范围
mapreduce.reduce.memory.mb 同样大小,转换成字节
hive.exec.parallel
开启并发
默认 false
设置 true
hive.exec.parallel.thread.number
开启 hive.exec.parallel 后,的并发数
默认 8
$HIVE_HOME/conf/hive-env.sh
设置 Hive CLI Driver 的 heap size
exoport HADOOP_HEAPSIZE=2048
取值范围
同 mapred.child.java.opts
数据倾斜
join 阶段数据倾斜
hive.optimize.skewjoin=true
hive.skewjoin.key=100000
groupby 阶段数据倾斜
hive.groupby.skewindata=true
hive.groupby.mapaggr.checkinterval=100000
hive.optimize.bucketmapjoin.sortedmerge
如果MapJoin中的表都是有序的,使Join操作无需扫描整个表
默认 false
设置 true
扩展
Docs
http://dongxicheng.org/framework-on-yarn/hadoop-spark-common-parameters/
mapper 的数量
reducer 的数量
combine 组合器
combine 使 map 输出结构更加紧凑,因此减少写磁盘的数据、减少传递给 reduce
中间值的压缩
自定义序列
调整 shuffle
Linux
noatime 和 nodiratime 属性
ext2 / ext3 文件系统,文件创建、修改会记录时间戳,如果访问量大关闭这些操作可以提高性能
readahead buffer 预读缓冲区大小
默认 256 sectors
可以增大到 1024|2048 sectors
blockdev 命令调整
不使用 RAID 和 LVM 文件系统
open files 最多打开文件数
查看最大打开文件数
sysctl -a | grep fs.file
永久生效 sudo vim /etc/security/limits.conf
hadoop soft nofile 65535
hadoop hard nofile 65536
关闭透明大页
if test -f /sys/kernel/mm/redhat_transparent_hugepage/enabled; then
echo never > /sys/kernel/mm/redhat_transparent_hugepage/enabled
fi
http://www.knowsky.com/617647.html
HDFS
hdfs-default.xml
dfs.namenode.handler.count
namenode或者jobtracker中用于处理RPC的线程数,默认是10
默认 10
较大集群,可调大些,比如 64
dfs.datanode.handler.count
datanode上用于处理RPC的线程数。
需要注意的是,每添加一个线程,需要的内存增加
默认为 3
较大集群,可适当调大些,比如8
dfs.replication
文件副本数
通常设为3
使用默认值
dfs.blocksize
HDFS 块大小
默认 134217728 字节,128 MB
可以调整到 134217728 字节128 MB ,或者 268435456 字节,256 MB
Core
core-default.xml
io.file.buffer.size
缓冲区用于序列文件的大小。这个缓冲区的大小应该是硬件的多个页面大小在英特尔x86(4096),它决定了数据缓冲中读取和写入操作 . 缓冲区辅助 I/O 操作
默认 4096 , 4KB
可以设置成 131072 , 128 KB
0 条评论
下一页