gpt4 book ai didi

java - Hadoop - 映射器的构造函数参数

转载 作者:可可西里 更新时间:2023-11-01 14:15:52 24 4
gpt4 key购买 nike

在 Hadoop 中有什么方法可以将构造函数参数传递给 Mapper?可能是通过一些包装了 Job 创建的库?

这是我的场景:

public class HadoopTest {

// Extractor turns a line into a "feature"
public static interface Extractor {
public String extract(String s);
}

// A concrete Extractor, configurable with a constructor parameter
public static class PrefixExtractor implements Extractor {
private int endIndex;

public PrefixExtractor(int endIndex) { this.endIndex = endIndex; }

public String extract(String s) { return s.substring(0, this.endIndex); }
}

public static class Map extends Mapper<Object, Text, Text, Text> {
private Extractor extractor;

// Constructor configures the extractor
public Map(Extractor extractor) { this.extractor = extractor; }

public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
String feature = extractor.extract(value.toString());
context.write(new Text(feature), new Text(value.toString()));
}
}

public static class Reduce extends Reducer<Text, Text, Text, Text> {
public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
for (Text val : values) context.write(key, val);
}
}

public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = new Job(conf, "test");
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
job.setMapperClass(Map.class);
job.setReducerClass(Reduce.class);
job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
job.waitForCompletion(true);
}
}

应该清楚的是,由于 Mapper 仅作为类引用 (Map.class) 提供给 Configuration,Hadoop 无法传递构造函数参数并配置特定的提取器。

有一些 Hadoop 包装框架,如 Scoobi、Crunch、Scrunch(可能还有更多我不知道的框架)似乎具有此功能,但我不知道它们是如何实现的。 编辑: 在与 Scoobi 进行更多合作后,我发现我在这方面有部分错误。如果您在“映射器”中使用外部定义的对象,Scoobi 要求它是可序列化的,如果不是,则会在运行时提示。所以也许正确的方法只是让我的 Extractor 可序列化并在 Mapper 的设置方法中反序列化它...

此外,我实际上在 Scala 工作,因此绝对欢迎基于 Scala 的解决方案(如果不鼓励的话!)

最佳答案

我建议通过您正在创建的 Configuration 对象告诉您的映射器要使用哪个提取器。映射器在其 setup 方法 (context.getConfiguration()) 中接收配置。似乎您不能将对象放入配置中,因为它通常是从 XML 文件或命令行构造的,但您可以设置一个枚举值并让映射器自己构造其提取器。创建映射器后对其进行自定义不是很好,但这就是我解释 API 的方式。

关于java - Hadoop - 映射器的构造函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8141606/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com