2016-10-03 5 views
3

逆インデックスを作成しようとしています。2つのジョブを連結するときにhadoop.mapreduce.lib.input.FileInputFormat.getBlockIndexのNullPointerException

私は2つのジョブを連鎖します。

基本的に、最初のジョブは入力を解析してそれをクリーンアップし、2番目のジョブの入力フォルダである 'output'フォルダに結果を格納します。

2番目のジョブは、逆インデックスを実際に作成することになっています。

私が最初の仕事をしたとき、それはうまくいった(少なくとも、例外はなかった)。

私はこのような2つのジョブチェーン:この設定が間違っている、そしてどのように私は仕事をチェーンなければならない私は

Exception in thread "main" java.lang.NullPointerException 
    at org.apache.hadoop.mapreduce.lib.input.FileInputFormat.getBlockIndex(FileInputFormat.java:444) 
    at org.apache.hadoop.mapreduce.lib.input.FileInputFormat.getSplits(FileInputFormat.java:413) 
    at org.apache.hadoop.mapreduce.JobSubmitter.writeNewSplits(JobSubmitter.java:301) 
    at org.apache.hadoop.mapreduce.JobSubmitter.writeSplits(JobSubmitter.java:318) 
    at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:196) 
    at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1290) 
    at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1287) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at javax.security.auth.Subject.doAs(Subject.java:415) 
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1657) 
    at org.apache.hadoop.mapreduce.Job.submit(Job.java:1287) 
    at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1308) 
    at Main.main(Main.java:79) 

を取得

public class Main { 

    public static void main(String[] args) throws Exception { 

     String inputPath = args[0]; 
     String outputPath = args[1]; 
     String stopWordsPath = args[2]; 
     String finalOutputPath = args[3]; 

     Configuration conf = new Configuration();  
     conf.set("job.stopwords.path", stopWordsPath); 

     Job job = Job.getInstance(conf, "Tokenize"); 

     job.setJobName("Tokenize"); 
     job.setJarByClass(TokenizerMapper.class); 

     job.setNumReduceTasks(1); 

     FileInputFormat.setInputPaths(job, new Path(inputPath)); 
     FileOutputFormat.setOutputPath(job, new Path(outputPath)); 

     job.setMapOutputKeyClass(Text.class); 
     job.setMapOutputValueClass(PostingListEntry.class); 

     job.setOutputKeyClass(Text.class); 
     job.setOutputValueClass(PostingListEntry.class); 

     job.setOutputFormatClass(MapFileOutputFormat.class); 

     job.setMapperClass(TokenizerMapper.class); 
     job.setReducerClass(TokenizerReducer.class); 

     // Delete the output directory if it exists already. 
     Path outputDir = new Path(outputPath); 
     FileSystem.get(conf).delete(outputDir, true); 

     long startTime = System.currentTimeMillis(); 
     job.waitForCompletion(true); 
     System.out.println("Job Finished in " + (System.currentTimeMillis() - startTime)/1000.0 + " seconds"); 

     //------------------------------------------------------------------------- 

     Configuration conf2 = new Configuration();  

     Job job2 = Job.getInstance(conf2, "BuildIndex"); 

     job2.setJobName("BuildIndex"); 
     job2.setJarByClass(InvertedIndexMapper.class); 

     job2.setOutputFormatClass(TextOutputFormat.class); 

     job2.setNumReduceTasks(1); 

     FileInputFormat.setInputPaths(job2, new Path(outputPath)); 
     FileOutputFormat.setOutputPath(job2, new Path(finalOutputPath)); 

     job2.setOutputKeyClass(Text.class); 
     job2.setOutputValueClass(PostingListEntry.class); 

     job2.setMapperClass(InvertedIndexMapper.class); 
     job2.setReducerClass(InvertedIndexReducer.class); 

     // Delete the output directory if it exists already. 
     Path finalOutputDir = new Path(finalOutputPath); 
     FileSystem.get(conf2).delete(finalOutputDir, true); 

     startTime = System.currentTimeMillis(); 
     // THIS LINE GIVES ERROR: 
     job2.waitForCompletion(true); 
     System.out.println("Job Finished in " + (System.currentTimeMillis() - startTime)/1000.0 + " seconds"); 
    } 
} 

を?

+1

何が間違っているかを正確に伝えるのは難しいです。問題を再現できるように、ソースコード全体を投稿したりアップロードしたりできますか(GitHub?) –

+1

ご覧ください:https://github.com/Oleksandra28/BuildInvertedIndex/tree/master/VectorSpaceRetrievalSystem/src今私は最初の仕事(TokenizeMapperとTokenizeReducerが使用されている)を実行してもエラーが発生します。私はここから私が取ったArrayListWritableクラスをどのように使用しているかについて何か間違っていると思う:https://lintool.github.io/Cloud9/本当に助けていただければ幸いです! – Oleksandra

+1

ソースコードを投稿していただきありがとうございます!あなたは、プログラムを実行するためにどのようなコマンドライン引数(正確な値)を使用すべきかを指摘してください。 –

答えて

2

最初のジョブで出力フォーマットとして意図的にMapFileOutputFormatを使用しているのかどうかは不明です。より一般的な方法は、SequenceFileOutputFormatSequenceFileInputFormatを2番目のジョブの入力形式として使用する方法です。

現時点では、最初のジョブへの出力としてMapFileOutputFormatが指定されており、2番目の入力が指定されていないため、TextInputFormatとなる可能性があります。

TokenizerReducerクラスを見るとreduceメソッドの署名が正しくありません。あなたは持っている:

public void reduce(Text key, Iterator<PostingListEntry> values, Context context) 

それは次のようになります。

public void reduce(Key key, Iterable<PostingListEntry> values, Context context) 

それはあなたの実装を呼び出すことはありませんので、それだけ減らすアイデンティティになります。このためです。

+0

私が 'MapFileOutputFormat'を使用した理由は、私がここのアプローチに従っていたからです:https://github.com/lintool/bespin/blob/master/src/main/java/io/bespin/java/mapreduce/search/BuildInvertedIndex .java – Oleksandra

+2

@Oleksandraあなたのコードをすばやく見てからアップデートを追加しました。 –

関連する問題