- 2011-08-04 (Thu) 04:25
- プログラミング
ほとんど同じパターンで Hadoop を使いまくるので,面倒だから Hoge というクラスに Hadoop を動かす部分を全部書いておいて,それを jar に固めて $HADOOP_HOME/lib に入れておいた.使うときには,下みたいに Hoge にパラメータとなるクラス(例えば Fuga)を引数で渡すという形にする.
bin/hadoop jar Fuga.jar Hoge Fuga
で,Hoge の Hadoop 呼び出し部分を何も考えずに
public static void main(String[] args) throws Exception { //... job.setJarByClass(Hoge.class); //... }
とか書いて動かそうとしたら,Fuga のクラスが見つからねぇと Mapper の初期化時辺りに怒られまくった.しばらく理由も分からず…… 3時間ほど独り Hadoop 読み会をした.
結局のところ,job.setJarByClass の引数に Fuga.class のほうを指定しておかないとそれを含む Fuga.jar をワーカに転送してくれない,というオチ.こんなことそこら辺のドキュメントにちゃんと書いてあるような気もするけど,頭の中ではただのおまじないになっていたので全然気づかなかった.アホ.
でもまあ,ぶっちゃけコマンドラインに指定した jar を job.jar として転送してくれる設計でよいと思うのだけど,なぜにわざわざクラスをひとつ指定してそれを含む jar を job.jar として転送するとかいう仕様になっているのだろう?
とりあえず -libjars, -files, -archives で問答無用に必要なファイルを指定しておくのがよいのかもしれない.
閑話休題.
コードを読んでみての感想:org.apache.hadoop.mapred と org.apache.hadoop.mapreduce を行ったり来たりしているのでとても汚い.キレイな Hadoop が欲しい.
- Newer: AWK - はじめ