我的表(mytable~365 gb)包含2年的客户行为数据。它按天进行分区,并按客户id聚集到64个存储桶中。平均一天包含800万个条目。
我的任务是每天检索客户(约512MB),并回顾他们的行为—例如,过去两年的购买数量。
在我的理解中,左半联接在这里是适用的,例如:
WITH TabA as (SELECT cid, NUM_PURCHASES from MyTable where dt>= '20161001' and dt <= '20181001'),
TabB as (SELECT cid from MyTable where dt='20181001')
SELECT TabA.cid as ID,
SUM(TabA.NUM_PURCHASES) as total_p
FROM TabA LEFT SEMI JOIN TabB on (TabB.cid = TabA.cid) GROUP BY TabA.cid;
由于我的表被扣住了,我严重依赖于发布在配置单元连接优化中的连接优化建议。因此,在hive上设置了以下参数(请注意,tez在我的环境中不起作用):
set hive.auto.convert.join=true;
SET hive.variable.substitute.depth=150;
set hive.auto.convert.join=true;
set hive.optimize.skewjoin.compiletime=true;
set hive.optimize.skewjoin=true;
set hive.enforce.bucketing = true;
set hive.input.format=org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat;
set hive.optimize.bucketmapjoin=true;
set hive.optimize.bucketmapjoin.sortedmerge=true;
set hive.exec.parallel=true;
set hive.vectorized.execution.enabled = true;
set hive.vectorized.execution.reduce.enabled = true;
set hive.vectorized.execution.reduce.groupby.enabled = true;
set hive.cbo.enable=true;
SET mapred.child.java.opts=-Xmx4G -XX:+UseConcMarkSweepGC -XX:-UseGCOverheadLimit;
set mapreduce.map.memory.mb=9216;
set mapreduce.reduce.memory.mb=9216;
最后三行是因为我有记忆问题而添加的。
我的查询在第一个作业中失败。Map程序被执行,直到100%,一旦还原程序(似乎)开始工作得到重置,并再次失败。群集管理器报告java堆空间内存问题。我也尝试过减少每个Map器(6gb,4gb)和reducer(8gb,7gb,6gb)的内存-所有的组合,但是我得到了相同的错误。
有人能给我一个见解吗?a)如何使这项工作,b)我应该为每个Map器/还原器分配多少空间,c)如果我的查询可以优化(即,在左半联接之前按cid分组)?
暂无答案!
目前还没有任何答案,快来回答吧!