有一些可以通过hadoop的参数进行设置,如堆栈大小、JVM重用、GC、flag等,将会在hadoop参数中详细介绍。
-XX:+AggressiveOpts
-XX:+UseCompressedOops
-XX:+UseBiasedLocking
yarn的资源表示模型Container,Container将资源抽象为两个维度,内存和虚拟CPU核(vcore)
1. 兼容各种计算框架
2. 动态分配资源,减少资源浪费
容器内存
yarn.nodemanager.resource.memory-mb
最小容器内存
yarn.scheduler.mininum-allocation-mb
容器内存增量
yarn.scheduler.increment-allocation-mb
最大容器内存
yarn.scheduler.maxinum-allocation-mb
举个栗子:
(4) 用户给任务设置的内存量为1000MB,为何最终分配的内存却是1024MB?
答:为了易于管理资源和调度资源,Hadoop YARN内置了资源规整化算法,它规定了最小可申请资源量、最大可申请资源量和资源规整化因子,如果应用程序申请的资源量小于最小可申请资源量,则YARN会将其大小改为最小可申请量,也就是说,应用程序获得资源不会小于自己申请的资源,但也不一定相等;如果应用程序申请的资源量大于最大可申请资源量,则会抛出异常,无法申请成功;规整化因子是用来规整化应用程序资源的,应用程序申请的资源如果不是该因子的整数倍,则将被修改为最小的整数倍对应的值,公式为ceil(a/b)*b,其中a是应用程序申请的资源,b为规整化因子。
以上介绍的参数需在yarn-site.xml中设置,相关参数如下:
yarn.scheduler.minimum-allocation-mb:最小可申请内存量,默认是1024
yarn.scheduler.minimum-allocation-vcores:最小可申请CPU数,默认是1
yarn.scheduler.maximum-allocation-mb:最大可申请内存量,默认是8096
yarn.scheduler.maximum-allocation-vcores:最大可申请CPU数,默认是4
对于规整化因子,不同调度器不同,具体如下:
FIFO和Capacity Scheduler,规整化因子等于最小可申请资源量,不可单独配置。
Fair Scheduler:规整化因子通过参数yarn.scheduler.increment-allocation-mb和yarn.scheduler.increment-allocation-vcores设置,默认是1024和1。
通过以上介绍可知,应用程序申请到资源量可能大于资源申请的资源量,比如YARN的最小可申请资源内存量为1024,规整因子是1024,如果一个应用程序申请1500内存,则会得到2048内存,如果规整因子是512,则得到1536内存。
容器虚拟CPU内核
yarn.nodemanager.resource.cpu-vcores
最小容器虚拟CPU内核数量
yarn.scheduler.mininum-allocation-vcores
容器虚拟CPU内核增量
yarn.scheduler.increment-allocation-vcores
最大容器虚拟CPU内核增量
yarn.scheduler.maxinum-allocation-vcores
双路四核intel CPU 2*4*2=16 考虑其它应用设置为10-12比较合适
调优三原则
* 增大作业并行程度
* 给每个任务足够的资源
* 在满足前两个的条件下,尽可能地给shuffle预留资源
增大作业并行程度
实质上是改变输入分片(input split)的大小,输入分片是一个逻辑概念,是一个Map Task的输入。在调优过程中,尽量让输入分片与块大小一样,这样就能实现计算本地化,减少不必要的网络传输。
计算公式为:
max(mapred.min.split.size,min(mapred.max.split.size,dfs.block.size))
mapred.min.split.size=1(默认值)
mapred.max.split.size=9223372036854775807(默认值)
dfs.block.size为块大小
给每个任务足够的资源
Map任务内存
mapreduce.map.memory.mb
Reduce任务内存
mapreduce.reduce.memory.mb
Map任务最大堆栈
mapreduce.map.java.opts.max.heap
Reduce任务最大堆栈
mapred.reduce.java.opts.max.heap
ApplicationMaster内存
yarn.app.mapreduce.am.resource.mb
在满足前两个的条件下,尽可能地给shuffle预留资源
最大洗牌连接
mapreduce.shuffle.max.connections
I/O排序内存缓冲(MiB)
mapreduce.task.io.sort.mb
I/O排序因子
mapreduce.task.io.sort.factor
洗牌期间并行传输的默认数量
mapreduce.reduce.shuffle.parallelcopies
压缩Map输出
mapreduce.map.output.compress
小表为驱动表,或者直接将小表加载到内存,做map端join,它的关键字为/+MAPJOIN(t1)/
如果想自动开启map端join,可以通过 hive.mapjoin.smalltable.filesize(默认为25000000字节)来定义小表的大小,一旦在这个范围之内,就会自动进行map端join
Hive作业Reducer数量会直接影响作业效率,Hive的Reducer的是通过如下两个参数确定:
参数1:hive.exec.reducers.bytes.per.reducer默认为1GB
参数2:hive.exec.reducers.max默认为999
Reducer的个数=min(参数2,总输入数据量/参数1)
列裁剪和分区裁剪都是减少作业输入,默认开启。
hive.optimize.cp(列裁剪)、hive.optimize.pruner(分区裁剪)默认开启
SELECT col1,col2,col3 FROM table;
参数1:hive.map.aggr是否在Map端进行聚合,默认为true
参数2:hive.groupby.mapagger.checkinterval在Map端进行聚合操作的条目数目,默认为100000
防止数据倾斜:
hive.groupby.skewindata=true
示例:
key不平均时,计算时间按key值多的reduce任务。
当文件数目过多时,会给htfs带来压力,可以通过合并Map和Reduce的输出文件来减少文件数。
参数1:hive.merge.mapfiles=true是否合并Map阶段的输出文件
参数2:hive.merge.mapredfiles=true是否合并Reduce阶段的输出文件
参数3:hive.merge.size.per.task=256000000合并的文件的大小,默认为256000000
Multi-group By和Multi-insert是Hive特有语法,可以在同一个查询语句中使用多个不相交的insert语句,只需要扫描一遍全表。
FROM test
INSERT OVERWRITE TABLE test_by_a
SELECT a,COUNT(e) GROUP BY a/b
INSERT OVERWRITE TABLE test_by_b
SELECT b,COUNT(f) GROUP BY b
INSERT OVERWRITE TABLE test_by_c
SELECT c,COUNT(g) GROUP BY c
利用Union All特性将多个MapReduce作业合并
未优化的HQL:
SELECT * FROM(SELECT * FROM t1 GROUP BY c1,c2,c3
UNION ALL
SELECT * FROM t2 GROUP BY c1,c2,c3) t3
GROUP BY c1,c2,c3
优化后的HQL:
SELECT * FROM
(SELECT * FROM t1
UNION ALL
SELECT * FROM t2)t3
GROUP BY c1,c2,c3
参数1:hive.exec.parallel=true,默认false不打开,打开会占用更多资源
ORDER BY 默认
SORT BY
设置SORT BY方式:
修改slaves文件,在/hadoop/etc/hadoop目录下slaves,添加节点名称
启动datanode:./hadoop-daemon.sh start datanode
刷新节点:hadoop dfsadmin -redreshNodes
修改配置dfs.hosts和dfs.hosts.exclute,并执行hadoop dfsadmin -refreshNodes
最后再将该节点地址去掉,再次执行:hadoop dfsadmin -refreshNodes
参考:hadoop2.7.1不重启,动态删除节点和新增节点