1

我有一个 Hadoop 集群,我使用 Hive 进行查询,我想加入两个大表,其中一个有小桶,从我读到的内容看来,如果我将两个表都存储在连接键上,这将有助于提高性能.

所以我的设置是:

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

问题一:以上设置是否足以触发bucket map join?

问题2:我对bucket map join的理解是,它启动一个本地任务,创建每个bucket的hash表,然后将hashed buckets上传到每个mapper。这种理解正确吗?

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

4

1 回答 1

-1

以上设置是否足以触发bucket map join?

答:1)如果“总表/分区大小很大,不适合map join”,那就去bucket map join。所需的设置是:设置 hive.optimize.bucketmapjoin = true;

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

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

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

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

答:如果文件很大,那么我们将遇到以下问题 i- 大哈希表文件会减慢分布式缓存的传播。ii- 映射器正在等待来自分布式缓存的哈希表文件。

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

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

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

于 2016-07-24T03:30:18.207 回答