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ほどかかったので高負荷のフロントには向かない。
もう少し情報まとめたらまた書く。