如何使用Hive处理偏斜数据?

时间:2016-03-22 06:38:08

标签: hadoop hive inner-join jointable

我正在蜂巢中进行连接操作。但当减速器达到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;

所以请建议可能的解决方案。我如何处理这种数据的连接操作。

3 个答案:

答案 0 :(得分:1)

从Hive 0.10.0开始,表可以创建为倾斜或更改为倾斜(在这种情况下,在ALTER语句之后创建的分区将被倾斜)。此外,通过指定STORED AS DIRECTORIES选项,倾斜表可以使用列表存储功能。有关详细信息,请参阅DDL文档:Create TableSkewed TablesAlter 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.