如何在mapreduce中传递文件作为参数

时间:2015-06-05 18:59:06

标签: java caching hadoop

我想搜索文件中的特定单词并显示其计数。当要搜索的单词是单个单词时,我可以通过在驱动程序中设置配置来完成,如下所示:

驱动程序类:

Configuration conf = new Configuration();
    conf.set("wordtosearch", "fun"); 

Mapper类:

public static class SearchMapper extends
        Mapper<LongWritable, Text, Text, IntWritable> {
    // Map code goes here.
    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();


    public void map (LongWritable Key, Text value,Context context )throws IOException,InterruptedException{


         Configuration conf = context.getConfiguration();
            //retrieve the wordToSearch variable
            String wordToSearch = conf.get("wordtosearch");
        String txt= value.toString();



        if(txt.compareTo(wordToSearch)==0){
            word = context.getCurrentValue();
            context.getCurrentKey();
            word.set(txt);
            context.write(word, one);

        }

但是当文件中有单词列表时,我不知道如何传递它。有些帖子指的是使用分布式缓存,但在这样做时我得到了#34;分布式缓存已被弃用&#34;错误。新api中是否有类似的方法来传递文件?

3 个答案:

答案 0 :(得分:0)

你可以试试这个:判断参数是否是一个文件,然后根据参数的类型分别执行操作

答案 1 :(得分:0)

如果单词列表的大小合理,您仍然可以将其传递给配置:

  1. 驱动程序类:读取文件
  2. 驱动程序类:在配置中添加单词列表,例如conf.set(“wordListToSearch”,“fun:foo:bar”
  3. Mapper类:阅读配置并检索单词列表

答案 2 :(得分:0)

是的,新API中还有一种方法。

首先,将文件存储在HDFS中。然后,在Driver类(在main方法中)中,执行以下操作:

Configuration conf = getConf(); 
... 
Job job = Job.getInstance(conf); ...   
job.addCacheFile(new Path(filename).toUri());

最后,在mapper类中(例如在setup()方法中),执行以下操作:

URI[] localPaths = context.getCacheFiles();

如果您有一个文件,则应将其存储在localPaths[0]中。