CassandraのClusterを構成するNode間でデータ移転を行う必要が出た場合、下記の様な手順で行われます。

  1. データ受信側が、データ送信側に対して必要とするデータの範囲を送ります。
  2. データ送信側は、受け取った範囲情報に従って必要なSStableファイルをStreamingの為にCopyします。複数のSSTableから単一のSSTableを生成する「Compaction」と逆の処理を行う為、この処理は「Anti-Compaction」と呼ばれています。
  3. データ送信側は、データ受信側に対してまず送信するデータの一覧を送り、それに続いて実データの転送を開始します。

Monitoring the status of streaming on both source and destination nodes can be found (in 0.6) under the org.apache.cassandra.streaming.StreamingService MBean. The Status attribute gives an easy indication of what a node is doing with respect to streaming.

一連の処理の中でステップ2が最も時間を要します。この作業が行われている間、データ受信側はデータ受信のみしか出来なく成ってしいます。Anti-Compactionの監視を行うのであれば、Data送信NodeのCompaction MBeanを覗くと良いでしょう。

ステップ3として、実際のデータトランスファーが始まると、送信ノードは"どこかのノードにデータを送信していますよ"、とレポートしだします。 受信する方も、"ストリームを受信していますよ"と出ます。'StreamDestinations'と'StreamSources'属性は、ストリームデータを送受信するためのホストのリストを持ちます。

getOutgoingFiles(host)操作 と getIncomingFiles(host)操作は、指定されたホストへの各ファイルの送信状況をリストとして返します。 各文字列は以下のフォーマットになっています。 [ファイルへのパス] [送信バイト数/受信バイト数]/[ファイルサイズ] もしあなたのクラスタでストリーミングが長すぎると感じる場合、最初にすべきことはStreamSourcesStreamDestinationsどこのホストにストリーミングしているかを確認する事です。次にgetOutgoingFiles()getIncomingFiles()で問題な可能性があるノードへの 各個別のファイルの送信状況を調べます。 ストリーミングは32MBのチャンクで送信しますので、数秒後にでも送受信の状況をきちんと再確認した方が良いです。 もし全く変更がない場合、または遅いと感じる場合、何かがおかしいです。一つ頭にいれておいてほしいのは、送信元のほうは1回のストリームで 1ファイルしか送信できないようになっていて、受信先のノードは複数のファイルを同時に受け取る事が出来るという事です。

stats

Streaming_JP (last edited 2013-11-15 17:18:27 by GehrigKunz)