2016-09-02 14 views
2

私はHadoop初心者です。私の設定:RHEL7、hadoop-2.7.3Hadoopワード数の例 - ヌルポインタ例外

私はExample:_WordCount_v2.0を実行しようとしています。私はちょうど新しいEclipseプロジェクトにソースコードをコピーし、wc.jarファイルにエクスポートします。

今、私はhadoop Pseudo-Distributed Operationをリンク内でexplianedとして設定しました。入力ディレクトリに入力ファイルを作成

echo "Hello World, Bye World!" > input/file01 
echo "Hello Hadoop, Goodbye to hadoop." > input/file02 

開始ENV:

sbin/start-dfs.sh 
bin/hdfs dfs -mkdir /user 
bin/hdfs dfs -mkdir /user/<username> 
bin/hdfs dfs -put input input 
bin/hadoop jar ws.jar WordCount2 input output 

を、これは私が得たものである:それから私は、次のことから始め

16/09/02 13:15:01 INFO Configuration.deprecation: session.id is deprecated. Instead, use dfs.metrics.session-id 
16/09/02 13:15:01 INFO jvm.JvmMetrics: Initializing JVM Metrics with processName=JobTracker, sessionId= 
16/09/02 13:15:01 INFO input.FileInputFormat: Total input paths to process : 2 
16/09/02 13:15:01 INFO mapreduce.JobSubmitter: number of splits:2 
16/09/02 13:15:01 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_local455553963_0001 
16/09/02 13:15:01 INFO mapreduce.Job: The url to track the job: http://localhost:8080/ 
16/09/02 13:15:01 INFO mapreduce.Job: Running job: job_local455553963_0001 
16/09/02 13:15:01 INFO mapred.LocalJobRunner: OutputCommitter set in config null 
16/09/02 13:15:01 INFO output.FileOutputCommitter: File Output Committer Algorithm version is 1 
16/09/02 13:15:01 INFO mapred.LocalJobRunner: OutputCommitter is org.apache.hadoop.mapreduce.lib.output.FileOutputCommitter 
16/09/02 13:15:02 INFO mapred.LocalJobRunner: Waiting for map tasks 
16/09/02 13:15:02 INFO mapred.LocalJobRunner: Starting task: attempt_local455553963_0001_m_000000_0 
16/09/02 13:15:02 INFO output.FileOutputCommitter: File Output Committer Algorithm version is 1 
16/09/02 13:15:02 INFO mapred.Task: Using ResourceCalculatorProcessTree : [ ] 
16/09/02 13:15:02 INFO mapred.MapTask: Processing split: hdfs://localhost:9000/user/aii/input/file02:0+33 
16/09/02 13:15:02 INFO mapred.MapTask: (EQUATOR) 0 kvi 26214396(104857584) 
16/09/02 13:15:02 INFO mapred.MapTask: mapreduce.task.io.sort.mb: 100 
16/09/02 13:15:02 INFO mapred.MapTask: soft limit at 83886080 
16/09/02 13:15:02 INFO mapred.MapTask: bufstart = 0; bufvoid = 104857600 
16/09/02 13:15:02 INFO mapred.MapTask: kvstart = 26214396; length = 6553600 
16/09/02 13:15:02 INFO mapred.MapTask: Map output collector class = org.apache.hadoop.mapred.MapTask$MapOutputBuffer 
16/09/02 13:15:02 INFO mapred.MapTask: Starting flush of map output 
16/09/02 13:15:02 INFO mapred.LocalJobRunner: Starting task: attempt_local455553963_0001_m_000001_0 
16/09/02 13:15:02 INFO output.FileOutputCommitter: File Output Committer Algorithm version is 1 
16/09/02 13:15:02 INFO mapred.Task: Using ResourceCalculatorProcessTree : [ ] 
16/09/02 13:15:02 INFO mapred.MapTask: Processing split: hdfs://localhost:9000/user/aii/input/file01:0+24 
16/09/02 13:15:02 INFO mapred.MapTask: (EQUATOR) 0 kvi 26214396(104857584) 
16/09/02 13:15:02 INFO mapred.MapTask: mapreduce.task.io.sort.mb: 100 
16/09/02 13:15:02 INFO mapred.MapTask: soft limit at 83886080 
16/09/02 13:15:02 INFO mapred.MapTask: bufstart = 0; bufvoid = 104857600 
16/09/02 13:15:02 INFO mapred.MapTask: kvstart = 26214396; length = 6553600 
16/09/02 13:15:02 INFO mapred.MapTask: Map output collector class = org.apache.hadoop.mapred.MapTask$MapOutputBuffer 
16/09/02 13:15:02 INFO mapred.MapTask: Starting flush of map output 
16/09/02 13:15:02 INFO mapred.LocalJobRunner: map task executor complete. 
16/09/02 13:15:02 WARN mapred.LocalJobRunner: job_local455553963_0001 
java.lang.Exception: java.lang.NullPointerException 
    at org.apache.hadoop.mapred.LocalJobRunner$Job.runTasks(LocalJobRunner.java:462) 
    at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:522) 
Caused by: java.lang.NullPointerException 
    at WordCount2$TokenizerMapper.setup(WordCount2.java:47) 
    at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:143) 
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:787) 
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341) 
    at org.apache.hadoop.mapred.LocalJobRunner$Job$MapTaskRunnable.run(LocalJobRunner.java:243) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
16/09/02 13:15:02 INFO mapreduce.Job: Job job_local455553963_0001 running in uber mode : false 
16/09/02 13:15:02 INFO mapreduce.Job: map 0% reduce 0% 
16/09/02 13:15:02 INFO mapreduce.Job: Job job_local455553963_0001 failed with state FAILED due to: NA 
16/09/02 13:15:02 INFO mapreduce.Job: Counters: 0 

ありません結果(出力)が与えられた。なぜ私はその例外を取得したのですか?

おかげ

EDIT:

echo "\." > patterns.txt 
echo "\," >> patterns.txt 
echo "\!" >> patterns.txt 
echo "to" >> patterns.txt 

してから実行します:

ソリューションへ

おかげで、私は(WORDCOUNTの例では)2回目の試行があることに気づきまし提案

bin/hadoop jar ws.jar WordCount2 -Dwordcount.case.sensitive=true input output -skip patterns.txt 

すべてが仕事用gr食べる!

答えて

2

マッパーのsetup()メソッドで問題が発生しています。このワードカウントの例は、通常より少し進んでおり、マッパーがフィルタリングするパターンを含むファイルを指定することができます。このファイルは、main()メソッドのキャッシュに追加され、マッパーが開くためにはすべてのノードで使用できるようになります。

あなたはmain()にキャッシュに追加されたファイルを見ることができます:

for (int i=0; i < remainingArgs.length; ++i) { 
    if ("-skip".equals(remainingArgs[i])) { 
     job.addCacheFile(new Path(remainingArgs[++i]).toUri()); 
     job.getConfiguration().setBoolean("wordcount.skip.patterns", true); 
    } else { 
     otherArgs.add(remainingArgs[i]); 
    } 
} 

それは試してみて、何も追加しませんので、あなたが-skipオプションを指定されていません。ファイルが追加された場合は、wordcount.skip.patternsからtrueに設定されていることがわかります。

あなたはこのコードを持っているsetup()マッパーでは:その設定されていない、とあなたのケースではそれがない場合

@Override 
public void setup(Context context) throws IOException, InterruptedException { 
    conf = context.getConfiguration(); 
    caseSensitive = conf.getBoolean("wordcount.case.sensitive", true); 
    if (conf.getBoolean("wordcount.skip.patterns", true)) { 
     URI[] patternsURIs = Job.getInstance(conf).getCacheFiles(); 
     for (URI patternsURI : patternsURIs) { 
      Path patternsPath = new Path(patternsURI.getPath()); 
      String patternsFileName = patternsPath.getName().toString(); 
      parseSkipFile(patternsFileName); 
     } 
    } 
} 

問題がtrueconf.getBoolean("wordcount.skip.patterns", true)デフォルトは、このチェックです。したがって、patternsURIsまたは何か(私は行番号を持っていない)はnullになります。

wordcount.case.sensitiveをデフォルトのfalseに変更するか、ドライバ(メインメソッド)のfalseに設定するか、またはスキップファイルを使用して修正してください。

+0

ありがとう!あなたは私の質問で編集を見ることができます - 私はあなたの答えからそれを把握します:-) – ItayB

1

問題は、コードのこの一部であってもよい:ここでは

caseSensitive = conf.getBoolean("wordcount.case.sensitive", true); 
if (conf.getBoolean("wordcount.skip.patterns", true)) { 
    URI[] patternsURIs = Job.getInstance(conf).getCacheFiles(); 
    for (URI patternsURI : patternsURIs) { 
     Path patternsPath = new Path(patternsURI.getPath()); 
     String patternsFileName = patternsPath.getName().toString(); 
     parseSkipFile(patternsFileName); 
    } 
} 

getCacheFiles()は、何らかの理由でnullを返しています。そのため、patternsURIs(それ以外のものはnull)を反復しようとしているときは、例外が発生します。

これを解決するには、ループチェックの前にpatternsURIsがヌルであるかどうかを確認してください。

if(patternsURIs != null) { 
    for (URI patternsURI : patternsURIs) { 
     Path patternsPath = new Path(patternsURI.getPath()); 
     String patternsFileName = patternsPath.getName().toString(); 
     parseSkipFile(patternsFileName); 
    } 
} 

nullを取得することが期待されていない場合にも、なぜあなたはnullを取得している確認する必要があります。

+0

ありがとうございました!私はこの変更を試みますが、コードに入る前にこのサンプルを実行したかったのです。私はあなたの更新を保つつもりです。あなたは私の質問でEDITを見ることができます - 私はそれを把握します:-) – ItayB