oranie's blog

旧:iをgに変えると・・・なんだっけ・・・

Cassandraでバッチ処理用のクラスタを作る為にsstableloderを使ってみた

まんまです。今までブログにこれで作れるらしいと書いておきながら試していなかったのでやってみた。
経緯としては元のクラスタは台数が多いので、スナップショットをコピーしてそれからあーだこーだわーわーぎゃーぎゃーするにはちょっと辛かったけど、コピー対象のデータは小さいデータだったので丁度いい機会だったのでやってみた。

まず使い方

  1. 流し込み先のクラスタを作成する。
  2. 流し込むデータと同じkeyspace、columnfamilyのスキーマを設定する
  3. sstableloderを使って流し込む

という手順になる。

気をつける所

sstableloderと流し込み先のVerは一致させる必要がある。これはsstableloderが流し込み先のクラスタに接続する際、nodetool ringに相当する処理を実行してクラスタのノード情報(token情報)を取得するが、sstableloderが1.2系、クラスタが1.1系だとnodetool ring自体の処理(この辺はまだ調べていない)が変更されている為にエラーになってしまった。

使い方としてはdatastaxのドキュメント(http://www.datastax.com/dev/blog/bulk-loading)にも載っているが

/usr/local/cassandra/bin/sstableloader -d 192.168.0.1(初回接続先ノード。このノードに接続してringを実行して実際に流し込むnode情報を取得する。「,」区切りで複数指定可能) keyspace/column_family

となるようにしなければいけない。その為、ディレクトリ構造もこれが実行出来るように

/data/keyspace/column_family/sstableファイル群

というような構造にしておき、一度cd /dataをして上記のkeyspace/column_familyという文字列でディレクトリ構造を指定出来るようにしなければいけない。

実際に流し込んだ所、3台のクラスタ(レプリカファクター3)に流し込んだ時で大体20MB/secという速度だった。で、いくつか並列にsstableloderを実行しても合算したスループットは変わらなかった。これは流し込み先クラスタの書き込み限界に達してしまったと思う。(細かいプロファイリングしていないから憶測)

また使った時にbashでfor文でぐるぐる回していると、たまにconnection redusedなどのexeptionが発生した。理由はさっぱり分かっていない。ログから失敗したデータを手動で流し込むと全く問題が無いのでなんでなんや。

こちらからは以上です。