hive中common join的执行过程
Posted
技术标签:
【中文标题】hive中common join的执行过程【英文标题】:the executing process of common join in hive 【发布时间】:2013-08-07 03:35:02 【问题描述】:假设 A 在 A.a=B.a
上连接 B,并且它们都是大表。 Hive 会通过 common join 来处理这个 join 操作。执行图(由 facebook 提供):
但是我被这个图弄糊涂了,只有reducer吗?
据我了解,地图输出键为table_name_tag_prefix+join_key
。但是在分区阶段,它仍然使用 join_key 对记录进行分区。在reduce阶段,每个reducer读取具有相同join key的<join_key,value>
,reducer不需要读取所有的map split。
【问题讨论】:
【参考方案1】:reducer 的数量由hive.exec.reducers.bytes.per.reducer
定义(默认为 1GB)。
因此,对于映射器的每 GB 输入数据,您将获得 1 个 reducer。
然后,hive 在连接列上使用hash()
函数,并对哈希函数的输出进行模运算,并使用首先设置的减速器数量。
因此,如果您加载 10 GB 的数据(两个表一起),则应该有大约 10 个 reducer。
不可以说我们按列加入 ID
所以让我们假设下一个输出:hash(101)=101 -> 101%10=1
hash(102)=102 -> 102%10=2
hash(1001)=1001 -> 1001%10=1
所以 ID 列中值为 101 和 1001 的行将转到 reducer #1,ID 102 将转到 reducer #2。你仍然会有 10 个 reducer,但如果所有数据都只有上述 ID,那么 8 个 reducer 将没有输入,2 个 reducer 将得到其余的。
【讨论】:
【参考方案2】:理论上,只有一个reducer或不止一个reducer这两种情况。使用的 reducer 的确切数量将取决于查询详细信息。
您可以尝试在脚本中使用以下内容设置要使用的减速器数量。
set mapred.reduce.tasks=50
这是否真的会导致性能提升取决于您正在执行的查询。有关更多详细信息,另请参阅this answer。
希望对您有所帮助。
【讨论】:
以上是关于hive中common join的执行过程的主要内容,如果未能解决你的问题,请参考以下文章