2014-11-27 2 views
1

Я пишу свою первую работу 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 

Любые советы? Может быть, в моем коде есть какая-то ошибка? Благодарю.

+0

Повторите попытку, убедившись, что выходной каталог не существует. Если вы можете, отправьте отчет счетчиков для получения дополнительной информации. –

+0

@ChrisGerken, который является отчетами счетчиков? Внутри/tmp/fileout есть 4 файла: part-r-00000 .part-r-00000.crc \t _SUCCESS ._SUCCESS.crc. * crc - двоичные файлы. Наверное, это то, что вы имеете в виду, как я могу опубликовать их? – sogeking

+1

part-r-000000 содержит ваш вывод –

ответ

0

Если я правильно понял, вы хотите, чтобы ваша программа подсчитывала буквенно-цифровые символы во входных файлах. Однако это НЕ то, что делает ваш код. Вы можете изменить свой картограф для подсчета буквенно-цифровых символов в каждой строке:

String strValue = value.toString(); 
strValue.replaceAll("[^a-zA-Z0-9]", ""); 
context.write(new Text("alphanumeric", strValue.length()); 

Это должно исправить вашу программу. В основном, ваши карты выводят буквенно-цифровые символы в каждой строке в качестве ключа. Редуктор накапливает подсчеты на ключ. С моим изменением вы используете только один ключ: «буквенно-цифровой». Ключ может быть чем-то другим, и он все равно будет работать.

0

part-r-00000 - имя выходного файла вашего редуктора. Если у вас больше редукторов, они будут пронумерованы part-r-00001 и так далее.