読者です 読者をやめる 読者になる 読者になる

たごもりすメモ

コードとかその他の話とか。

Hadoopとscribedの組合せ・2011年夏

Hadoop scribe

Hadoopクラスタを組み直す機会がやってくるのでこの際だからHadoopのバージョンを上げるべくあれこれテスト中。で、それにあわせて scribed のビルドもやったのでせっかくだから記録を残しておく。

なお以前(2011年当初)の状況については以下のエントリを参照のこと。

手順などについては上記エントリを起こしたときのものから変わってないので再掲はしない。そちらを参照のこと。

各ソフトウェアのバージョンについて

以前調べたときは CDH3b3 使えねえ!ということになっていたが、既に CDH3u1 が出ているのでそちらで試してみた、ら、使えた! やっほう!
現状のソフトウェア・ライブラリ構成および各バージョンはこんな。

  • JDK 6 Update 27
  • JDBC MySQL Connector 5.1.17
    • Hive のMetastoreに使用する MySQL 5.1 のためにダウンロードして /usr/local/hive/lib に設置
  • Boost 1.45.0
    • 現状最新版は 1.47.1 だが使えない
    • こちら を参照のこと
  • Thrift 0.7.0
  • scribe GitHub からHEAD
    • 9/1時点でのHEADのtarballをダウンロードして使用
  • Hadoop CDH3u1
    • tarball をダウンロードして /usr/local 以下に展開して使用
    • またHiveも使ってるので Hive CDH3u1 も同様にダウンロードして展開

今回はLinux用の FUSE hdfs (Filesystem in user space) は使わないので、この部分に関する互換性確認・動作確認はとっていない。かわりに Hoop を使う。つもり。(これは次のエントリで書く。)

変化としてはThriftのバージョンがふたつも上がっていること。これでfb303やscribeコンパイル時に出ていた怪しげなエラーが出なくなり、一発でビルドできるようになった。scribe自体はほとんど変わってない*1。やっぱりFacebookでは既にJavaベースの次世代scribeを作っているというのは本当なんだろうなあ。出してほしいなあ。

また以前はHiveのリリースに含まれていた JDBC MySQL Connector が含まれなくなったとかでしばらくハマった。Oracleのサイトからダウンロードして自分で配置しておく必要がある。

これで、あとは以前から使っていた設定ファイルを基本的にはそのまま受け継いだ設定でぶち込んだら動いた。scribedからhdfsへの書き込みもばっちり。いやばっちりになるのは次項の注意点に気をつければだけど……。

注意点: CLASSPATH

Javaの事情に疎いのでいつからなったのか正確に知らんのだけど、CLASSPATHに jar ファイルそのものを列挙しなくても jar ファイルのパスのパターンをワイルドカードで指定できるようになったらしい。これで超汚い環境変数やプロセス名とはおさらばだぜ! ひゃっほう!!!1!

……と思っていたのだが、hadoopコマンドやhiveコマンドは正常に動くものの、scribedがクラスが見付からんとかいってエラーを吐いて動かない。なぜかと思って試行錯誤してみたら、どうもアスタリスクのパターンのCLASSPATHを理解できてないっぽい。jarファイルをリストアップして環境変数に突っ込んだら動いた。ひどい。

しょうがないので、通常はアスタリスクで指定しつつ、scribedの起動時にのみ必要なjarをリストアップしてCLASSPATHとして渡してやるよう .bashrc に以下のように書くことにして回避した(ことにした)。

alias scribed="env CLASSPATH=`ls -1 /usr/local/hadoop/*.jar /usr/local/hadoop/lib/*.jar | grep -v 'test' | grep -v 'example' | perl -e '@jars=<STDIN>;chomp @jars; print join(\":\",@jars);'` /usr/local/bin/scribed"

実にアドホックですね! あと知らない人がこの環境でscribedのトラブル対処とかしようとしたらハマりそう……。

結論

FacebookにはさっさとJavaベースの新版scribedを公開していただきたい。あとPTail。(超関係ない)

*1:ふたつパッチが当たってるけど、ごく軽微なもの。