读书笔记: Hadoop应用架构

https://book.douban.com/people/fleure/annotation/26971353/

分桶

如果关联的数据集恰好按照关联的键分桶,而且一个数据集中桶的数量是另一个的倍数,那么就足够单独关联相应的桶,而不需要关联整个数据集了。着显著降低了两个数据集执行 Reduce 端关联(Reduce-side join) 的时间复杂度。这是因为 Reduce 端的关联非常消耗资源。但是,如果关联的是两个桶数据集,而不是两个整数数据集,那么关联相应的桶即可。这样就可以减少关联消耗。当然,来自两个表的不同的桶可以并行关联。另外,分桶之后的数据量通常都比较小,一般能够放入内存。所以整个关联操作可以在 Map-Reduce 任务的 Map 阶段将小桶加载到内存中进行。这就是所谓的 Map 端关联(Map-side join)。与 Reduce 端关联相比,它的性能更好。如果使用 Hive 进行数据分析,应该能自动识别分桶的表并执行这种优化。

如果桶中的数据时有序的(sorted),那么就可以使用合并连接(merge join),而且关联时不会将整个桶都存入内存。这比简单的桶关联(bucket join)更快,而且更加节省内存。Hive 也支持这种优化。注意,任何一个表都可以分桶,在没有逻辑意义的分区点上也是如此。对于经常进行关联操作的大表,最好对数据进行排序和分桶,而且要按照关联字段分桶。