Hadoop:reducer的输入记录数

Hadoop:reducer的输入记录数,hadoop,mapreduce,Hadoop,Mapreduce,是否每个reducer进程都可以确定它必须处理的元素或记录的数量?您的reducer类必须扩展MapReducer Reduce类: Reducer 然后必须使用扩展reduce类中指定的KEYIN/VALUEIN参数实现reduce方法 reduce(输入键、可编辑值、, org.apache.hadoop.mapreduce.Reducer.Context) 与给定键关联的值可以通过 int count = 0; Iterator<VALUEIN> it = values.ite

是否每个reducer进程都可以确定它必须处理的元素或记录的数量?

您的reducer类必须扩展MapReducer Reduce类:

Reducer

然后必须使用扩展reduce类中指定的KEYIN/VALUEIN参数实现reduce方法

reduce(输入键、可编辑值、,
org.apache.hadoop.mapreduce.Reducer.Context)

与给定键关联的值可以通过

int count = 0;
Iterator<VALUEIN> it = values.iterator();
while(it.hasNext()){
  it.Next();
  count++;
}

现在,如果您知道将设置列的#,您可以修改它以使用数组向量,这可能会更快/更节省空间。

您的reducer类必须扩展MapReducer Reduce类:

Reducer

然后必须使用扩展reduce类中指定的KEYIN/VALUEIN参数实现reduce方法

reduce(输入键、可编辑值、,
org.apache.hadoop.mapreduce.Reducer.Context)

与给定键关联的值可以通过

int count = 0;
Iterator<VALUEIN> it = values.iterator();
while(it.hasNext()){
  it.Next();
  count++;
}

现在,如果您知道将设置列的#,您可以修改此设置以使用数组向量,这可能会更快/更节省空间。

简短回答-提前不,减缩器不知道iterable支持多少值。唯一可以做到这一点的方法是在迭代时进行计数,但不能再次对iterable进行迭代

长答案-支持iterable实际上是序列化键/值对的排序字节数组。reducer有两个比较器——一个用于按键顺序对键/值对进行排序,另一个用于确定键之间的边界(称为键分组)。通常,密钥分组与密钥排序比较器相同

当迭代特定键的值时,基础上下文检查数组中的下一个键,并使用分组比较器将其与上一个键进行比较。如果比较器确定它们相等,则迭代继续。否则,此特定键的迭代将结束。因此,您可以看到,您无法提前确定如何为任何特定键传递值

如果您创建一个复合键,比如一个Text/intwriteable对,您实际上可以看到这一点。对于compareTo方法,首先按文本排序,然后按IntWritable字段排序。接下来创建一个比较器用作组比较器,它只考虑键的文本部分。现在,当您迭代reducer中的值时,您应该能够观察到键的可写部分随着每次迭代而变化


我以前用过的一些代码演示了这个场景,可以在这个简短的回答中找到-提前不,reducer不知道iterable支持多少值。唯一可以做到这一点的方法是在迭代时进行计数,但不能再次对iterable进行迭代

长答案-支持iterable实际上是序列化键/值对的排序字节数组。reducer有两个比较器——一个用于按键顺序对键/值对进行排序,另一个用于确定键之间的边界(称为键分组)。通常,密钥分组与密钥排序比较器相同

当迭代特定键的值时,基础上下文检查数组中的下一个键,并使用分组比较器将其与上一个键进行比较。如果比较器确定它们相等,则迭代继续。否则,此特定键的迭代将结束。因此,您可以看到,您无法提前确定如何为任何特定键传递值

如果您创建一个复合键,比如一个Text/intwriteable对,您实际上可以看到这一点。对于compareTo方法,首先按文本排序,然后按IntWritable字段排序。接下来创建一个比较器用作组比较器,它只考虑键的文本部分。现在,当您迭代reducer中的值时,您应该能够观察到键的可写部分随着每次迭代而变化


我以前使用过的一些代码演示了这个场景,可以在这个

上找到。您是否试图在reducer类中获取与给定键关联的值的数量?@ryanbwork是。顺便说一句,我的印象是,每个减速机都将使用一个唯一的键及其关联的值,对吗?@ryanbwork看不到您的答案。@ryanbwork它是不正确的。reducer一次将获得一个唯一的键,但在映射/还原之前,单个reducer将获得多个键finished@ArnonRotem-谢谢你的澄清;因此,对于发送到给定reducer节点的所有键,都会重用一个reducer实例?是否尝试获取reducer类中与给定键关联的值的数量?@ryanbwork yes。顺便说一句,我的印象是,每个减速机都将使用一个唯一的键及其关联的值,对吗?@ryanbwork看不到您的答案。@ryanbwork它是不正确的。reducer一次将获得一个唯一的键,但在映射/还原之前,单个reducer将获得多个键finished@ArnonRotem-谢谢你的澄清;因此,对于发送到给定reducer节点的所有键,都可以重用一个reducer实例?我已经想到了这种技术。但考虑到巨大的数据量(每个密钥约3 mil),我不得不放弃它。当然,问题是这个Iterable没有一个“size”方法来知道数据的大小。还有其他建议吗?@stholy你能告诉我你在做什么样的处理吗?在将这些集合发送到还原器之前,可以在映射器(或组合器)中获取子集的总和。作业的输入是csv文件,包含大约4mil记录。每个映射器将发出最后一个_字段和所有_字段。减速器必须将所有字符串加载到二维字符串数组中。T
table.get(N).get(M);