Hadoop、java MapReduce:任意のWeb / EEコンテナーからの起動

JavaアプリケーションのスタンドアロンからMapReduceを起動する方法については、インターネット上に非常に多くの例があります。

しかし、インド象を扱う初心者にとっては、Javaコンテナからジョブを開始する方法を理解することは困難です。



たとえば、 ikrumpingの好意によるこのチュートリアルには 、次のコード例が含まれています。



Job job = new Job(config, "grep"); /* *     jar-    *    . */ job.setJarByClass(Grep.class);
      
      







stendelonアプリケーションを実行すると、このようなコードが機能します。



JBOSS AS、WebSphere AS、Glassfish ASなどからコードを実行すると、このコードは機能しません。

なんで? はい、コンテナはJARファイルを異なるキャッシュに解凍し、そこからクラスを実行するためです。



コンテナの場合にsetJarByClassメソッドが機能しない理由を誰が気にしますか-ネタバレの下であなたを招待します
まず、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の作業を開始する方法は?


これを行うには、次を実行します。

  1. ジョブから使用されるすべてのクラスを含む別個のJARを作成します
  2. MapReduceを実行するフードHDFSファイルシステムで称賛してください。
  3. 起動されたジョブのクラスパスに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



All Articles