我正在蜂巢中进行连接操作。但当减速器达到99%时,减速器会卡住。
然后我发现表中存在偏斜数据。 防爆。在表A中有100万个数据,表B只有10k。在表A中,连接列有80%的值是相同的,其余是其他的。因此蜂巢减速机坚持这个价值。
这是我的问题:
INSERT INTO TABLE xyz SELECT m.name, m.country, m.user_type, m.category FROM A m JOIN category n ON (m.name = n.name) where country=2 GROUP BY m.name, m.country, m.user_type, m.category;
所以请建议可能的解决方案。我如何处理这种数据的连接操作。
答案 0 :(得分:1)
从Hive 0.10.0开始,表可以创建为倾斜或更改为倾斜(在这种情况下,在ALTER语句之后创建的分区将被倾斜)。此外,通过指定STORED AS DIRECTORIES选项,倾斜表可以使用列表存储功能。有关详细信息,请参阅DDL文档:Create Table,Skewed Tables和Alter Table Skewed or Stored as Directories
供参考使用此link。
答案 1 :(得分:0)
找到了解决上述问题的方法。
在执行hive join之前将参数设置为hive。
set hive.optimize.skewjoin=true;
set hive.skewjoin.key=100000;
set hive.skewjoin.mapjoin.map.tasks=10000;
set hive.skewjoin.mapjoin.min.split=33554432;
set hive.exec.parallel=true;
set hive.exec.parallel.thread.number=8;
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 hive.compute.query.using.stats=true;
set hive.stats.fetch.partition.stats=true;
set hive.stats.fetch.column.stats=true;
set hive.stats.autogather=true;
set mapred.output.compress=true;
set hive.exec.compress.output=true;
set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
set hive.auto.convert.join=false;
根据您的数据大小和群集大小,很少需要更改参数。
答案 2 :(得分:0)
您可以尝试使用MapJoin,如下所示:
set hive.auto.convert.join = true;
set hive.mapjoin.smalltable.filesize=25000000; -- This default value is 25MB, you can change it.