Impala 0.7 リリース

本日、Cloudera Impala beta 0.7 がリリースされました。
Q2中に公開される正式版リリース前の最終リリースとのことです。

さすがに最終リリース前ということで、機能が盛りだくさんになっています。先日公開されたカラムナファイルシステムのParquetに対応や、分散アグリゲーションなどは興味深いですね。

  • Added support for the Parquet columnar file format
  • Bigger and faster joins through the addition of partitioned joins to the already supported broadcast joins
  • Fully distributed aggregations
  • Fully distributed top-n computation
  • Added support for Avro
  • Support for creating and altering tables
  • Support for GROUP BY with floats and doubles

詳細はこちら (impala-user メーリングリストより)
https://groups.google.com/a/cloudera.org/forum/#!msg/impala-user/2EUowODoRIk/44S7Q044-_UJ

[Tips] ドライバでReducerを指定しなかったら?

トレーニングをやっていると、やさしいものから超絶難しいものまでいろんな質問がやってきます。
以下、調べたものをシェアします。

今回はMapReduce編:

Q. reduceの数を0に指定した場合、reducerは呼ばれるのか?
A. -D mapred.reduce.tasks=0などを使用してreduce数をゼロに指定した場合、
 reduceタスクが実行されることはありません。

Q.ドライバーコードでreducerを指定しない場合は何が呼ばれる?
A.reducerをドライバーコードに記述しなかった場合、newAPIでは
 org.apache.hadoop.mapreduce.Reducer.javaのデフォルトのreduce()が呼ばれます。
 以下のように、コメントには identity function と書かれています。

 /**
   * This method is called once for each key. Most applications will define
   * their reduce class by overriding this method. The default implementation
   * is an identity function.
   */
  @SuppressWarnings("unchecked")
  protected void reduce(KEYIN key, Iterable<VALUEIN> values, Context context
                        ) throws IOException, InterruptedException {
    for(VALUEIN value: values) {
      context.write((KEYOUT) key, (VALUEOUT) value);
    }
  }

 old APIでは、org.apache.hadoop.mapred.JobConf.JavaのgetReducerClass()でデフォルトのクラスをIdentityReducer.classと設定しています。

   /**
   * Get the {@link Reducer} class for the job.
   * 
   * @return the {@link Reducer} class for the job.
   */
  public Class<? extends Reducer> getReducerClass() {
    return getClass("mapred.reducer.class",
                    IdentityReducer.class, Reducer.class);
  }

オープンソース万歳!(?)

HDFSのappend機能を使った場合の編集ログ

編集ログとHDFSの追記

以前、HDFSのfsimageとeditsの変更 | Tech Blogに書いたように、HDFSのeditsにはトランザクションが記録されます。

HDFSのappend(追記)機能を使って書き込んだ場合、editsの内容はどのように見えるのでしょうか?
https://gist.github.com/QwertyManiac/4724582
のコードを利用させていただき検証しました。

サンプルコードの準備

上記のコードをコピーしてJavaのファイルを作成します。(ただ、パッケージ行のみコメントアウトしました)
(続きを読む)

Cloudera Impalaでサッカーのデータを分析

Impalaをビッグデータの分析に使う

昨日ツイッターにも書きましたが、サッカーの試合でセンサーからのデータを収集し、ClouderaのImapalaで分析するという例がClouderaのブログに掲載されています。

これは DEBS (Distributed Event-Based Systems) のページに公開されているデータ(ドイツの Nuremberg Stadiumで取得したサッカー場のセンサーデータ)を使用しています。
The ACM DEBS 2013 Grand Challenge

下記のリンクから(一週間限定だそうですが)実際に EC2 上に構築した Impala を使ったインタラクティブな分析のデモを利用できるようです。
(続きを読む)

MapReduceのメモ(デバッグ)

MapReduceのプログラムをデバッグする場合、ログを大量に出力したいことがあります。

このとき、静的にlog4jの設定を変える場合もありますが、手っ取り早く引数から
hadoop jar aaa.jar TestDriver \
-D mapred.map.child.log.level=TRACE \
-D mapred.reduce.child.log.level=TRACE \
input output
のように指定することもできます。(プログラムがToolRunnerを使用している場合のみです)

期待したログがでない場合はコードにデバッグメッセージを埋め込みましょう。(ただ、呼ばれる回数はデータサイズに依存することが多いので、ログでディスクが溢れないように注意して下さい)

MapReduceのメモ

型違い

MapReduceをJavaで記述する場合、通常

  1. ドライバー
  2. Mapper
  3. Reducer

の3点が必要になります。ドライバーで指定したキー/値の型と、Mapper/Reducerで指定した型が違う場合、以下のような例外を吐きます。ビルド時には検出できないので注意が必要です。

ドライバで指定したKeyがText型, ReducerはKeyがLongWritable型の場合のエクセプションのログ
(折り返しが変なので読みにくくて申し訳ないです。。)

java.io.IOException: wrong key class: org.apache.hadoop.io.LongWritable is not class org.apache.hadoop.io.Text

[完全なログ]
https://gist.github.com/kawamon/82b46959927ac1361a68#file-mapreduce-exception

Hadoop誕生7周年

本日はHadoop生誕(?)7周年だそうです。おめでとうございます!

http://blog.cloudera.com/blog/2013/04/seven-thoughts-on-hadoops-seventh-birthday/

#姪っ子がちょうど今年の春で7歳だったな。

7年前って言うとRHEL4u3(*1)の直後、Windows Vista(*2)も登場していない時代。iPhoneもまだこの世に誕生していなかったんですね。ビッグデータやCloudっていう言葉も流行っていなかった、かなり遠い昔のような気もします。

でもMySQLは5.0がリリースされ、Postgresも8.xだったということを考えると、7年間でエンタープライズで利用されるまでに進化したってのは凄いスピードかと。Oracle10gがリリースされたのは2003年ですよ?
これからも微力ながらHadoopに貢献していければと思います。

下記は記念すべき最初の 0.1.0 版のアナウンスメール。いいですね〜

http://mail-archives.apache.org/mod_mbox/hadoop-common-dev/200604.mbox/%3C44302987.4090506@apache.org%3E

*1 Wikipedia Red Hat Enterprise Linux
*2: Wikipedia Windows Vista