Hadoop 为什么分拣总是使用单减速器?

Hadoop 为什么分拣总是使用单减速器?,hadoop,hive,Hadoop,Hive,我正在尝试执行以下查询,加载数据要花很长时间,因为第二个作业只使用一个reducer 插入到表ddb_表中 从数据转储中选择*按等级描述排序限制1000000 将为上述查询创建两个作业。第一个作业运行非常快,因为它使用80个映射器和大约22个还原器。第二个作业映射器速度很快,但由于只有一个减速器,所以速度非常慢 我尝试使用set mapred.reduce.tasks=35来增加减速机数量,但有趣的是,它仅适用于第一个作业,而不适用于第二个作业 为什么使用单个减速器?是因为排序依据条款吗? 如何

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

插入到表ddb_表中 从数据转储中选择*按等级描述排序限制1000000

将为上述查询创建两个作业。第一个作业运行非常快,因为它使用80个映射器和大约22个还原器。第二个作业映射器速度很快,但由于只有一个减速器,所以速度非常慢

我尝试使用set mapred.reduce.tasks=35来增加减速机数量,但有趣的是,它仅适用于第一个作业,而不适用于第二个作业

为什么使用单个减速器?是因为排序依据条款吗? 如何设置最大减速器


有更好的方法吗?

这就是Hadoop中使用默认分区器进行排序的方法。默认分区使用hashcode mod数量的减缩器,所以如果您想要35个减缩器,那么您将得到35个输出文件,每个文件都已排序,但范围重叠。例如,您有以字母字符[a..z]开头的键:file1(a1、a2、a15、d3、d5、f6)、file2(a3、a5、b1、z3)等。 为了避免重叠的键范围,您需要一个减缩器,或者需要让分区人员更了解键的性质,例如,让分区人员将具有相同第一个字符的所有键定向到同一分区中,这样输出中将有多个文件,但所有范围都不会重叠。例如文件1(a1、a2、a3、a5、a15)、文件2(b1)、文件3(..)文件4(d3、d6)等。
它适用于我使用标准Hadoop作业或ApachePig的情况。不幸的是,我没有配置单元过期,但您可以尝试在插入的表上使用动态分区

这正是Hadoop中使用默认分区器进行排序的方式。默认分区使用hashcode mod数量的减缩器,所以如果您想要35个减缩器,那么您将得到35个输出文件,每个文件都已排序,但范围重叠。例如,您有以字母字符[a..z]开头的键:file1(a1、a2、a15、d3、d5、f6)、file2(a3、a5、b1、z3)等。 为了避免重叠的键范围,您需要一个减缩器,或者需要让分区人员更了解键的性质,例如,让分区人员将具有相同第一个字符的所有键定向到同一分区中,这样输出中将有多个文件,但所有范围都不会重叠。例如文件1(a1、a2、a3、a5、a15)、文件2(b1)、文件3(..)文件4(d3、d6)等。
它适用于我使用标准Hadoop作业或ApachePig的情况。不幸的是,我没有配置单元过期,但您可以尝试在插入的表上使用动态分区

我不肯定,但我的直觉是,这是因为“限制”,而不是“排序依据”。事实上,“排序方式”只会显式地在每个减速机内排序,因此不会得到总排序

问题是,如果有多个还原器,它们之间的协调不够,无法知道何时达到1000000条记录。所以,要执行限制,必须只有一个减速机,它维护记录数的计数,并在达到限制后停止输出新记录


事实上,即使有可能对多个减速机进行“排序”和“限制”,根据哪个减速机运行得最快,在不同的运行中也会得到不同的输出,因此我认为您在这里尝试做的一开始就没有意义。

我不肯定,但我的直觉是,这是因为“限制”,而不是原因“排序依据”。事实上,“排序依据”只会显式地在每个减速机内排序,所以您不会得到总排序

问题是,如果有多个减缩器,它们之间的协调不够,无法知道何时达到1000000条记录。因此,要进行限制,必须只有一个减缩器,它可以保存记录数的计数,并在达到限制后停止输出新记录


事实上,即使可以对多个减速机执行“排序方式”和“限制”,根据哪个减速机运行得最快,您也可以在不同的运行中获得不同的输出,因此我认为您在这里尝试做的一开始就没有意义。

Hive“排序方式”“按减速机排序,因此预期会得到多个文件,如第一个示例:file1(a1、a2、a15、d3、d5、f6)、file2(a3、a5、b1、z3)。Hive“order by”进行总排序,只使用一个减速机。Hive“sort by”对每个减速机进行排序,因此预期会像第一个示例一样获得多个文件:file1(a1、a2、a15、d3、d5、f6)、file2(a3、a5、b1、z3)。Hive“order by”进行总排序,只使用一个减速机。我从order by开始,但由于order by使用一个减速机,所以我将其更改为order by子句。我要做的是,在按秩列排序后,真正选择前百万条记录。我从ORDERBY开始,但由于ORDERBY使用单个减缩器,所以我将其更改为ORDERBY子句。我想做的是,在按排名列排序后,真正选择前百万条记录。