3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

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

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?