2016-11-30 6 views
0

Hadoopで出力フォーマットをカスタマイズするには、このtutorialで説明しているコードを実行します。 FileOutputFormatを拡張するJavaクラス: Hadoopでカスタム出力フォーマットを実装するチュートリアル

  • XMLOutputFormat(このlinkでのMapReduceチュートリアルのWORDCOUNT v1.0のと同様に)ワードカウントのJavaアプリケーションをされています

    1. WORDCOUNT:より正確には、チュートリアルでは、2つのJavaファイルを示し出力をカスタマイズするためのメソッドを実装しています。

    さて、私がやったことのMapReduceチュートリアルのWORDCOUNT v1.0のを取ることでした(代わりに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コード:あなたはどちらかあなたのWordCountクラスの先頭にpackage testpackage;を追加する必要が

    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

    または

    あなたのWordCountクラスの

    同じディレクトリにあるので、同じパッケージに含まれているわけではありません。

    +0

    私がしようとしたが、それはwork.Wellなかった、私はcom.sun.tools.javac.Mainは-d 'は/ usr/local/Hadoopの/ binに/ Hadoopのを実行してtestpackageを作成しました。その後、 '' package testpackage; 'を' WordCount'の最初に '/ usr/local/hadoop/bin/hadoop com.sun.tools.javac.Main WordCount.java'を使ってコンパイルしました。私は同じエラーが発生しました。その後、 'package testpackage;'を 'WordCount'の先頭から削除し、' WordCount'に 'import testpackage.XMLOutputFormat;'を追加しましたが、 'エラー:シンボルを見つけることができませんimport testpackage.XMLOutputFormat ; 'シンボルを見つけることができません' job.setOutputFormatClass' –

    1

    ドライバコードが見つかるには、XMLOutputFormat.jarファイルをHADOOP_CLASSPATHに最初に追加する必要があります。また、-libjarsオプションで渡してマップのクラスパスに追加し、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 
    
    関連する問題