【问题标题】:Hive's Bucket Map JoinHive 的 Bucket Map Join
【发布时间】:2016-07-25 22:14:50
【问题描述】:

我有一个 Hadoop 集群,我使用 Hive 进行查询,我想加入两个大表,其中一个有小桶,从我读到的内容看来,如果我将两个表都存储在 join-key 上,那将帮助性能。

所以我的设置是:

  • 将连接键上的两个表分桶到相同数量的桶中,
  • 较小的表的存储桶适合内存,
  • 设置 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呢?为什么它不上传raw bucket然后在map任务中进行hash,从而实现并行处理和更快的速度?

【问题讨论】:

    标签: database join hadoop hive


    【解决方案1】:

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

    回答: 1)如果“Total table/partition size很大,不适合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;

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

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多