一、hive配置优化
今天从新复习下hive,同样是Clouderamanager 的hive的配置页面,进入hive的配置选项
1、hive的仓库目录
cdh集群默认的仓库目录位置,当然可以自己定义。
2、zookeeper服务选择
yarn与hdfs对接的这个
3、权限控制
建议cdh就不用提什么权限控制了,客户端越权操作基本上大家都知道了,反正个人觉得没啥软用。
4、继承权限
启用了hdfs的acl后这里就要启用,这样有一定的权限控制作用。
因为我不是大数据开发,所以基本不会碰数据,只是偶尔的功能测试或者hive程序问题处理,所以下面总结了一些hive的job参数基本都是平时大数据开发的同事总结的,仅供参考。
二、hive job优化
1、解决数据倾斜,负载均衡 如果没有数据倾斜不要加浪费资源,比如groupby
代码语言:javascript复制set hive.groupby.skewindata=true;
2、设置reduce最大个数 (reduce端数据量大可以不加,比如最终结果在600g以上,通过 hive.exec.reducers.bytes.per.reducer 限制reduce个数)
代码语言:javascript复制set hive.exec.reducers.max=300;
3、job名
代码语言:javascript复制set mapreduce.job.name=whx_test;
4、队列名
代码语言:javascript复制set mapreduce.job.queuename=ia;
5、cli窗口带scheme
代码语言:javascript复制set hive.cli.print.header=true;
6、map预聚合
代码语言:javascript复制set hive.map.aggr=true;
7、map内存
代码语言:javascript复制set mapreduce.map.memory.mb=2048;
8、reduce
代码语言:javascript复制set mapreduce.reduce.memory.mb=4096;
9、根据map端shuffle输出数据量 判断多大数据量启用一个reduce,而且reduce个数决定输出数据的文件数
代码语言:javascript复制set hive.exec.reducers.bytes.per.reducer=2147483648;
10、是否对最终输出数据压缩
代码语言:javascript复制set hive.exec.compress.output=true;
11、最终输出数据压缩方式 压缩方式根据需求改变 snappy gz lz4 org.apache.hadoop.io.compress.SnappyCodec
代码语言:javascript复制set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
12、最终输出数据压缩类型
代码语言:javascript复制set mapred.output.compression.type=BLOCK;
13、中间shuffle数据是否压缩
代码语言:javascript复制set hive.exec.compress.intermediate=true;
14、中间shuffle数据压缩方式
代码语言:javascript复制set hive.intermediate.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
15、中间shuffle数据压缩类型
代码语言:javascript复制set hive.intermediate.compression.type=BLOCK;
16、在Map-only的任务结束时合并小文件
代码语言:javascript复制set hive.merge.mapfiles=true;
17、在Map-Reduce的任务结束时合并小文件
代码语言:javascript复制set hive.merge.mapredfiles=true;
18、当输出文件的平均大小小于该值时,启动一个独立的map-reduce任务进行文件merge
代码语言:javascript复制set hive.merge.smallfiles.avgsize=134217728;
19、合并文件的大小
代码语言:javascript复制set hive.merge.size.per.task=536870912;
20、决定每个map处理的最大文件大小(结合CombineHiveInputFormat可以合并小文件)
代码语言:javascript复制set mapred.max.split.size=1073741824;
set mapred.min.split.size.per.node=1073741824;
set mapred.min.split.size.per.rack=1073741824;
21、决定输入格式 合并小文件(或者block)
代码语言:javascript复制set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
22、是否支持可切分的CombineInputFormat 合并输入小文件此参数必须加否则不生效
代码语言:javascript复制set hive.hadoop.supports.splittable.combineinputformat=true;
23、具体小文件问题参数归类
代码语言:javascript复制set hive.merge.mapfiles=true;
set hive.merge.mapredfiles=true;
set hive.merge.size.per.task=1073741824;
set hive.merge.smallfiles.avgsize=1073741824;
set hive.exec.compress.output=true;
set mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
set mapred.output.compression.type=BLOCK;
关于小文件的问题,以前有写过fsimage解析,具体的集群治理操作后续会看时间写出来,大家有兴趣可以留言交流。