私は単純なjavaプログラムを持っています。これはdistcpをラップしてhadoopクラスタ上のファイルをコピーします。 IDEとhadoop cliの両方から正常に実行できます。jsp servletからmapreduceジョブを実行しています
自分のプログラムとやりとりするためにWebインターフェイスを使用できるように、私はjsp Webアプリケーションを使いたいと思っていました。
すべての依存関係を持つfat 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]
これはなぜ起こるのかまだ分かりません。私はYarnClientProtocolProviderを私がwebserverにデプロイしたfat jarに入れました。
アップデート2:私は何とか作成
ユーバージャーは、依存関係のjarファイルのMETA-INF/servicesディレクトリの下にあるすべてのサービスプロバイダの宣言をマージし、したがって、そこに書かれている最後のファイルのみが含まれ'org.apache.hadoop.mapred.LocalClientProtocolProvider'
私はまだ私が
hadoop jar my.jar ....
を使用する理由とき、それは認識して疑問に思って「org.apache.hadoop.mapred.YarnClientProtocolProvider」それは私のMETA-INF/servicesディレクトリの下のサービスプロバイダに存在しないものの、 .jar。
今は、サービスプロバイダのエントリをマージしないuber jarを作成する方法が問題だと思います。