@blog.justoneplanet.info

日々勉強

ThriftをインストールしてPHPからCassandraを使う

ThriftでPHPからCassandraが扱えるらしいぞ((o(´∀`)o))ワクワク

■ソースの入手と解凍

wget http://www.meisei-u.ac.jp/mirror/apache/dist//incubator/thrift/0.4.0-incubating/thrift-0.4.0.tar.gz
tar zxvf thrift-0.4.0.tar.gz

■前準備

cd thrift-0.4.0
./configure

エラー1

configureの途中で以下の様なエラーがでた。

checking for boostlib >= 1.33.1... configure: error: We could not detect the boost libraries (version 1.33 or higher). If you have a staged boost library (still not installed) please specify $BOOST_ROOT in your environment and do not give a PATH to --with-boost option.  If you are sure you have boost installed, then check your version number looking in <boost/version.hpp>. See http://randspringer.de/boost for more documentation.
対処1

boostlib1.33.1以上が必要らしいので以下のコマンドでインストールする。

yum install boost-devel

■インストール

make
make install

エラー2

makeの途中で以下の様なエラーがでた。

BUILD FAILED
/home/admin/thrift-0.4.0/lib/java/build.xml:96: Class org.apache.tools.ant.taskdefs.ConditionTask doesn't support the nested "typefound" element.
対処1

antのバージョンがイカンらしい。(;>_<;)

As you mention, there is no package for ant 1.7.1 on RHEL 5. Until the Hadoop build is fixed to work on ant 1.6 (which will likely not happen soon if ever), you will need to:

  1. Download the Apache Ant 1.7.1 tarball
  2. Extract it
  3. Setup the environment variable ANT_HOME to point to the location you extracted the tarball
  4. Add $ANT_HOME/bin to the front of your $PATH

以下のサイトを参考にソースからインストールする。

他にもインストールに必要なライブラリがあるらしいのでインストール。

yum install libtool
yum install flex
yum install bison
yum install ruby-devel
yum install libevent-devel

再チャレンジする!

make clean
./configure
make
make install

確認してみる。

thrift -version
Thrift version 0.4.0

キタ━━━━(゚∀゚)━━━━!!

■PHPから使う準備

Cassandraの場所を確認

cassandraの場所を忘れたので確認する。

whereis cassandra
cassandra: /usr/local/cassandra

モジュールを生成

以下のコマンドを実行するとPHP用のモジュールが生成される。

cp /usr/local/cassandra/interface/cassandra.thrift /home/admin/module/cassandra.thrift
thrift --gen php /home/admin/module/cassandra.thrift
ls /home/admin/module/gen-php/cassandra
Cassandra.php  cassandra_constants.php  cassandra_types.php

Thriftのphp用ライブラリをコピー

cp -r /home/admin/thrift-0.4.0/lib/php/src/* /home/admin/gen-php/cassandra/

■PHPから使う

いよいよだ。

ディレクトリ構成

  • ext
  • packages
  • protocol
  • server
  • transport
  • autoload.php
  • Thrift.php

packages/cassandraの中に以下の3ファイルが含まれる。

  • Cassandra.php
  • cassandra_constants.php
  • cassandra_types.php

データの登録

以下のようにしてCassandraにデータを登録することができる。

<?php
require_once 'cassandra/Thrift.php';
require_once 'cassandra/protocol/TBinaryProtocol.php';
require_once 'cassandra/transport/TSocket.php';
require_once 'cassandra/transport/TBufferedTransport.php';
require_once 'cassandra/packages/cassandra/Cassandra.php';
require_once 'cassandra/packages/cassandra/cassandra_types.php';

$socket    = new TSocket('192.168.11.3', 9160);
$transport = new TBufferedTransport($socket, 1024, 1024);
$protocol  = new TBinaryProtocolAccelerated($transport);
$client    = new CassandraClient($protocol);
$transport->open();

// set column path
$columnPath = new cassandra_ColumnPath();
$columnPath->column_family = 'Standard1';
$columnPath->column        = 'column';

// set value
$client->insert(
    'Keyspace1',
    'key',
    $columnPath,
    'value',
    time(),
    cassandra_ConsistencyLevel::ONE
);

// close
$transport->close();

データの取得

以下のようにして指定したキーを値を得ることができる。

<?php
require_once 'cassandra/Thrift.php';
require_once 'cassandra/protocol/TBinaryProtocol.php';
require_once 'cassandra/transport/TSocket.php';
require_once 'cassandra/transport/TBufferedTransport.php';
require_once 'cassandra/packages/cassandra/Cassandra.php';
require_once 'cassandra/packages/cassandra/cassandra_types.php';
$socket    = new TSocket('192.168.11.3', 9160);
$transport = new TBufferedTransport($socket, 1024, 1024);
$protocol  = new TBinaryProtocolAccelerated($transport);
$client    = new CassandraClient($protocol);
$transport->open();

// set column path
$columnPath = new Cassandra_ColumnPath();
$columnPath->column_family = 'Standard1';
$columnPath->column        = 'column';

// search
$result = $client->get(
    'Keyspace1',
    'key',
    $columnPath,
    null,
    Cassandra_ConsistencyLevel::ONE
);

// close
$transport->close();

// get the result
$data = $result->column->value;
var_dump($data);//value

■ベンチマーク

以下のコードで簡単にベンチマークしてみた。

<?php
require_once 'cassandra/Thrift.php';
require_once 'cassandra/protocol/TBinaryProtocol.php';
require_once 'cassandra/transport/TSocket.php';
require_once 'cassandra/transport/TBufferedTransport.php';
require_once 'cassandra/packages/cassandra/Cassandra.php';
require_once 'cassandra/packages/cassandra/cassandra_types.php';

$socket    = new TSocket('192.168.11.5', 9160);
$transport = new TBufferedTransport($socket, 1024, 1024);
$protocol  = new TBinaryProtocolAccelerated($transport);
$client    = new CassandraClient($protocol);
$transport->open();

// set column path
$columnPath = new cassandra_ColumnPath();
$columnPath->column_family = 'Standard1';
$columnPath->column        = 'column';

// set value
$start = microtime(true);
for($i = 0; $i < 1000; $i++){
    $client->insert(
        'Keyspace1',
        'key',
        $columnPath,
        'abcdefghijklmnopqrstuvwxyz',
        time(),
        cassandra_ConsistencyLevel::ONE
    );
}
$end = microtime(true);
print($end - $start);// 0.7892119884491

// close
$transport->close();

1回目の計測値だけ倍程度の時間がかかったが2回目以降は安定して上述の時間と変わらないような処理時間であった。また、他のKVSのベンチマークと単純に比較できない理由として以下のように考えた。

  • Cassandraはテーブルのような高次元のデータ構造を持っている点
  • 今回、CassandraにはPHPで記述されたライブラリを経由してアクセスしている点

ベンチマークをしておいて言うのもオカシイが、データストアにおいて全く同じ条件というものは再現できないので単純に比較してはならない。用途に応じた選択が必要である。

2 Comments»

RSS feed for comments on this post.TrackBack URL

Leave a comment