Hive的Bucket Map加入

时间:2012-10-08 14:35:11

标签: database join hadoop hive

我有一个Hadoop集群,我使用Hive进行查询,我想加入两个大表,其中一个表有小桶,从我看来,似乎如果我把两个表都放在join-key上,那就行了帮助表现。

所以我的设置是:

  • 将连接键上的两个表分成相同数量的存储桶,
  • 小桌子的桶适合记忆,
  • set hive.optimize.bucketmapjoin = true;
  • 运行以下查询:
SELECT /*+ MAPJOIN(a) */
 count(*)
FROM a JOIN B ON  a.join_key = b.join_key;

问题1:以上设置是否足以触发桶地图加入?

问题2:我对桶映射连接的理解是,它启动了一个本地任务,它创建了每个桶的哈希表,然后向每个映射器上传哈希桶。这种理解是否正确?

问题3:如果上述理解正确,那么为什么Hive会在本地进行散列?为什么它不上传原始存储桶然后在map任务中进行散列,因此实现并行处理和更快的速度?

1 个答案:

答案 0 :(得分:-1)

以上设置是否足以触发桶地图加入?

答案: 1)如果"总表/分区大小很大,不适合地图连接",那么去桶地图连接。 需要的设置是:     set hive.optimize.bucketmapjoin = true;

2)如果"表格/分区大小没有限制非常大,即表格大小"然后去SortMerge桶连接。 需要的设置是:     set hive.optimize.bucketmapjoin = true;     set hive.optimize.bucketmapjoin.sortedmerge = true;     set hive.input.format = org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat;

我对桶映射连接的理解是它启动了一个本地任务,它创建了每个桶的哈希表,然后向每个映射器上载哈希桶。这种理解是否正确?

答案:在Bucket map join的情况下,1)hive运行本地map reduce join以创建HashTable文件,2)它压缩并归档文件并加载到分布式缓存(i-大型哈希表文件将减慢分布式传播 缓存。 ii- Mappers正在等待分布式缓存中的哈希表文件。 ) 3)加载到地图连接任务的映射器。

如果上述理解正确,那么为什么Hive会在本地进行散列?为什么它不上传原始存储桶然后在map任务中进行散列,从而实现并行处理和更快的速度?

答案:如果文件很大,那么我们将遇到以下问题 i-大型哈希表文件将减慢Distributed的传播速度 缓存。 ii- Mappers正在等待分布式缓存中的哈希表文件。

因此,执行以下步骤将提供更高的性能:

1)hive运行本地map reduce join来创建HashTable文件, 2)压缩和归档文件并加载到分布式缓存
3)加载到地图连接任务的映射器。

这比地图连接或普通连接提供了更好的性能。