LoginSignup
3
3

More than 5 years have passed since last update.

CentOS 6 に Thrift を入れてみる

Last updated at Posted at 2014-08-07

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 を入れるとバージョンが低いため、コンパイルする
shell-session
# 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 を落とし、コンパイルする
shell-session
# 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!
shell-session
# make

何故か通ったw何これw
shell-session
# make install

which で確認したところ、インストールできてるようだ
動くか怪しいのでテストプログラムを作成してみる

HBase を展開したフォルダから、ファイルをパクってくる
shell-session
# 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 ライブラリをコピー
shell-session
# 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
参考にさせて頂きました(ありがとうございます)
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 にクラス載せる時、どうやったら綺麗になるんだ・・・

実行
shell-session
# php test.php

結果
text
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 台構成でサーバー構築してみようかな

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3