0

我有一个简单的 java 程序,它包装 distcp 以在 hadoop 集群上复制文件。我可以从 IDE 和 hadoop cli 成功运行它。

我想要一个 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,它确实是yarn

有任何想法吗?


更新1:

经过一些调试,我发现以下代码:

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

当我在本地运行它时,我得到:

org.apache.hadoop.mapred.YarnClientProtocolProvider@7a4f0f29
org.apache.hadoop.mapred.LocalClientProtocolProvider@5fa7e7ff

但是当它从网络服务器运行时,我得到:

org.apache.hadoop.mapred.LocalClientProtocolProvider@5fa7e7ff

我仍然无法找出为什么会发生这种情况。我在 webserver 中部署的 fat jar 中有YarnClientProtocolProvider


更新2:

我创建的 uber jar 以某种方式合并了依赖 jar 的 META-INF/services 目录下的所有服务提供者声明,因此在那里写入的最后一个文件仅包含“org.apache.hadoop.mapred.LocalClientProtocolProvider”。

我仍然想知道为什么当我使用

hadoop jar my.jar ....

它识别 'org.apache.hadoop.mapred.YarnClientProtocolProvider' 虽然它不在 my.jar 的 META-INF/services 目录下的服务提供者中。

现在我认为问题应该是如何创建一个不合并服务提供者条目的 uber jar。

4

1 回答 1

0

该问题与 jsp servlet 无关,我在此处创建了一个新帖子,其中说明了究竟是什么问题。

于 2017-06-16T17:46:48.237 回答