CentOS 6 に Thrift を入れてみる

Hadoop と HBase のインストールができたので、
Thrift を入れて PHP で HBase のデータを表示させてみる

#依存ライブラリインストール
###yum
```shell-session
 # 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 を使用する[公式](http://thrift.apache.org/docs/install/centos)の手順では、
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 
[参考](http://d.hatena.ne.jp/shimooka/20130828/1377686595)にさせて頂きました(ありがとうございます)
```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 台構成でサーバー構築してみようかな