HBaseへPHPから繋いでみた

HBaseへThriftを利用してPHPからアクセスするサンプル。

$GLOBALS['THRIFT_ROOT'] = '/usr/share/php/Thrift';

require_once $GLOBALS['THRIFT_ROOT'].'/Thrift.php';
require_once $GLOBALS['THRIFT_ROOT'].'/transport/TSocket.php';
require_once $GLOBALS['THRIFT_ROOT'].'/protocol/TBinaryProtocol.php';
require_once $GLOBALS['THRIFT_ROOT'].'/transport/TBufferedTransport.php';
require_once $GLOBALS['THRIFT_ROOT'].'/packages/Hbase/Hbase.php';

try {
    $socket = new TSocket('localhost', 9090);
    $socket->setSendTimeout(1000); // One seconds (too long for production, but this is just a demo ;)
    $socket->setRecvTimeout(2000); // Twe seconds
    $transport = new TBufferedTransport($socket);
    $transport->open();
    $protocol = new TBinaryProtocolAccelerated($transport);
    $client   = new HbaseClient($protocol);

    $tablename = "test";

    //var_dump($client->getColumnDescriptors($tablename));
    //var_dump($client->getTableRegions($tablename));
    //var_dump($client->getRowWithColumns('counter','rows','rows'));
    $c = $client->getRowWithColumns('counter','rows','rows');
    $cnt = (int)$c[0]->columns['rows:']->value + 1;
    $client->mutateRow('counter', 'rows', array(new Mutation(array('column'=>'rows','value'=>$cnt))));
    $row = date("YmdH:") . str_pad($cnt, 10, "0", STR_PAD_LEFT);

    $mutations = array(
        new Mutation(
            array('column'=>'userid', 'value'=>$userid,)),
        new Mutation(
            array('column'=>'passwd', 'value'=>$passwd,)),
        new Mutation(
            array('column'=>'name', 'value'=>$name,)),
        new Mutation(
            array('column'=>'status', 'value'=>$status,)),
        new Mutation(
            array('column'=>'lastaccess', 'value'=>date("YmdHis"),)),
        );
    //print_r($mutations);
    $client->mutateRow($tablename, $row, $mutations);


} catch (TException $e) {
    echo "/* TException\n";
    echo $e->getMessage()."\n";
    echo "*/\n";
} catch (Exception $e) {
    echo "/*\n";
    echo $e->getMessage()."\n";
    echo "*/\n";
}
$transport->close();

変数とかカラム名とかは適当。

mutateRowメソッドでデータの書き込みをしている。

$rowはRDBMSで言うPRIMARYKEY。

第3引数にMutationクラスを利用しないといけない。

この処理だけで100msほどかかったので高負荷のフロントには向かない。

もう少し情報まとめたらまた書く。