1

以下は、pigrunner と pigstats を実行する私のコードです。

    String[] args = {"abc.pig"};
    PigStats stats = PigRunner.run(args,null);

    System.out.println("Stats : " + stats.getReturnCode());

    OutputStats os = stats.result("B");

    Iterator<Tuple> it = os.iterator();

    while(it.hasNext()){
        Tuple t = it.next();
        System.out.println(t.getAll());
    }

abc.pig の内容

A = load 'Courses' using PigStorage(' ');
B = foreach A generate $0 as id;
dump B;

正しい出力が得られますが、根本原因を含むこの例外 Stacktrace が続きます

org.apache.hadoop.mapreduce.lib.input.InvalidInputException: Input path does not exist: hdfs://localhost:54310/tmp/temp-221133443/tmp1478461116
  at org.apache.hadoop.mapreduce.lib.input.FileInputFormat.listStatus(FileInputFormat.java:235)
  at org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigFileInputFormat.listStatus(PigFileInputFormat.java:37)
  at org.apache.hadoop.mapreduce.lib.input.FileInputFormat.getSplits(FileInputFormat.java:252)
  at org.apache.pig.impl.io.ReadToEndLoader.init(ReadToEndLoader.java:154)
  at org.apache.pig.impl.io.ReadToEndLoader.<init>(ReadToEndLoader.java:116)
  at org.apache.pig.tools.pigstats.OutputStats.iterator(OutputStats.java:148)
  at org.apache.jsp.result_jsp._jspService(result_jsp.java:86)
  at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
  at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
  at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:419)
  at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:391)
  at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
  at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
  at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
  at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
  at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
  at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
  at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
  at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
  at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
  at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395)
  at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250)
  at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
  at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:166)
  at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
  at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
  at java.lang.Thread.run(Thread.java:662)

DUMP を STORE に置き換えると、同じコードがエラーなしで機能するようになりました。

何が起こっているのか説明してもらえますか?

ありがとうラヴィ

4

1 に答える 1

3

ダンプの場合、Pig は一時的な場所に出力を保存します。例: hdfs://localhost/tmp/temp797130848/tmp1101984728 (pig.map.output.dirsジョブの config.xml を見てください)

PigRunner.run()は、プロセスのある時点でGruntParser.processDump(String alias)を呼び出し、結果のタプルを反復してコンソールに出力します。

Iterator<Tuple> result = mPigServer.openIterator(alias);
while (result.hasNext())
{
  Tuple t = result.next();
  System.out.println(TupleFormat.format(t));
}

この後、戻る前に、この一時ディレクトリを削除するFileLocalizer.deleteTempFiles()も呼び出します。

ここで、エイリアスBの結果を返したいとします。 OutputStatsの反復子は、一時ファイルを再度開いて、PigRunner.run()以前と同様にタプルをループしようとします。しかし問題は、このファイルがもう存在しないため、例外が発生することです。

したがってSystem.out.println("Stats : " + stats.getReturnCode());、ダンプが既に印刷されているため、後でコードを削除することをお勧めします。

于 2013-04-29T10:39:55.713 に答える