akishin999の日記

調べた事などを書いて行きます。

Java から SSTable を Export してみる

Cassandra 同梱の「bin/sstable2json」スクリプト内で実行している「org.apache.cassandra.tools.SSTableExport」クラスを Java から直接実行して、Cassandra のデータのダンプを取得してみました。

参照ライブラリ


SSTableExport クラスを使用するには、実行時のクラスパスに以下のライブラリが必要です。
これらは全て Cassandra の配布アーカイブ内 lib ディレクトリ以下に同梱されています。

  • apache-cassandra-0.6.1.jar
  • commons-cli-1.1.jar
  • commons-lang-2.4.jar
  • google-collections-1.0.jar
  • high-scale-lib.jar
  • libthrift-r917130.jar
  • log4j-1.2.14.jar
  • slf4j-api-1.5.8.jar
  • slf4j-log4j12-1.5.8.jar


Eclipse のパッケージ・エクスプローラ上では、参照ライブラリーを以下のように設定します。


キーの一覧を出力

まずはキーの一覧を取得してみます。
実行すると以下のように「storage-conf.xml」を探しにいくので、どちらかの方法で指定する必要があります。

  • システムプロパティ「storage-config」の値 + File.separator + storage-conf.xml
  • クラスパス直下の storage-conf.xml


ここでは、システムプロパティに設定しました。

package example.cassandra;

import org.apache.cassandra.tools.SSTableExport;

public class SSTableExportExample {

    public static void main(String[] args) throws Exception {
        // storage-conf.xml のあるディレクトリをシステムプロパティに指定
        System.setProperty("storage-config", "D:/Programs/apache-cassandra-0.6.1-bin/conf");
        
        // sstable には保存されている Data ファイル名を指定。
        // 指定された ColumnFamily の全てのキーを取得する。
        SSTableExport.enumeratekeys("D:/var/lib/cassandra/data/Examples/Entries-5-Data.db", System.out);
    }

}


実行すると以下のように出力されました。

log4j:WARN No appenders could be found for logger (org.apache.cassandra.config.DatabaseDescriptor).
log4j:WARN Please initialize the log4j system properly.
ee3f6bf0-609d-11df-8f34-a7c2f6c4de79
4708f3e0-60f4-11df-8021-b89f58887775
c2fe6e10-603d-11df-91a8-e6d54a3ad2a5
e7f3a2c0-609d-11df-9439-89f718eb7a04
4fc227c0-603d-11df-881a-1f654b68b6fb
3f7dac40-6038-11df-86e3-c06abadd121c
75c5b210-6043-11df-97a0-2efc92711f19
5642bc90-603d-11df-9271-b18292bd5d1f


log4j の設定を行っていないため警告が出ていますが、ちゃんとキーの一覧が出力されているようです。

データのエクスポート


次に、「bin/sstable2json」スクリプト内で実行しているように、SSTableExport.main を呼んでみます。

package example.cassandra;

import org.apache.cassandra.tools.SSTableExport;

public class SSTableExportExample {

    public static void main(String[] args) throws Exception {
        // storage-conf.xml のあるディレクトリをシステムプロパティに指定
        System.setProperty("storage-config", "D:/Programs/apache-cassandra-0.6.1-bin/conf");
        
        // sstable には保存されている Data ファイル名を指定。
        SSTableExport.main(new String[] {"D:/var/lib/cassandra/data/Examples/Entries-5-Data.db"});
    }
}


実行結果は以下のようになります。

log4j:WARN No appenders could be found for logger (org.apache.cassandra.config.DatabaseDescriptor).
log4j:WARN Please initialize the log4j system properly.
{
  "ee3f6bf0-609d-11df-8f34-a7c2f6c4de79": [["626f6172645f6964", "626f61726431", 1273981726823000, false], ["636f6e74656e74", "e38386e382b9e38388e381a7e38199e38288e38082", 1273981726824000, false], ["637265617465645f6174", "313237333938313732362e373638", 1273981726824000, false], ["6964", "65653366366266302d363039642d313164662d386633342d613763326636633464653739", 1273981726824000, false], ["7469746c65", "e38386e382b9e38388", 1273981726824000, false]],
  "4708f3e0-60f4-11df-8021-b89f58887775": [["626f6172645f6964", "626f61726431", 1274018812507000, false], ["636f6e74656e74", "424242424242", 1274018812507000, false], ["637265617465645f6174", "313237343031383831322e343436", 1274018812507000, false], ["6964", "34373038663365302d363066342d313164662d383032312d623839663538383837373735", 1274018812507000, false], ["7469746c65", "4141414141", 1274018812507000, false]],
  ・
  ・
  ・
  "5642bc90-603d-11df-9271-b18292bd5d1f": [["626f6172645f6964", "626f61726431", 1273940240145000, false], ["636f6e74656e74", "74657374e68a95e7a8bf", 1273940240145000, false], ["637265617465645f6174", "313237333934303234302e303839", 1273940240145000, false], ["6964", "35363432626339302d363033642d313164662d393237312d623138323932626435643166", 1273940240145000, false], ["7469746c65", "e38386e382b9e38388", 1273940240145000, false]]
}


同じく log4j の警告は出ていますが、ちゃんとデータは出力されているようです。


標準出力ではなく、ファイルに出力したい場合は export メソッドを使用します。

package example.cassandra;

import org.apache.cassandra.tools.SSTableExport;

public class SSTableExportExample {

    public static void main(String[] args) throws Exception {
        // storage-conf.xml のあるディレクトリをシステムプロパティに指定
        System.setProperty("storage-config", "D:/Programs/apache-cassandra-0.6.1-bin/conf");
        
        // Data ファイルと出力先ファイルを指定
        SSTableExport.export("D:/var/lib/cassandra/data/Examples/Entries-5-Data.db", "C:/tmp/out.txt", null);
    }
}


これで Windows でも JSON 形式で Cassandra のデータをダンプする事ができますね。