我需要在mapreduce程序中使用全局变量,如何在下面的代码中设置它并在reducer中使用全局变量。
public class tfidf
{
public static tfidfMap..............
{
}
public static tfidfReduce.............
{
}
public static void main(String args[])
{
Configuration conf=new Configuration();
conf.set("","");
}
}
答案 0 :(得分:6)
模板代码可能看起来像这样(Reducer未显示,但是是相同的主体)
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Mapper.Context;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
public class ToolExample extends Configured implements Tool {
@Override
public int run(String[] args) throws Exception {
Job job = new Job(getConf());
Configuration conf = job.getConfiguration();
conf.set("strProp", "value");
conf.setInt("intProp", 123);
conf.setBoolean("boolProp", true);
// rest of your config here
// ..
return job.waitForCompletion(true) ? 0 : 1;
}
public static class MyMapper extends
Mapper<LongWritable, Text, LongWritable, Text> {
private String strProp;
private int intProp;
private boolean boolProp;
@Override
protected void setup(Context context) throws IOException,
InterruptedException {
Configuration conf = context.getConfiguration();
strProp = conf.get("strProp");
intProp = conf.getInt("intProp", -1);
boolProp = conf.getBoolean("boolProp", false);
}
}
public static void main(String args[]) throws Exception {
System.exit(ToolRunner.run(new ToolExample(), args));
}
}
答案 1 :(得分:4)
在集群(本地除外)环境中,如果map / reduce程序是用Java编写的(其他语言的单独进程),MapReduce程序就会运行自己的JVM。这样,您无法在类中声明静态变量和值,并在MapReduce流中继续更改并期望另一个JVM中的值。您需要一个共享对象,以便mapper / reduce可以设置并获取值。
实现这一目标的方法很少。
正如Chris所提到的,使用Configuration set()/ get()方法将值传递给mapper和/或reducer。在这种情况下,您必须在创建作业之前将值设置为Configuration对象。
使用HDFS文件写入数据并从mapper / reducer中读取。请记住清理上面创建的HDFS文件。
答案 2 :(得分:2)
Hadoop计数器(用户定义)是另一种全局变量。作业完成后可以查看这些值。 例如:如果要计算输入中的错误/良好记录数(由各种映射器/缩减器处理),您可以选择计数器。 @Mo:您可以根据需要使用计数器