如果使用MapReduce执行的操作不是可交换和关联的,则组合器不能与还原器相同。
例如,当计算平均值时,组合器对键的值求和,减法器求和,然后将和除以该键的值总数。组合器的代码只有一点修改。如果您可以将同一个类用于组合器和减速机,并拥有一个可以确定当前任务是组合器还是减速机的代码库,会怎么样?如果它发现它是一个减法器,则它将总和除以计数。
大概是这样的:
protected void reduce(Text keyIn, Iterable<PairWritable> valuesIn,
Context context)
throws IOException, InterruptedException {
double sum = 0.0d;
long count = 0l;
for (PairWritable valueIn : valuesIn) {
sum += valueIn.getSum();
count += valueIn.getCount();
}
if (THIS_IS_A_REDUCER) {
sum /= count;
}
context.write(keyIn, new PairWritable(sum, count));
}
这样做可能吗?上面的代码< code>THIS_IS_A_REDUCER的和平可以用什么东西代替吗?
我可以从任务尝试ID字符串中确定任务是映射器还是缩减器,但是组合器和缩减器似乎都有相似的字符串模式。
我想你可以询问上下文
对象并获取任务ID。然后,一旦你有了ID,映射器(包括合并器)将在名称中有一个“m”,而化简器将在名称中有一个“r”。
要获取任务尝试ID,请使用.getTaskAttentid()。我认为您应该能够在上下文中执行。gettaskattentid()
来使用它,但我无法确定是否测试它。
虽然我知道这个问题已经解决了,但我有另一个解决方案。我所做的是使我的组合器成为减速机的一个子类。然后在Reducer代码中,我能够测试我是否是组合器子类。
这样做的主要好处是,我需要在Reducer步骤中修改我的键,但不想在合并步骤中改变它(否则我会将同一个转换应用两次)。除此之外,95%的代码都是相同的。
这是一个有缺陷的问题。每当您发现有必要区分哪个减少()任务调用时。添加一个组合器。例如,你写
public static class Combine extends MapReduceBase implements Reducer<Text, Text, Text, Text> {
public void reduce(Text key, Iterator<Text> message, OutputCollector<Text, Text> output, Reporter reporter) throws IOException {}
public static class Reduce extends MapReduceBase implements Reducer<Text, Text, Text, Text> {
public void reduce(Text key, Iterator<Text> message, OutputCollector<Text, Text> output, Reporter reporter) throws IOException {}
在 main() 中,您编写
conf.setReducerClass(Reduce.class);
conf.setCombinerClass(Combine.class);
我想在PC和手机上使用不同的应用程序,那么在加载应用程序之前,最好的方法是什么?
我有一大堆Scalaz任务。创建方式如下: 我希望这些任务并行运行。以随机顺序打印数字,不要花5秒钟(每个任务有50个任务和100毫升睡眠)。 但是,很明显,每个任务需要100毫秒,所有任务都需要5秒钟,并且创建的列表是有序的。 如何并行运行它们?任务在哪里运行线程?
问题内容: 我想针对AJAX请求与常规请求以不同的方式处理错误。 如何在Struts2操作中确定请求是否为AJAX? 问题答案: 您应该检查请求标头是否存在并且等于。 请注意,并非所有AJAX请求都具有此标头,例如,请求不发送该标头。如果您是使用(或使用任何其他新的AJAX框架)生成AJAX调用,则该文件就在那里。 您可以使用… 检查它是否存在,例如,当您对Stack Overflow投票时;)
在实验了2个reducer之后,阅读了Hadoop Wiki中的HowManyMapsAndReduces,Hadoop:reducer的数量保持不变,并且设置了映射任务和reduce任务的数量,我得到的结论是: 如果我有1个map(我知道这个数字实际上是由Hadoop决定的)和2个reducer(实际上我只提供了1个带有reducer代码的文件,例如),那么下面会发生什么? null 我想第一个
问题内容: 用Java编写了一个随机模拟,该模拟从磁盘上的几个CSV文件加载数据(总计约100MB),并将结果写入另一个输出文件(数据不多,只有布尔值和几个数字)。还有一个参数文件,对于不同的参数,模拟输出的分布可能会发生变化。为了确定正确/最佳的输入参数,我需要针对多个输入参数配置运行多个模拟,并查看每组中输出的分布。根据参数和随机性,每次仿真需要0.1-10分钟。 我一直在阅读有关Hadoop
在使用TensorFlow Lite库时,有没有办法确保或至少在运行时确定使用了正确的加速器(CPU、GPU)? 尽管我已经按照指南设置了对象在具有GPU(Samsung S9)的设备上使用GPU委托,但在某些情况下很可能使用CPU。例如,如果您使用带有默认委托选项对象的量化模型,它将默认使用CPU,因为设置为false。我几乎可以肯定,即使传递给解释器的选项对象有,但还是使用了CPU。不幸的是,