在Hive中的许多表上执行有效的连接

时间:2016-06-16 22:37:35

标签: hadoop join optimization hive query-optimization

我正在加入大约14个表来在Hive 1.2中创建基表。每个表都有数百万条记录,这些是执行查询时使用的参数

hive.exec.dynamic.partition=true;  
hive.exec.max.dynamic.partitions.pernode=200000;  
hive.exec.max.dynamic.partitions=200000;  
hive.exec.max.created.files=250000;  
hive.enforce.bucketing=true;  
hive.auto.convert.join=false;  
mapreduce.map.memory.mb=8192;  
mapreduce.reduce.memory.mb=8192;  
mapred.reduce.child.java.opts=-Xmx8096m;  
mapred.map.child.java.opts=-Xmx8096m;  
hive.exec.dynamic.partition.mode=nonstrict;   

我正在使用ORC文件格式,并根据ID对表进行分区,并根据年份,季度和月份对表进行分区。该表显然在加入方面执行大量计算。请让我知道任何其他参数或执行可用于更有效地执行联接的不同策略

1 个答案:

答案 0 :(得分:0)

您还可以查看源表中文件和文件块的大小。每个完成的连接基本上都是针对每个文件块完成的,因此增加文件/块的大小意味着需要进行较少的连接。另一方面,较大的文件/块意味着较少的并行化,因此需要进行一些测试以找到正确的平衡。您可以通过使用下面的设置进行小文件合并来调整块大小。这些设置还将为每个文件生成1个块,这在大多数情况下非常适合性能。

-- config settings to be added to the DML that loads your source tables
-- these will merge the files into 500MB files with only one block per file
-- as long as the block size is set higher than the file size then only one block will be produced
set hive.merge.smallfiles.avgsize = 524288000;
set dfs.block.size = 1073741824;