Pull to refresh

HBase + Thrift + PHP

PHP *
Sandbox
Видимо так сложилось исторически, но на хабре не очень много статей о HBase, Thrift и тем более о том как их связать для работы с PHP клиентом. Давайте же ликвидируем этот пробел и пройдемся от инсталяции HBase до получения PHP клиентом примитивных данных из HBase.

Вступление

Для тех кто не в курсе что такое HBase и Thrift, то вот краткое описание:

Hbase — это open source, не реляционная, распределенная база данных созданая по аналогии с BigTable от Google и написаная на Java. Она разработана как часть проекта Hadoop (входящего в состав Apache Software Foundation) и запускается на кластере HDFS (Hadoop Distributed Filesystem), предоставляя схожие с BigTable возможности. То есть, она обеспечивает отказоустойчивый способ хранения больших объемов разреженных данных. Более подробная иформация о HBase в Википедии.

Thrift — это язык описания (декларирования) интерфейсов, которые используются для описания и создания сервисов на различных языках программирования. Он используется как RPC фреймворк и был разработан Facebook. Более подробная иформация о Thrift в Википедии.

Установка

Итак, давай те же все установим. Для начала поставим Thrift. Все устанавливать будем из исходников взятых с официального сайта. Итак Thrift:
$ wget apache.strygunov.com//thrift/0.6.1/thrift-0.6.1.tar.gz
$ tar xfz thrift-0.6.1.tar.gz
$ cd thrift-0.6.1/

$ ./configure
$ make
$ make install
$ cd ..

После выполнения конфигурации вы должны увидеть какие языки у вас будут поддерживаться Thrift-ом:
Building C++ Library ......... : no
Building C (GLib) Library .... : no
Building Java Library ........ : no
Building C# Library .......... : no
Building Python Library ...... : yes
Building Ruby Library ........ : no
Building Haskell Library ..... : no
Building Perl Library ........ : no
Building PHP Library ......... : yes
Building Erlang Library ...... : yes

После выполнения make и make install, Thrift будет установлен и готов к использованию. Переходим к HBase. Тут все гораздо проще, все что нам надо это скачать дистрибутив, разархивировать, подправить конфиг и HBase готов к тестовому запуску.
$ wget apache.infocom.ua//hbase/hbase-0.90.3/hbase-0.90.3.tar.gz
$ tar xfz hbase-0.90.3.tar.gz

Теперь надо отредактировать конфиг и добавить путь к папке в которой будет храниться база:
$ vim hbase-0.90.3/conf/hbase-site.xml

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hbase.rootdir</name>
<value>file:///path/to/folder/for/hbase</value>
</property>
</configuration>

После этого можно запускать HBase:
$ ./hbase-0.90.3/bin/start-hbase.sh


Генерация Thrift для Hbase и тестирование

Генерация Thrift для Hbase очень проста, для этого достаточно выполнить следующую команду:
$ thrift --gen php hbase-0.90.3/src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift

После выполнения этой команды у вас появится папка gen-php в которой будут сгенерированные клиенты на PHP для HBase. Теперь эти скрипты надо перенести в папку с PHP библиотекой для работы с Thrift. После выполнения make install, библиотека должна была быть автоматически скопированна в папку с php, для примера будем считать что это папка /usr/lib/php и в ней необходимо создать папку packages и поместить туда содержимое папки gen-php. Как видите все просто.

Теперь давайте внесем тестовые данные в HBase, для этого сначала запустим shell HBase-а:

$ ./hbase-0.90.3/bin/hbase shell
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Type "exit<RETURN>" to leave the HBase Shell
Version: 0.90.0, r1001068, Fri Sep 24 13:55:42 PDT 2010

hbase(main):001:0> create 'blogposts', 'post', 'image'
0 row(s) in 1.2200 seconds

hbase(main):002:0> put 'blogposts', 'post1', 'post:title', 'Hello World'
hbase(main):003:0> put 'blogposts', 'post1', 'post:author', 'The Author'
hbase(main):004:0> put 'blogposts', 'post1', 'post:body', 'This is a blog post'
hbase(main):005:0> put 'blogposts', 'post1', 'image:header', 'image1.jpg'
hbase(main):006:0> put 'blogposts', 'post1', 'image:bodyimage', 'image2.jpg'

hbase(main):007:0> get 'blogposts', 'post1'

COLUMN CELL
image:bodyimage timestamp=1229953133260, value=image2.jpg
image:header timestamp=1229953110419, value=image1.jpg
post:author timestamp=1229953071910, value=The Author
post:body timestamp=1229953072029, value=This is a blog post
post:title timestamp=1229953071791, value=Hello World

hbase(main):008:0> exit


Итак что же мы только что сделали? Во первых create 'blogposts', 'post', 'image' создали таблицу blogposts с двумя семействами колонок post и image. Далее put 'blogposts', 'post1', 'post:title', '...' мы создали одну строку с набором значений, и в конце проверили наличие данных в таблице и вышли из shell-а.

Итак все готово для запуска thrift сервера и создания демо клиента на PHP. Первым делом запускаем thrift сервер, без которого мы не сможем работать:
$ ./hbase-0.90.3/bin/hbase thrift start

Отлично, теперь осталось создать маленький тестовый клиент на PHP:
<?php

// указываем путь к каталогу с Thrift библиотекой
$GLOBALS['THRIFT_ROOT'] = '/usr/lib/php';

require_once( $GLOBALS['THRIFT_ROOT'].'/Thrift.php' );

require_once( $GLOBALS['THRIFT_ROOT'].'/transport/TSocket.php' );
require_once( $GLOBALS['THRIFT_ROOT'].'/transport/TBufferedTransport.php' );
require_once( $GLOBALS['THRIFT_ROOT'].'/protocol/TBinaryProtocol.php' );

// HBase клиент
require_once( $GLOBALS['THRIFT_ROOT'].'/packages/Hbase/Hbase.php' );

// подключаемся к thrift серверу
$socket = new TSocket( 'localhost', 9090 );
$socket->setSendTimeout( 10000 );
$socket->setRecvTimeout( 20000 );
$transport = new TBufferedTransport( $socket );
$protocol = new TBinaryProtocol( $transport );
$client = new HbaseClient( $protocol );

$transport->open();

// и получаем данные из HBase
print_r($client->getTableNames());

print_r($client->getColumnDescriptors( 'blogposts' ));

print_r($client->getRow( 'blogposts', 'post1' ));

$transport->close();

?>

Вот и все что нужно для начала работы с PHP и HBase.

Список используемой литературы:
Tags:
Hubs:
Total votes 38: ↑35 and ↓3 +32
Views 10K
Comments 18
Comments Comments 18