篇首语:本文由编程笔记#小编为大家整理,主要介绍了hive优化相关的知识,希望对你有一定的参考价值。
QA集群
使用的是 solution队列。资源如上图所示,在$KYLIN_HOME/conf/kylin_job_conf.xml配置文件中,看到给map和reduce分配的内存大小都是1GB。
表名 | 行数 | 重复行数 | 是否分区表 | 类型 |
customer_address_text | 94000 | 0 | 否 | 维度表 |
customer_address_text_add | 6094000 | 0 | 否 | 维度表 |
customer_text | 188003 | 0 | 否 | 维度表 |
customer_text_add1 | 6188000 | 0 | 否 | 维度表 |
store_sales_reduce_text | 60639378 | 52000001 | 否 | 事实表 |
针对维表的大小分开进行2类测试,一类大的维度表,一类小的维度表,在对2类各做了内存修改的测试,分别为1G,2G,4G。因为在观测中发现,在cube构建第一步完成过程中,stage1和stage2 这2个stage 消耗时间长,所以着重记录了这2个步骤的时间。测试数据会在下面的截图体现出来。
1.配置文件项
The JobTracker won't attempt to read split metainfo files bigger than the configured value. No limits if set to -1.
|
在基准测试的配置文件中添加入以下参数
|
在基准测试的配置文件中添加入以下参数
|
这里会进行2次测试,一次不设置mapred.reduce.tasks 一次设置 mapred.reduce.tasks
The JobTracker won't attempt to read split metainfo files bigger than the configured value. No limits if set to -1.
|
补充说明:在较大维表类的mapjoin测试中,发现也产生了reduce过程,需加大 hive.auto.convert.join.noconditionaltask.size 参数值,该参数在kylin_hive_conf.xml文件中,并且在kylin_hive_conf.xml要加大mapreduce.map.java.opts参数值,一般需要加到内存参数值的70%-80%,(-Xmx640m-XX:MaxDirectMemorySize=256M -XX:OnOutOfMemoryError='kill -9 %p) 括号表示参数值,高亮部分替换即可。
如何生成大维度表
说明:上述测试中,维度表较小,并不能明显体现出修改参数带来的效果,所以,接下来的三组测试中维度表都是6百万的数据量,大小各在400MB左右
在hive上执行show create table table_name,获取建表语句,转换成mysql的见表语句
在mysql上建立表,更具hive上原有所对应的表设置自增列,指定具体值自增
3. CREATE TABLE `customer_text`( 4. `c_customer_sk` bigint UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, 5. `c_customer_id` varchar(20), 6. `c_current_cdemo_sk` bigint, 7. `c_current_hdemo_sk` bigint, 8. `c_current_addr_sk` bigint, 9. `c_first_shipto_date_sk` bigint, 10. `c_first_sales_date_sk` bigint, 11. `c_salutation` varchar(20), 12. `c_first_name` varchar(20), 13. `c_last_name` varchar(20), 14. `c_preferred_cust_flag` varchar(20), 15. `c_birth_day` int, 16. `c_birth_month` int, 17. `c_birth_year` int, 18. `c_birth_country` varchar(20), 19. `c_login` varchar(20), 20. `c_email_address` varchar(20), 21. `c_last_review_date` varchar(20)) 22. AUTO_INCREMENT=200000 |
比如建立个customer_text表
3.写存储过程往表里插入重复数据
delimiter $$$ CREATE PROCEDURE search_one () BEGIN
DECLARE i INT DEFAULT 0 ; SET i = 0 ; START TRANSACTION ; WHILE i <1000000 DO INSERT INTO customer_text ( c_customer_id, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_shipto_date_sk, c_first_sales_date_sk, c_salutation, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_day, c_birth_month, c_birth_year, c_birth_country, c_login, c_email_address, c_last_review_date ) VALUES ( "aaa", 1, 1, 1, 1, 1, "aaa", "aaa", "aaa", "aaa", 1, 1, 1, "aaa", "aaa", "aaa", "aaa" ) ; SET i = i + 1 ; END WHILE ; COMMIT ; END$$$
delimiter ; CALL search_one () ; |
导出为csv文件,load到hive中
大维度表测试
小维度表测试
维度表小于300M时,开启mapjoin,会提升cube构建第一步效率。
维度表超过300M, 在发生数据倾斜时候,设置skewjoin相关参数是最优解决方案。
发生数据倾斜,加大资源会导致并发数降低,虽然可以减少时间,但不是最优方案。
设置过多或者说不合理的reduce 数量,对构建效率会起到负作用。
hive.exec.reducers.max
这个参数控制一个job会有多少个reducer来处理,依据的是输入文件的总大小。默认1GB。
mapred.reduce.tasks
这个参数指定整个application执行的过程中会有多少个reduce执行
如果不指定mapred.reduce.tasks, hive会自动计算需要多少个reducer。
reduce的个数设置对执行效率有很大的影响:
1、如果reduce太少: 如果数据量很大,会导致这个reduce异常的慢,从而导致这个任务不能结束,也有可能会OOM
2、如果reduce太多: 产生的小文件太多,合并起来代价太高,namenode的内存占用也会增大
hive.groupby.mapaggr.checkinterval
这个是group的键对应的记录条数超过这个值则会进行分拆,值根据具体数据量设置
hive.groupby.skewindata
如果是group by过程出现倾斜应该设置为true
hive.skewjoin.key
这个是join的键对应的记录条数超过这个值则会进行分拆,值根据具体数据量设置
hive.optimize.skewjoin
如果是join 过程出现倾斜应该设置为true
hive.auto.convert.join
如果使用mapjoin,应该设置为true
以上参数对该两类测试的影响
hive.auto.convert.join的开启,在小维表时候效率明显,把2个小维表加载到内存和事实表join,避免了reduce操作,节省时间。hive.exec.reducers.max,mapred.reduce.tasks参数的设置增加了reduce数量,但同时由于设置数量过大,导致效率并没有明显变化,hive.skewjoin.key,hive.optimize.skewjoin,这两个参数在同类对比中测试效果中,表现突出。效率上得到很大提升。
通过hive.groupby.skewindata=true控制生成两个MR Job,第一个MR Job Map的输出结果随机分配到reduce做次预汇总,减少某些key值条数过多某些key条数过小造成的数据倾斜问题。
reduce数量由以下三个参数决定,
mapred.reduce.tasks(强制指定reduce的任务数量)
hive.exec.reducers.bytes.per.reducer(每个reduce任务处理的数据量,默认为1000000000=1G)
hive.exec.reducers.max(每个任务最大的reduce数,默认为999)
计算reducer公式N=min( hive.exec.reducers.max ,总输入数据量/ hive.exec.reducers.bytes.per.reducer )
个人测试心得:
1. 估算数据量输入大小,设置合适的reduce数量,如果重复记录多开启hive.optimize.skewjoin参数,设置hive.skewjoin.key大小。
2. 维度表小,且与事实表中关联的key不存在重复数据,应当开启mapjoin模式。
3. 依据数据量的大小,相应增加内存资源。