0

JobClient を使用してジョブを送信する mapreduce コードがあります。このヌルポインターエラースタックを取得し続けます

12/12/10 12:42:44 INFO mapred.LocalJobRunner: OutputCommitter set in config null    
Exception in thread "main" java.lang.NullPointerException
        at org.apache.hadoop.mapred.JobClient$NetworkedJob.<init>(JobClient.java:226)
        at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:924)
        at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:844)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:396)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1232)
        at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:844)
        at org.apache.hadoop.mapred.JobClient.submitJob(JobClient.java:818)
        at FTPIF.run(FTPIF.java:193)
        at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
        at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:84)
        at FTPIF.main(FTPIF.java:273)

このエラーが発生するコードは

JobClient j = new JobClient();
        j.init(conf);
        RunningJob check = j.submitJob(conf);

何か案は ?

4

2 に答える 2

1

私もこの問題を抱えています。しかし、使用j.runJob(conf);するとうまくいきます。また、 static 関数を使用することもできますJobClient.runJob(conf);。理由がわからないので、JobClient のソースを読んで、静的関数の実装を見つけますrunJob

public static RunningJob runJob(JobConf job) throws IOException {
    JobClient jc = new JobClient(job);
    RunningJob rj = jc.submitJob(job);
    try {
        if (!jc.monitorAndPrintJob(job, rj)) {
            throw new IOException("Job failed!");
        }
    } catch (InterruptedException ie) {
        Thread.currentThread().interrupt();
    }
    return rj;
}

したがってsubmitJob、この関数を次のように使用します。

JobClient jcli = new JobClient(jconf);
RunningJob rJob = jcli.submitJob(jconf);
while (true){
    Thread.sleep(5000);
    System.out.println(rJob);
    if (rJob.isComplete())
        break;
}

働きます!! 多分これはあなたにとっても役に立ちます。

于 2013-06-22T04:33:22.337 に答える
0

null ポインターをヒットした理由がわかりませんでした。j.setConf(conf) の設定も機能しませんでした。runJobそのため、実行中のジョブのハンドルを取得する代わりに使用しました。

RunningJob job= JobClient.runJob(conf);
于 2012-12-13T06:10:55.323 に答える