Я пишу свою первую работу MapReduce. Что-то простое: просто подсчет буквенно-цифровых символов из файла. Я выполнил, чтобы создать файл jar и запустить его, но я не могу найти результат задания MR, кроме вывода отладки. Не могли бы вы мне помочь?MapReduce job: weird output?
Мой класс приложения:
import CharacterCountMapper;
import CharacterCountReducer;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
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.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
public class CharacterCountDriver extends Configured implements Tool {
@Override
public int run(String[] args) throws Exception {
// Create a JobConf using the processed configuration processed by ToolRunner
Job job = Job.getInstance(getConf());
// Process custom command-line options
Path in = new Path("/tmp/filein");
Path out = new Path("/tmp/fileout");
// Specify various job-specific parameters
job.setJobName("Character-Count");
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
job.setMapperClass(CharacterCountMapper.class);
job.setReducerClass(CharacterCountReducer.class);
job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);
FileInputFormat.setInputPaths(job, in);
FileOutputFormat.setOutputPath(job, out);
job.setJarByClass(CharacterCountDriver.class);
job.submit();
return 0;
}
public static void main(String[] args) throws Exception {
// Let ToolRunner handle generic command-line options
int res = ToolRunner.run(new Configuration(), new CharacterCountDriver(), args);
System.exit(res);
}
}
Тогда мой класс картографа:
import java.io.IOException;
import java.util.StringTokenizer;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
public class CharacterCountMapper extends
Mapper<Object, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
@Override
protected void map(Object key, Text value, Context context)
throws IOException, InterruptedException {
String strValue = value.toString();
StringTokenizer chars = new StringTokenizer(strValue.replaceAll("[^a-zA-Z0-9]", ""));
while (chars.hasMoreTokens()) {
context.write(new Text(chars.nextToken()), one);
}
}
}
И редуктор:
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
public class CharacterCountReducer extends
Reducer<Text, IntWritable, Text, IntWritable> {
@Override
protected void reduce(Text key, Iterable<IntWritable> values, Context context)
throws IOException, InterruptedException {
int charCount = 0;
for (IntWritable val: values) {
charCount += val.get();
}
context.write(key, new IntWritable(charCount));
}
}
Он выглядит хорошо, я генерировать работоспособный файл фляги из моего IDE и выполнить его следующим образом:
$ ./hadoop jar ~/Desktop/example_MapReduce.jar no.hib.mod250.hadoop.CharacterCountDriver
14/11/27 19:36:42 INFO Configuration.deprecation: session.id is deprecated. Instead, use dfs.metrics.session-id
14/11/27 19:36:42 INFO jvm.JvmMetrics: Initializing JVM Metrics with processName=JobTracker, sessionId=
14/11/27 19:36:42 INFO input.FileInputFormat: Total input paths to process : 1
14/11/27 19:36:42 INFO mapreduce.JobSubmitter: number of splits:1
14/11/27 19:36:43 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_local316715466_0001
14/11/27 19:36:43 WARN conf.Configuration: file:/tmp/hadoop-roberto/mapred/staging/roberto316715466/.staging/job_local316715466_0001/job.xml:an attempt to override final parameter: mapreduce.job.end-notification.max.retry.interval; Ignoring.
14/11/27 19:36:43 WARN conf.Configuration: file:/tmp/hadoop-roberto/mapred/staging/roberto316715466/.staging/job_local316715466_0001/job.xml:an attempt to override final parameter: mapreduce.job.end-notification.max.attempts; Ignoring.
14/11/27 19:36:43 WARN conf.Configuration: file:/tmp/hadoop-roberto/mapred/local/localRunner/roberto/job_local316715466_0001/job_local316715466_0001.xml:an attempt to override final parameter: mapreduce.job.end-notification.max.retry.interval; Ignoring.
14/11/27 19:36:43 WARN conf.Configuration: file:/tmp/hadoop-roberto/mapred/local/localRunner/roberto/job_local316715466_0001/job_local316715466_0001.xml:an attempt to override final parameter: mapreduce.job.end-notification.max.attempts; Ignoring.
14/11/27 19:36:43 INFO mapreduce.Job: The url to track the job: http://localhost:8080/
14/11/27 19:36:43 INFO mapred.LocalJobRunner: OutputCommitter set in config null
14/11/27 19:36:43 INFO mapred.LocalJobRunner: OutputCommitter is org.apache.hadoop.mapreduce.lib.output.FileOutputCommitter
14/11/27 19:36:43 INFO mapred.LocalJobRunner: Waiting for map tasks
14/11/27 19:36:43 INFO mapred.LocalJobRunner: Starting task: attempt_local316715466_0001_m_000000_0
14/11/27 19:36:43 INFO mapred.Task: Using ResourceCalculatorProcessTree : [ ]
14/11/27 19:36:43 INFO mapred.MapTask: Processing split: file:/tmp/filein:0+434
14/11/27 19:36:43 INFO mapred.MapTask: Map output collector class = org.apache.hadoop.mapred.MapTask$MapOutputBuffer
Тогда я думаю, что мой выходной файл будет в/tmp/fileout. Но вместо этого он кажется пустым:
$ tree /tmp/fileout/
/tmp/fileout/
└── _temporary
└── 0
2 directories, 0 files
Есть ли что-нибудь, что мне не хватает? Может кто-нибудь мне помочь?
Привет :-)
Edit:
Я почти нашел решение on this other post.
Внутри CharacterCountDriver я заменил job.submit() на job.waitForCompletion (true). Я получаю более подробный вывод:
/tmp/fileout/
├── part-r-00000
└── _SUCCESS
0 directories, 2 files
Но я до сих пор не знаю, как читать те, _SUCCESS пуста, а часть-р-0000 является не то, что я ожидал:
Absorbantandyellowandporousishe 1
AreyoureadykidsAyeAyeCaptain 1
ICanthearyouAYEAYECAPTAIN 1
Ifnauticalnonsensebesomethingyouwish 1
Ohh 1
READY 1
SPONGEBOBSQUAREPANTS 1
SpongebobSquarepants 3
Spongebobsquarepants 4
Thendroponthedeckandfloplikeafish 1
Wholivesinapineappleunderthesea 1
Любые советы? Может быть, в моем коде есть какая-то ошибка? Благодарю.
Повторите попытку, убедившись, что выходной каталог не существует. Если вы можете, отправьте отчет счетчиков для получения дополнительной информации. –
@ChrisGerken, который является отчетами счетчиков? Внутри/tmp/fileout есть 4 файла: part-r-00000 .part-r-00000.crc \t _SUCCESS ._SUCCESS.crc. * crc - двоичные файлы. Наверное, это то, что вы имеете в виду, как я могу опубликовать их? – sogeking
part-r-000000 содержит ваш вывод –