我有一个简单的java程序,它 Package distcp以在hadoop集群上复制文件。我可以从ide和hadoop cli成功运行它。
我想要一个jspweb应用程序,这样人们就可以使用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
但当它从web服务器运行时,我得到:
org.apache.hadoop.mapred.LocalClientProtocolProvider@5fa7e7ff
我还不知道为什么会这样。我在webserver中部署的fat jar中有一个enclientprotocolprovider。
更新2:
我创建的uberjar以某种方式合并了依赖jar的meta-inf/services目录下的所有服务提供者声明,因此在那里编写的最后一个文件只包含“org.apache.hadoop.mapred.localclientprotocolprovider”。
我还在想为什么我用
hadoop jar my.jar ....
它识别“org.apache.hadoop.mapred.yarclientprotocolprovider”,尽管它不在my.jar的meta-inf/services目录下的服务提供者中。
现在我想问题应该是如何创建一个不合并服务提供商条目的uberjar。
1条答案
按热度按时间q7solyqu1#
这个问题与jsp servlet无关,我在这里创建了一个新的帖子,说明了问题到底出在哪里。