2011-05-22

CassandraのPerl実行環境を構築する(ActivePerl)

■目的

Windows上のPerl(ActivePerl)でCassandraに接続するための環境を構築する。

■環境
OS Windows XP
Cassandra 0.7.6-2
CASSANDRA_HOME D:\cassandra\apache-cassandra-0.7.6-2
Perl Active Perl 5.12.3
ActivePerlのインストール先 D:\PERL

■「Thrift」と「Thrift compiler for Windows」のダウンロード
Apache Thriftから「Thrift」と「Thrift compiler for Windows」をダウンロードします。

今回は以下のバージョンのファイルをダウンロードしました。
Thrift thrift-0.6.0.tar.gz
Thrift compiler for Windows thrift-0.6.0.exe

■ThriftのPerl用ライブラリの配置

ダウンロードしたThriftのファイルを解凍します。
以下のディレクトリとファイルを「D:\Perl\site\lib」に配置します。

lib\perl\lib\Thrift
lib\perl\Thrift.pm

【ディレクトリ構成】
D:\PERL\SITE
└─lib
    │  Thrift.pm
    │  
    ├─Thrift
    │      BinaryProtocol.pm
    │      BufferedTransport.pm
    │      FramedTransport.pm
    │      HttpClient.pm
    │      MemoryBuffer.pm
    │      Protocol.pm
    │      Server.pm
    │      Socket.pm
    │      Transport.pm
    │      

■Cassandra用のPerlパッケージ作成

今回は、作業ディレクトリとして、D:\cassandra\Thriftを準備しました。
ダウンロードしたファイルを「D:\cassandra\Thrift」にコピーします。
「D:\cassandra\Thrift」で以下のコマンドを実行します。
>thrift-0.6.0 --gen perl D:\cassandra\apache-cassandra-0.7.6-2\interface\cassandra.thrift

「D:\cassandra\Thrift」に、「gen-perl」ディレクトリが作成され、その配下にパッケージファイルが作成されます。
D:\cassandra\Thrift\gen-perl
└─Cassandra
        Cassandra.pm
        Constants.pm
        Types.pm

gen-perlディレクトリに作成されたディレクトリを「D:\Perl\site\lib」に配置します。
先に作成したThriftのパッケージと併せて以下のようなディレクトリ構成になります。
【ディレクトリ構成】
D:\PERL\SITE
└─lib
    │  Thrift.pm
    ├─Cassandra
    │      Cassandra.pm
    │      Constants.pm
    │      Types.pm
    ├─Thrift
    │      BinaryProtocol.pm
    │      BufferedTransport.pm
    │      FramedTransport.pm
    │      HttpClient.pm
    │      MemoryBuffer.pm
    │      Protocol.pm
    │      Server.pm
    │      Socket.pm
    │      Transport.pm

■Perlでアクセス

PerlでCassandraにデータを挿入するプログラム(SimpleInsert.pl)で、動作を確認します。
スキーマは、Cassandra0.7のスキーマサンプルのスキーマを使用します。

SimpleInsert.plは、
キースペース:Keyspace1,カラムファミリー:Standard1
に、
キー:sample1,カラム:hoge,カラム:sample_value
を挿入するプログラムです。

キースペース Keyspace1
カラムファミリー Standard1

キー カラム
sample1 hoge sample_value

【実行結果】
D:\cassandra\Thrift>perl SimpleInsert.pl
1件インサート完了.

「Cassandra CLI」で、データが挿入されたことを確認します。
[default@unknown] use Keyspace1;
Authenticated to keyspace: Keyspace1
[default@Keyspace1] list Standard1;
Using default limit of 100
-------------------
RowKey: sample1
=> (column=686f6765, value=73616d706c655f76616c7565, timestamp=1306068102)

columnとvaluseがバイト文字列で表示されますが、コードで挿入した文字列であることを確認するために、以下のコードで確認してみます。
【バイト文字列を確認するプログラム(CassndraByteData.pl)】
@data = ( 'hoge', 'sample_value' );
foreach $d (@data) {
    print "$d:" . unpack( "H*", $d ) . "\n";
}
【実行結果】
D:\cassandra\Thrift>perl CassndraByteData.pl
hoge:686f6765
sample_value:73616d706c655f76616c7565

【SimpleInsert.plのコード】
サンプルコードは、「Cassandraのはじめ方─手を動かしてNoSQLを体感しよう」のサンプルコード(Java)を参考に作成しました。

#!/usr/bin/perl -w
use strict;
use warnings;

# Change for your environment
use Cassandra::Cassandra;
use Cassandra::Constants;
use Cassandra::Types;

use Thrift;
use Thrift::BinaryProtocol;
use Thrift::Socket;
use Thrift::FramedTransport;

use Data::Dumper;

my $socket = new Thrift::Socket( 'localhost', 9160 );
my $transport = new Thrift::FramedTransport( $socket, 1024, 1024 );
my $protocol  = new Thrift::BinaryProtocol($transport);
my $client    = new Cassandra::CassandraClient($protocol);

my $keyspace      = 'Keyspace1';
my $column_family = 'Standard1';

eval {
    $transport->open();
    my $auth_request = new Cassandra::AuthenticationRequest();

    $auth_request->{credentials} = { username => 'user', password => 'pass' };
    $client->login($auth_request);
    $client->set_keyspace($keyspace);

    my $key               = 'sample1';
    my $timestamp         = time;
    my $consistency_level = Cassandra::ConsistencyLevel::ONE;

    my $column_parent =
      new Cassandra::ColumnParent( { column_family => $column_family } );

    my $column = new Cassandra::Column(
        {
            name      => 'hoge',
            value     => 'sample_value',
            timestamp => $timestamp
        }
    );

    # 1件カラムをインサート
    $client->insert( $key, $column_parent, $column, $consistency_level );
    $transport->close();

};

if ($@) {
    warn( Dumper($@) );
}

print "1件インサート完了.\n";

1;

0 件のコメント: