2016-11-30 2 views
0

Я хочу запустить код, описанный в этом tutorial, чтобы настроить выходной формат в Hadoop. Точнее, учебник показывает два Java файлы:Запуск реализации пользовательского формата вывода в учебном пособии Hadoop

  1. WordCount: это приложение количество слов Java (по аналогии с WordCount v1.0 на MapReduce Учебник в этом link)
  2. XMLOutputFormat: Java класс, который расширяет FileOutputFormat и реализует метод настройки вывода.

Ну, что я должен был взять WordCount v1.0 от MapReduce Учебник (вместо использования WordCount показал в учебнике) и добавить в драйвере job.setOutputFormatClass(XMLOutputFormat.class); и выполнить приложение Hadoop таким образом:

/usr/local/hadoop/bin/hadoop com.sun.tools.javac.Main WordCount.java && jar cf wc.jar WordCount*.class && /usr/local/hadoop/bin/hadoop jar wc.jar WordCount /home/luis/Desktop/mytest/input/ ./output_folder

Примечание: /home/luis/Desktop/mytest/input/ и ./output_folder являются входные и выходные папки, соответственно.

К сожалению, терминал показывает мне следующее сообщение об ошибке:

WordCount.java:57: error: cannot find symbol job.setOutputFormatClass(XMLOutputFormat.class); ^ symbol: class XMLOutputFormat location: class WordCount 1 error

Почему? WordCount.java и XMLOutputFormat.java хранятся в одной папке.

Следующий мой код.

WordCount код:

import java.io.IOException; 
import java.util.StringTokenizer; 

import org.apache.hadoop.conf.Configuration; 
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.Mapper; 
import org.apache.hadoop.mapreduce.Reducer; 
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; 
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; 

public class WordCount { 

    public static class TokenizerMapper 
     extends Mapper<Object, Text, Text, IntWritable>{ 

    private final static IntWritable one = new IntWritable(1); 
    private Text word = new Text(); 

    public void map(Object key, Text value, Context context 
        ) throws IOException, InterruptedException { 
     StringTokenizer itr = new StringTokenizer(value.toString()); 
     while (itr.hasMoreTokens()) { 
     word.set(itr.nextToken()); 
     context.write(word, one); 
     } 
    } 
    } 

    public static class IntSumReducer 
     extends Reducer<Text,IntWritable,Text,IntWritable> { 
    private IntWritable result = new IntWritable(); 

    public void reduce(Text key, Iterable<IntWritable> values, 
         Context context 
         ) throws IOException, InterruptedException { 
     int sum = 0; 
     for (IntWritable val : values) { 
     sum += val.get(); 
     } 
     result.set(sum); 
     context.write(key, result); 
    } 
    } 

    public static void main(String[] args) throws Exception { 
    Configuration conf = new Configuration(); 
    Job job = Job.getInstance(conf, "word count"); 
    job.setJarByClass(WordCount.class); 
    job.setMapperClass(TokenizerMapper.class); 
    job.setCombinerClass(IntSumReducer.class); 
    job.setReducerClass(IntSumReducer.class); 
    job.setOutputKeyClass(Text.class); 
    job.setOutputValueClass(IntWritable.class); 
    job.setOutputFormatClass(XMLOutputFormat.class); 
    FileInputFormat.addInputPath(job, new Path(args[0])); 
    FileOutputFormat.setOutputPath(job, new Path(args[1])); 
    System.exit(job.waitForCompletion(true) ? 0 : 1); 



    } 
} 

XMLOutputFormat код:

import java.io.DataOutputStream; 
import java.io.IOException; 
import org.apache.hadoop.fs.FSDataOutputStream; 
import org.apache.hadoop.fs.FileSystem; 
import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.io.*; 
import org.apache.hadoop.mapreduce.RecordWriter; 
import org.apache.hadoop.mapreduce.TaskAttemptContext; 
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; 

public class XMLOutputFormat extends FileOutputFormat<Text, IntWritable> { 

    protected static class XMLRecordWriter extends RecordWriter<Text, IntWritable> { 

     private DataOutputStream out; 

     public XMLRecordWriter(DataOutputStream out) throws IOException{ 

      this.out = out; 
      out.writeBytes("<Output>\n"); 

     } 


     private void writeStyle(String xml_tag,String tag_value) throws IOException { 

      out.writeBytes("<"+xml_tag+">"+tag_value+"</"+xml_tag+">\n"); 

     } 

     public synchronized void write(Text key, IntWritable value) throws IOException { 

      out.writeBytes("<record>\n"); 
      this.writeStyle("key", key.toString()); 
      this.writeStyle("value", value.toString()); 
      out.writeBytes("</record>\n"); 

     } 

     public synchronized void close(TaskAttemptContext job) throws IOException { 

      try { 

       out.writeBytes("</Output>\n"); 

      } finally { 

       out.close(); 

      } 

     } 

    } 

    public RecordWriter<Text, IntWritable> getRecordWriter(TaskAttemptContext job) throws IOException { 

     String file_extension = ".xml"; 
     Path file = getDefaultWorkFile(job, file_extension); 
     FileSystem fs = file.getFileSystem(job.getConfiguration()); 
     FSDataOutputStream fileOut = fs.create(file, false); 
     return new XMLRecordWriter(fileOut); 

    } 

} 

ответ

1

Вам нужно либо добавить package testpackage; в начале вашего WordCount класса

или

import testpackage.XMLOutputFormat; в вашем классе WordCount.

Поскольку они находятся в одном каталоге, это не означает, что они находятся в одном пакете.

+0

Я пытался, но это было не work.Well, я создал testpackage, запустив '/ USR/местные/Hadoop/bin/Hadoop com.sun.tools.javac.Main -d. XMLOutputFormat.java'. После этого я добавил 'package testpackage;' в начале 'WordCount' скомпилировать его с помощью'/usr/local/hadoop/bin/hadoop com.sun.tools.javac.Main WordCount.java', но Я получил ту же ошибку. Затем я удалил «package testpackage;» с начала «WordCount», я добавил «import testpackage.XMLOutputFormat;» в «WordCount», но я получил ошибку: не могу найти импорт символа importpackage.XMLOutputFormat ; 'и не может найти символ' job.setOutputFormatClass' –

1

Нам нужно будет сначала добавить файл XMLOutputFormat.jar в HADOOP_CLASSPATH для кода драйвера, чтобы найти его. И передайте его в параметр -libjars, который будет добавлен в classpath карты и уменьшит jvms.

export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/abc/xyz/XMLOutputFormat.jar 

yarn jar wordcount.jar com.sample.test.Wordcount 
-libjars /path/to/XMLOutputFormat.jar 
/lab/mr/input /lab/output/output 
Смежные вопросы