Добрые люди из Stackoverflow,

Я запустил код mapreduce, который находит уникальные слова в файле. Входной набор данных (файл) находился в папке в HDFS. Поэтому я дал имя папки в качестве входных данных, когда запускал программу mapreduce.

Я не понимал, что в той же папке было еще 2 файла. Программа Mapreduce прочитала все 3 файла и выдала результат. Выход в порядке.

Это поведение mapreduce по умолчанию? Это означает, что если вы указываете на папку, а не только на файл (в качестве входного набора данных), mapreduce потребляет все файлы в этой папке? Причина, по которой я удивлен, заключается в том, что в картографе нет кода для чтения нескольких файлов. Я понимаю, что первым аргументом args [0] в программе драйвера является указанное мной имя папки.

Это код драйвера:

import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class DataSort {

     public static void main(String[] args) throws Exception {

/*
 * Validate that two arguments were passed from the command line.
 */
if (args.length != 2) {
  System.out.printf("Usage: StubDriver <input dir> <output dir>\n");
  System.exit(-1);
}

Job job=Job.getInstance();

/*
 * Specify the jar file that contains your driver, mapper, and reducer.
 * Hadoop will transfer this jar file to nodes in your cluster running 
 * mapper and reducer tasks.
 */
job.setJarByClass(DataSort.class);

/*
 * Specify an easily-decipherable name for the job.
 * This job name will appear in reports and logs.
 */
job.setJobName("Data Sort");

/*
 * TODO implement
 */
FileInputFormat.setInputPaths(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));

job.setMapperClass(ValueIdentityMapper.class);
job.setReducerClass(IdentityReducer.class);

job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);

job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);

/*
 * Start the MapReduce job and wait for it to finish.
 * If it finishes successfully, return 0. If not, return 1.
 */
boolean success = job.waitForCompletion(true);
System.exit(success ? 0 : 1);
  }
}

Код картографа:

import java.io.IOException;  
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

public class ValueIdentityMapper extends Mapper<LongWritable, Text, Text, IntWritable> {

 @Override
  public void map(LongWritable key, Text value, Context context)
  throws IOException, InterruptedException {

    String line=value.toString();
    for (String word:line.split("\\W+"))
    {
        if (word.length()>0)
        {
            context.write(new Text(word),new IntWritable(1));
        }
    }

 }

}

Код редуктора .

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

public class IdentityReducer extends Reducer<Text, IntWritable, Text, Text>    {

 @Override
 public void reduce(Text key, Iterable<IntWritable> values, Context context)
  throws IOException, InterruptedException {

    String word="";
    context.write(key, new Text(word));
  }
 }
0
basam nath 27 Июн 2016 в 23:57

1 ответ

Лучший ответ

Это поведение mapreduce по умолчанию?

Не из mapreduce, а только из используемого вами InputFormat.

FileInputFormat API Ссылка

setInputPaths(JobConf conf, Path... inputPaths)

Установите массив Path в качестве списка входных данных для задания сокращения карты.

Path API Ссылка

Называет файл или каталог в FileSystem.

Итак, когда вы говорите

нет кода для чтения нескольких файлов

Да, действительно есть, просто не нужно было писать об этом.

Mapper<LongWritable, Text, правильно обрабатывает все файловые смещения для всех файлов в указанном InputFormat.

0
Community 20 Июн 2020 в 12:12
Спасибо за ответ. Поскольку я новичок в mapreduce, я пробую все что угодно. Скажем, если я хочу распечатать в файле журнала входные аргументы метода main (), как я могу это сделать. Я попытался поместить операторы System.out.println в класс драйвера. В конце прогона я перешел по URL-адресу, чтобы отследить это задание, и не вижу ни одного из моих операторов println. Операторы Println в картографе и редукторе работают нормально. Но не в драйвере. По какой причине?
 – 
basam nath
28 Июн 2016 в 01:31
Я не уверен, что вы имеете в виду, потому что опубликованный вами код этого не делает. Вы можете опубликовать новый вопрос, чтобы задать новые вопросы, но не забудьте принять этот ответ, поставив галочку, если это помогло.
 – 
OneCricketeer
28 Июн 2016 в 02:48