2017-06-16 106 views
0

我有一個簡單的java程序,它包裝了distcp以便通過hadoop集羣複製文件。 我可以從IDE和hadoop cli中成功運行它。從jsp運行mapreduce作業servlet

我想要一個jsp Web應用程序,以便人們可以使用Web界面來與我的程序進行交互。

我創建了一個具有所有依賴關係的胖jar並將其部署到我的web應用程序中。 現在的問題是,每當程序要提交DistCp使用工作它提供了以下錯誤:

java.io.IOException: Cannot initialize Cluster. Please check your configuration for mapreduce.framework.name and the correspond server addresses. 
at org.apache.hadoop.mapreduce.Cluster.initialize(Cluster.java:143) 
at org.apache.hadoop.mapreduce.Cluster.<init>(Cluster.java:108) 
at org.apache.hadoop.mapreduce.Cluster.<init>(Cluster.java:101) 
at org.apache.hadoop.tools.DistCp.createMetaFolderPath(DistCp.java:419) 
at org.apache.hadoop.tools.DistCp.<init>(DistCp.java:106) 
at replication.ReplicationUtils.doCopy(ReplicationUtils.java:127) 
at replication.ReplicationUtils.copy(ReplicationUtils.java:77) 
at replication.parallel.DistCpTask.run(DistCpTask.java:28) 
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) 

我檢查mapreduce.framework.name,它的確是

有什麼想法?


UPDATE1:

經過一番調試,我發現了下面的一段代碼:

Iterable<ClientProtocolProvider> frameworkLoader = 
      ServiceLoader.load(ClientProtocolProvider.class); 
    for(ClientProtocolProvider cpp: frameworkLoader) { 
     System.out.println(cpp.toString()); 
    } 

,當我在本地運行我得到:

[email protected] 
[email protected] 

但是當它從web服務器運行時,我得到:

[email protected] 

我還無法找出原因。我在我部署在web服務器的胖罐中有YarnClientProtocolProvider


UPDATE2:

,我創建莫名其妙尤伯杯罐子合併所有的服務提供商聲明的依賴罐的META-INF/services目錄,因此在其下寫有最後一個文件只包含'org.apache.hadoop.mapred.LocalClientProtocolProvider'。

我仍然不知道爲什麼,當我使用

hadoop jar my.jar .... 

它承認「org.apache.hadoop.mapred.YarnClientProtocolProvider」雖然它的META-INF/services目錄下是不存在於服務商我。罐。

現在我想這個問題應該是如何創建一個不合並服務提供商條目的超級罐子。

回答

0

這個問題與jsp servlets無關,我創建了一個新帖子here,其中指出了什麼是問題。