2016-09-07 29 views
1

hadoopとhbaseでnutchを完全にセットアップしました。コマンドライン(ターミナル)を介してジョブを実行すると正常に動作します。しかし、例外が発生した後、私は同じコマンドをnutch wepappサーバー経由で実行したいとき。Apache Nutch 2.3.1リモートコマンドが失敗しました

2016-09-07 12:25:31,800 ERROR impl.RemoteCommandExecutor - Remote command failed 
java.util.concurrent.TimeoutException 
    at java.util.concurrent.FutureTask.get(FutureTask.java:205) 
    at org.apache.nutch.webui.client.impl.RemoteCommandExecutor.executeRemoteJob(RemoteCommandExecutor.java:61) 
    at org.apache.nutch.webui.client.impl.CrawlingCycle.executeCrawlCycle(CrawlingCycle.java:58) 
    at org.apache.nutch.webui.service.impl.CrawlServiceImpl.startCrawl(CrawlServiceImpl.java:69) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) 
    at org.springframework.aop.interceptor.AsyncExecutionInterceptor$1.call(AsyncExecutionInterceptor.java:97) 
    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) 
2016-09-07 12:25:31,850 INFO impl.CrawlingCycle - Executed remote command data: INJECT status: FAILED 

私は、アプリケーションサーバ、すなわちnutchserverwebappのための牽引サービスを開始しました。これらのサービスは、ユーザーモードとrootユーザーの両方で実行しています。同じ結果です。

答えて

2

これは、タイムアウト例外は、結果を得るために待つためにタイムアウトの最大値を増やしてみてくださいRemoteCommandExecuterの.javaに

をジョブを実行するのです。与えられた時間だけ計算が完了するのを待ってから、結果を取得します。

private static final int DEFAULT_TIMEOUT_SEC = 60; 

    public JobInfo executeRemoteJob(RemoteCommand command) { 
     try { 
      String jobId = client.executeJob(command.getJobConfig()); 
      Future<JobInfo> chekerFuture = executor 
       .submit(new JobStateChecker(jobId)); 
      return chekerFuture.get(getTimeout(command), TimeUnit.MILLISECONDS); 
     } catch (Exception e) { 
      log.error("Remote command failed", e); 
      JobInfo jobInfo = new JobInfo(); 
      jobInfo.setState(State.FAILED); 
      jobInfo.setMsg(ExceptionUtils.getStackTrace(e)); 
      return jobInfo; 
     } 
     } 

    private long getTimeout(RemoteCommand command) { 
     if (command.getTimeout() == null) { 
      return DEFAULT_TIMEOUT_SEC * DateTimeConstants.MILLIS_PER_SECOND; 
     } 
     return command.getTimeout().getMillis(); 
     } 

DEFAULT_TIMEOUT_SECを高い値に変更します。

関連する問題