我有一个Hadoop集群,我使用Hive进行查询,我想加入两个大表,其中一个表有小桶,从我看来,似乎如果我把两个表都放在join-key上,那就行了帮助表现。
所以我的设置是:
SELECT /*+ MAPJOIN(a) */
count(*)
FROM a JOIN B ON a.join_key = b.join_key;
问题1:以上设置是否足以触发桶地图加入?
问题2:我对桶映射连接的理解是,它启动了一个本地任务,它创建了每个桶的哈希表,然后向每个映射器上传哈希桶。这种理解是否正确?
问题3:如果上述理解正确,那么为什么Hive会在本地进行散列?为什么它不上传原始存储桶然后在map任务中进行散列,因此实现并行处理和更快的速度?
答案 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)加载到地图连接任务的映射器。
这比地图连接或普通连接提供了更好的性能。