RubyのCassandraクライアントでバッチ処理。blogこの広告は、90日以上更新していないブログに表示しています。2012-04-20RubyのCassandraクライアントでバッチ処理。書き込みのバッチ処理を効率よく行うため、Cassandraクライアントにはバッチ処理用の仕組みが用意されています。(0.12.1)読み込み大量データを処理するバッチ処理では、Cassandra内のデータを意識せずに読み込むとメモリ上に全て展開されてしまって、メモリが足りなくなることがあります。1,000,000件のデータがあった場合、それを一度に読み込むと1,000,000件のデータがメモリに溜まってしまうので、メモリを圧迫してしまいます。解決方法の一つとして、1,000,000件全てをメモリに格納するのではなく、分割取得して処理する方法があります。Cassandraクライアントでは、get_rangeメソッドが分割取得に対応しています。下記のトリガーで分割取得を行います。options[:batch_size]が指定された場合(1度に取得する件数)分割取得の単位件数は、options[:batch_size]に指定された件数分取得します。デフォルトは100件です。処理end書き込みCassandraのThriftClientは、1処理を行う毎にCassandraと通信を行います。大量データの場合、データ件数分通信を行うため、ネットワークIOがボトルネックになる可能性があります。解決方法としては、アプリケーション側で複数命令をキャッシュして、一度に発行する方法があります。Cassandraクライアントでは、batchメソッドが複数命令のキャッシュに対応しています。endendただし、batchメソッドには1つ問題があります。通信データが肥大してCassandra側でタイムアウトする場合があります。解決方法としては、キャッシュデータ量を制限して、指定データに達した場合に都度送信する方法があります。この方法はCassandraクライアントに組み込まれていないため、拡張します。キャッシュデータがbatch_insertの第4引数であるbatch_sizeに指定した件数に達した場合、キャッシュデータをflushします。注意点は、ループ処理が抜けた後に必ずflushする必要があることです。flushしない場合、多くの場合キャッシュデータが完全に送信されません。・メリット通信回数が減るため、ネットワークIOが遅い環境で効果が出やすい。100)endclient.flush書き込みのベンチマーク通常のinsert,Cassandra標準のbatch処理を使ったinsert,拡張したbatch_insertでベンチマークをとりました。接続先が127.0.0.1であるため通信速度が速く、思ったより違いがでませんでした。分散環境では違いが色濃くでると思うのですが。01:13広告を非表示にする関連記事2012-04-05RubyのCassandraクライアントで分散カウンタの削除。»プロフィールid:nori3tsu最近Bitcoin関連技術が気になってます。月別アーカイブはてなブログをはじめよう!nori3tsuさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。