【问题标题】:Why is sort by always using single reducer?为什么总是使用单个减速器进行排序?
【发布时间】:2012-09-02 04:10:02
【问题描述】:

我正在尝试执行以下查询,并且加载数据需要很长时间,因为第二个作业只使用了一个 reducer。

插入表 ddb_table SELECT * FROM data_dump sort by rank desc LIMIT 1000000;

为上述查询创建了两个作业。第一项工作运行得非常快,因为它使用了 80 个映射器和大约 22 个减速器。第二个作业映射器很快,但由于单个减速器,它非常慢。

我尝试使用 set mapred.reduce.tasks=35 增加 reducer 数量,但有趣的是,它只应用于第一个作业,而不是第二个作业。

为什么使用单个减速器?是因为 sort by 子句吗? 如何设置最大减速器?

有没有更好的方法?

【问题讨论】:

    标签: hadoop hive


    【解决方案1】:

    我并不肯定,但我的直觉是这是因为“限制”,而不是“排序依据”。事实上,“排序依据”显式只会在每个 reducer 中排序,因此您不会得到总排序。

    问题在于,如果有多个 reducer,它们的协调程度不够高,无法知道何时达到 1000000 条记录。所以要做limit,必须只有一个reducer,它维护一个记录数的count,一旦达到limit就停止输出新的。

    事实上,即使可以对多个减速器进行“排序依据”和“限制”,您也可以在不同的运行中获得不同的输出,具体取决于哪个减速器运行速度最快,所以我不认为你是什么首先在这里尝试这样做是有道理的。

    【讨论】:

    • 好吧,我从 order by 开始,但由于 order by 使用单个减速器,我将其更改为 order by 子句。我要做的是真正选择按排名列排序后的前百万条记录。
    【解决方案2】:

    这只是在 Hadoop 中使用默认 Partitioner 进行排序的方式。默认分区使用 hashcode mod 数量的 reducer,所以如果你想要 35 个 reducer,你将得到 35 个输出文件,每个文件都经过排序,但范围重叠。例如,您有以字母字符 [a..z] 开头的键:file1 (a1,a2,a15,d3,d5,f6)、file2(a3,a5,b1,z3) 等。 为了避免重叠的键范围,您需要一个 Reducer,或者您需要让您的分区器更加了解键的性质,例如让您的分区器将具有相同第一个字符的所有键引导到同一个分区中,因此输出中会有多个文件,但没有一个范围会重叠。例如 file1 (a1,a2,a3,a5,a15), file2(b1),file3(....) file4(d3,d6) 等。 当我使用标准 Hadoop 作业或 Apache PIG 时,它适用。不幸的是,我没有 Hive 经验,但您可以尝试在要插入的表上使用动态分区。

    【讨论】:

    • Hive "sort by" 对每个 reducer 进行排序,因此您会像第一个示例一样获得多个文件:file1 (a1,a2,a15,d3,d5,f6),文件 2(a3,a5,b1,z3)。 Hive "order by" 进行总排序并且只使用一个 reducer。
    猜你喜欢
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-14
    • 2018-11-20
    相关资源
    最近更新 更多