【问题标题】:the executing process of common join in hivehive中common join的执行过程
【发布时间】: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。

【问题讨论】:

    标签: join mapreduce hive


    【解决方案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

      希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-09
        • 1970-01-01
        相关资源
        最近更新 更多