Hadoop と HBase のインストールができたので、
Thrift を入れて PHP で HBase のデータを表示させてみる
#依存ライブラリインストール
###yum
# yum install -y automake libtool flex pkgconfig gcc-c++ boost-devel libevent-devel zlib-devel python-devel ruby-devel
###コンパイル
yum で bison を入れるとバージョンが低いため、コンパイルする
# wget -P /usr/local/src http://ftp.gnu.org/gnu/bison/bison-3.0.2.tar.gz
# tar zxvf /usr/local/src/bison-3.0.2.tar.gz -C /usr/local/src
# cd /usr/local/src/bison-3.0.2
# ./configure
# make
# make install
Thrift インストール
git を使用する公式の手順では、
configure で Makefile.in が無いとかエラーが出るため、
tar.gz を落とし、コンパイルする
# wget -P /usr/loca/src http://ftp.kddilabs.jp/infosystems/apache/thrift/0.9.1/thrift-0.9.1.tar.gz
# tar zxvf /usr/local/src/thrift-0.9.1.tar.gz -C /usr/local/src
# cd /usr/local/src/thrift-0.9.1
# ./configure
# make
make でこける・・・C++ どうのこうの言ってる・・・
途方に暮れ、ダメ元で make でこけた直後に連続で make!
# make
何故か通ったw何これw
# make install
which で確認したところ、インストールできてるようだ
動くか怪しいのでテストプログラムを作成してみる
HBase を展開したフォルダから、ファイルをパクってくる
# mkdir /usr/local/src/tmp
# cp /usr/local/src/hbase-0.98.4/hbase-thrift/src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift /usr/local/src/tmp/
# cd /usr/local/src/tmp
# thrift -gen php Hbase.thrift
gen-php/Hbase/ 内に、Hbase.php, Types.php が作成されていれば、オッケー
Thrift を展開したフォルダから、PHP ライブラリをコピー
# cp /usr/local/src/thrift-0.9.1/lib/php/lib/Thrift /usr/local/src/tmp/gen-php/Hbase/
作成する準備が完了したので、テストプログラムを作成する
HBase に tbl テーブルを作成し、適当なファミリー・カラムにデータを突っ込んでおく
/usr/local/src/tmp/gen-php/Hbase/test.php
参考にさせて頂きました(ありがとうございます)
function autoload($className)
{
$className = ltrim($className, '\\');
$fileName = '';
$namespace = '';
if($lastNsPos = strrpos($className, '\\')) {
$namespace = substr($className, 0, $lastNsPos);
$className = substr($className, $lastNsPos + 1);
$fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
}
$fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
require $fileName;
}
spl_autoload_register('autoload');
include 'Hbase.php';
include 'Types.php';
use \Thrift\Transport\TSocket;
use \Thrift\Transport\TBufferedTransport;
use \Thrift\Protocol\TBinaryProtocol;
use Hbase\HbaseClient;
use Hbase\ColumnDescriptor;
use Hbase\Mutation;
use Hbase\TScan;
$server = 'localhost';
$port = 9090;
try {
$socket = new TSocket($server, $port);
$socket->setRecvTimeout(5000);
$transport = new TBufferedTransport($socket);
$protocol = new TBinaryProtocol($transport);
$client = new HbaseClient($protocol);
$transport->open();
var_dump($client->getTableNames());
$scan = new TScan();
$scan = $client->scannerOpenWithScan('tbl', $scan, null);
var_dump($client->scannerGetList($scan, 2));
} catch (TException $e) {
error_log('TException');
error_log($e);
} catch (Exception $e) {
error_log('Exception');
error_log($e);
}
Qiita にクラス載せる時、どうやったら綺麗になるんだ・・・
実行
# php test.php
結果
array(1) {
[0]=>
string(3) "tbl"
}
array(2) {
[0]=>
object(Hbase\TRowResult)#7 (3) {
["row"]=>
string(5) "test1"
["columns"]=>
array(3) {
["family:c1"]=>
object(Hbase\TCell)#9 (2) {
["value"]=>
string(2) "v1"
["timestamp"]=>
int(1407204133668)
}
["family:c2"]=>
object(Hbase\TCell)#10 (2) {
["value"]=>
string(2) "v2"
["timestamp"]=>
int(1407204189821)
}
["family:c3"]=>
object(Hbase\TCell)#11 (2) {
["value"]=>
string(2) "v3"
["timestamp"]=>
int(1407204289202)
}
}
["sortedColumns"]=>
NULL
}
[1]=>
object(Hbase\TRowResult)#8 (3) {
["row"]=>
string(5) "test2"
["columns"]=>
array(1) {
["family:c1"]=>
object(Hbase\TCell)#13 (2) {
["value"]=>
string(2) "v1"
["timestamp"]=>
int(1407204303127)
}
}
["sortedColumns"]=>
NULL
}
こんなかんじで出力されれば、完了
ライブラリに Thrift2 ってあったけど、まったく使い方分からんw
次は Hadoop 2 台構成でサーバー構築してみようかな