Добрые люди из 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));
}
}
1 ответ
Это поведение mapreduce по умолчанию?
Не из mapreduce, а только из используемого вами InputFormat.
FileInputFormat
API Ссылка
setInputPaths(JobConf conf, Path... inputPaths)
Установите массив
Path
в качестве списка входных данных для задания сокращения карты.
Path
API Ссылка
Называет файл или каталог в
FileSystem
.
Итак, когда вы говорите
нет кода для чтения нескольких файлов
Да, действительно есть, просто не нужно было писать об этом.
Mapper<LongWritable, Text,
правильно обрабатывает все файловые смещения для всех файлов в указанном InputFormat
.
Похожие вопросы
Новые вопросы
hadoop
Hadoop - это проект с открытым исходным кодом Apache, который предоставляет программное обеспечение для надежных и масштабируемых распределенных вычислений. Ядро состоит из распределенной файловой системы (HDFS) и менеджера ресурсов (YARN). Различные другие проекты с открытым исходным кодом, такие как Apache Hive, используют Apache Hadoop в качестве слоя персистентности.