0

注意してください。この質問は、慎重なレビューの後に自動的に回答され、バグでした。このチケットは情報提供と考えてください。

コマンドラインからマップに変数を渡したいマップリデュースジョブに取り組んでいます。これは、リフレクションを介してカスタム パーサーを動的にインスタンス化できるようにするためです。ただし、クラスをインスタンス化すると NPE が発生します

MRFileParser.java

主に:

configuration.set("parser","com.example.parsers." + args[0])

マップ内:

Configuration configuration = context.getConfiguration();
String parserClassName = configuration.get("parser");
Class parserClass = Class.forName(parserClassName);
fileParser = (FileParser) parserClass.newInstance()

しかし、これは null ポインター例外をスローします。

attempt_201309161312_0020_m_000000_1: 2013-09-17 11:58:06.770 java[9623:1703] Unable to load realm info from SCDynamicStore
13/09/17 11:58:16 INFO mapred.JobClient: Task Id : attempt_201309161312_0020_m_000000_2,  Status : FAILED
java.lang.NullPointerException
at org.apache.hadoop.io.Text.encode(Text.java:388)
at org.apache.hadoop.io.Text.set(Text.java:178)
at com.example.MyMRFileParser$Map.map(MyMRFileParser.java:42)
at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:145)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:764)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:364)
at org.apache.hadoop.mapred.Child$4.run(Child.java:255)
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:1190)
at org.apache.hadoop.mapred.Child.main(Child.java:249)

動的にロードしようとしているクラスは、jar にコンパイルされます。これFileParserは、パーサー コントラクトを定義するインターフェイスです。コマンド ラインで渡される名前は、FileParserインターフェイスを実装するクラスの名前です。

私のプロジェクト レイアウトは次のようになります。com.example.someproject.*

├── parsers
│   ├── FileParser.java
│   └── SomeSpecificFormatParser.java
├── mapreduce
│   └── MRFileParser.java 
├── model

    └── SomeDomainSpecificClass.java

record = fileParser.toRecord(line);更新: この問題は、パーサーが行をレコード オブジェクトに解析する次の行に関連していることが判明しました。完全に私が悪い。私はそれを省略していました。

4

1 に答える 1

1

これを試してください:- 1. クラス FileParser は jar ファイルに含まれています。

  1. Hadoop クラスパスのエクスポート

    export HADOOP_CLASSPATH=PATH_TO_JAR_FILE

  2. map reduce ジョブを実行します。

    PARAMS=com.example.someproject.FileParser

    Hadoop jar $PATH_TO_JAR_FILE com.example.someproject.MRFileParser $PARAMS

  3. ジョブランナー。

    設定 conf = 新しい設定(); conf.set("パーサー", args[0]);

  4. マッパー (またはリデューサー):

    構成構成 = context.getConfiguration();

    String parserClassName = configuration.get("パーサー");

    Class parserClass = Class.forName(parserClassName);

    fileParser = (FileParser) parserClass.newInstance()

于 2013-09-17T21:10:45.153 に答える