ラベル cassandra の投稿を表示しています。 すべての投稿を表示
ラベル cassandra の投稿を表示しています。 すべての投稿を表示

2013年7月8日月曜日

cassandra cql3 jdbc

Cassandra のSQLライクなQLであるところのCQL3をjdbc越しに使う方法。 どうも昔は、Cassandraのディストリビューションに必要なDriverが入っていた らしいのだけど、1.2.4現在、なぜか外されている? よくわからないことに、org.apache.cassandra.cql.jdbc というそれっぽいパッケージ は残っており、そこにはJDBC関連の型があるのだけどドライバがないのだ。

driver のダウンロードとインストール

https://code.google.com/a/apache-extras.org/p/cassandra-jdbc/ にコードが有る。

自前でビルドしようとしたら、変なコードが混じっていてJavaCompiler が通らなかったり、 Java1.7 の JDBCで追加されたsetSchema/ getSchemaをサポートしていなかったりでコンパイルが 通らない。。

とりあえず1.2.5向けのjarを持ってきてCLASSPATHを通したら動いた。

public static void main(String[] args) throws Exception {

    Class.forName("org.apache.cassandra.cql.jdbc.CassandraDriver");
    Connection con = DriverManager.getConnection("jdbc:cassandra://localhost:9160/testks");

    String query = "INSERT INTO simpledata (id, content)    VALUES (?, ?);";
    
    PreparedStatement statement = con.prepareStatement(query);

    statement.setString(1, "002");
    statement.setString(2, "foobarfoobar");
    
    statement.execute();

    statement.close();
}

2013年5月10日金曜日

Cassandra の複数サーバを1ノードで動かす

普通この種のものは、ポートを設定ファイルで切り替えてやれば1ノードで複数サーバを動かすことができるのだけど、Cassandraではむずかしい。というのは、システムのポート番号が全てのサーバで同一であることが前提となっているらしいからだ。サーバのノード情報はゴシップでやり取りしているはずだから、一度接続出来ればポート番号を交換して共有できそうなものなのだが、その接続ができない。

yamlファイルのseedsを指定するフィールドが、IPアドレスのみを指定するようになっていて、ポート番号を指定できない。簡単に修正できれば修正してみようかと、ソースを追ってみたけど割に中の方までIpAddressだけしか持っていないので難しいと判断。

VMの中なので、ネットワークインターフェイスを増やすのは簡単なので、それで何とかしようかと思ったのだが、 ググったらもっと簡単な方法があった。 3年前の記事

ローカルホストのloインターフェイスにaliasで別のIPアドレスをふり、それを使うという方法。 本物のネットワーク・インターフェイスを増やすと色々面倒だけどこれなら、ずっと楽だしVMじゃなくてもできる。

以下ubuntuでの方法。

  • sudo ifconfig lo:1 127.0.0.2 up    
    
    とかやって、lo:1というインターフェイスを作る。必要な数だけつくる。
  • conf ディレクトリをサーバの数だけ複製する。
  • cassandra.yamlの data_file_directories, commit_log_directory, saved_caches_directory が重複しないように 別々のディレクトリを掘って指定する。
  • cassandra.yamlの listen_address と rpc_address を127.0.0.2などに変更する。
  • cassandra.yamlのseeds にアドレスを並べる
      - seeds: "127.0.0.1,127.0.0.2"
    
  • log4j-server.properties の /var/log/cassandra となっている部分を適宜重複しないように変更する。
  • cassandra-env.sh のJMX_PORTは別の値を指定する。このポートは常に0.0.0.0に対してバインドされるらしいので 複数のサーバ間が同じポートで共有することができないらしい。
  • 起動時には新しく作ったconfディレクトリを環境変数で指定して起動すれば良い。
    CASSANDRA_CONF=conf1 bin/cassandra
    

2012年8月11日土曜日

cassandra をとりあえず動かす


conf/cassandra.yaml の下記の3つは、ローカルディスクを参照するように変更しないとまずい。
  • data_file_directories
  • commitlog_directory
  • saved_caches_directory
listen_address:localhost をコメントアウト

seed_provider/parameters/seeds: に最初に起動するノードのアドレスを書く

conf/log4j-server.properties
  • logファイルの場所を変更
---

で、bin/cassandra で一つづつノードを立てる。このとき十分に間隔を開けないと面倒なことになる。1分ぐらいは開けた方がいい。

bin/nodetool ring で状況を確認できる。



2011年11月22日火曜日

cassandora 1.0 で YCSB

  • ベンチマークツール YCSBは 公式には多分まだ1.0をサポートしていない。db/cassandora-1.0というディレクトリはない。 けど試したところ、どうも0.8用の設定で動く模様。
  • YCSBを動作させるにはテーブルスキーマを設定しなければならない。0.6ではstorage.xmlというファイルで静的に設定することができたが、これは0.7以降はできなくなっている。xml対yamlという話ではなく、0.7からは動的にスキーマが変更できるようになったため静的に設定できるべきではなくなった、ということらしい(出典)。
  • したがって、動的にスキーマを入れなければならないが、これにはcassandra-cliを使う。基本的にはインタラクティブに使うツールのようだが、ファイルを指定すればバッチで実行される。
    create keyspace usertable
        with placement_strategy = 'org.apache.cassandra.locator.SimpleStrategy'
        and strategy_options = {replication_factor:1};
    use usertable;
    create column family data;
    
    このようなファイルをsetup.cas として用意しておいて
    > cassandra-cli -h localhost -p 9160 -f setup.cas
    
    とすればよい。