しかし、インド象を扱う初心者にとっては、Javaコンテナからジョブを開始する方法を理解することは困難です。
たとえば、 ikrumpingの好意によるこのチュートリアルには 、次のコード例が含まれています。
Job job = new Job(config, "grep"); /* * jar- * . */ job.setJarByClass(Grep.class);
stendelonアプリケーションを実行すると、このようなコードが機能します。
JBOSS AS、WebSphere AS、Glassfish ASなどからコードを実行すると、このコードは機能しません。
なんで? はい、コンテナはJARファイルを異なるキャッシュに解凍し、そこからクラスを実行するためです。
コンテナの場合にsetJarByClassメソッドが機能しない理由を誰が気にしますか-ネタバレの下であなたを招待します
まず、setJarByClassメソッドの実装を確認することをお勧めします。
ご覧のとおり、findContainingJarメソッドは、URLのプロトコルタイプが「jar」であることを想定しています。
また、各コンテナの場合、プロトコルは異なります。
その結果、setJarByClassメソッドは主に壁に取り付けられたアプリケーションでのみ機能します。
public void setJarByClass(Class cls) { String jar = findContainingJar(cls); if (jar != null) setJar(jar); } private static String findContainingJar(Class my_class) { ClassLoader loader = my_class.getClassLoader(); String class_file = my_class.getName().replaceAll("\\.", "/") + ".class"; try { Enumeration itr = loader.getResources(class_file); while (itr.hasMoreElements()) { URL url = (URL)itr.nextElement(); if ("jar".equals(url.getProtocol())) { String toReturn = url.getPath(); if (toReturn.startsWith("file:")) { toReturn = toReturn.substring("file:".length()); } toReturn = toReturn.replaceAll("\\+", "%2B"); toReturn = URLDecoder.decode(toReturn, "UTF-8"); return toReturn.replaceAll("!.*$", ""); } } } catch (IOException e) { throw new RuntimeException(e); } return null; }
ご覧のとおり、findContainingJarメソッドは、URLのプロトコルタイプが「jar」であることを想定しています。
また、各コンテナの場合、プロトコルは異なります。
その結果、setJarByClassメソッドは主に壁に取り付けられたアプリケーションでのみ機能します。
特定のアプリケーションコンテナに依存しない普遍的な方法でmapreductionの作業を開始する方法は?
これを行うには、次を実行します。
- ジョブから使用されるすべてのクラスを含む別個のJARを作成します
- MapReduceを実行するフードHDFSファイルシステムで称賛してください。
- 起動されたジョブのクラスパスにJARアーカイブを追加します
上記の例では、次のものを置き換える必要があります。
job.setJarByClass(Grep.class);
に
DistributedCache.addFileToClassPath("/user/UserName/test.jar", config);
addFileToClassPathメソッドの最初のパラメーターには、HDFS分散ファイルシステム内のJARファイルへのパスが含まれます。
2番目は、フードの構成(org.apache.hadoop.conf.Configuration)です。
以前はjadarka hadupをスリップする方法が2つありましたが、それらはすでに時代遅れです: blog.cloudera.com/blog/2011/01/how-to-include-third-party-libraries-in-your-map-reduce-job