设为首页收藏本站

小牛社区-大数据学习交流社区|大数据免费学习资源

 找回密码
 立即注册!

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1685|回复: 0

PHP通过Thrift操作Hbase

[复制链接]

3203

主题

3533

帖子

1万

积分

管理员

Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

积分
14297
发表于 2016-6-4 23:33:10 | 显示全部楼层 |阅读模式
HBase是一个开源的NoSQL产品,它是实现了Google BigTable论文的一个开源产品,和Hadoop和HDFS一起,可用来存储和处理海量column family的数据。官方网址是:http://hbase.apache.org
一 、HBase访问接口

1.  Native Java API,最常规和高效的访问方式,适合Hadoop MapReduce Job并行批处理HBase表数据
2.  HBase Shell,HBase的命令行工具,最简单的接口,适合HBase管理使用
3.  Thrift Gateway,利用Thrift序列化技术,支持C++,PHP,Python等多种语言,适合其他异构系统在线访问HBase表数据
4.  REST Gateway,支持REST 风格的Http API访问HBase, 解除了语言限制
5.  Pig,可以使用Pig Latin流式编程语言来操作HBase中的数据,和Hive类似,本质最终也是编译成MapReduce Job来处理HBase表数据,适合做数据统计
6.  Hive,当前Hive的Release版本尚没有加入对HBase的支持,但在下一个版本Hive 0.7.0中将会支持HBase,可以使用类似SQL语言来访问HBase
如果使用PHP操作Hbase,推荐使用Facebook开源出来的thrift,官网是:http://thrift.apache.org/ ,它是一个类似ice的中间件,用于不同系统语言间信息交换。
二、安装Thrift

在Hadoop和Hbase都已经安装好的集群上安装Thrift,Thrift安装在Hmaster机器上
1. 下载thrift

wget http://mirror.bjtu.edu.cn/apache//thrift/0.8.0/thrift-0.8.0.tar.gz

2. 解压

tar -xzf thrift-0.8.0.tar.gz
3 .编译安装:

如果是源码编译的,首先要使用./boostrap.sh创建文件./configure ,我们这下载的tar包,自带有configure文件了。((可以查阅README文件))
If you are building from the first time out of the source repository, you will
need to generate the configure scripts.  (This is not necessary if you
downloaded a tarball.)  From the top directory, do:
./bootstrap.sh
./configure
make ; make install
4. 启动:

# ./bin/hbase-daemon.sh start thrift [--port=PORT]
starting thrift, logging to /home/banping/hbase/hbase-0.90.3/bin/../logs/hbase-root-thrift-localhost.localdomain.out
Thrift默认监听的端口是9090
使用jps查看进程,看到ThriftServer进程:



三、测试:

1 .php脚本库操作Hbase

PHP通过Thrift访问Hbase的库是在thrift-0.8.0/lib/php/src目录下,其实这个文件夹下也包含通过Thrift访问Hbase的PHP扩展源代码。
复制thrift-0.8.0/lib/php到相应的php web目录。然后使用php脚本测试:


  • <?php  
  •   
  • ini_set('display_errors', E_ALL);  
  • $GLOBALS['THRIFT_ROOT'] = './php/src';  
  •   
  • 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' );  
  • require_once( $GLOBALS['THRIFT_ROOT'] . '/packages/Hbase/Hbase.php' );  
  •   
  • $socket = new TSocket('10.64.60.83', '9090');  
  •   
  • $socket->setSendTimeout(10000); // Ten seconds (too long for production, but this is just a demo ;)  
  • $socket->setRecvTimeout(20000); // Twenty seconds  
  • $transport = new TBufferedTransport($socket);  
  • $protocol = new TBinaryProtocol($transport);  
  • $client = new HbaseClient($protocol);  
  •   
  • $transport->open();  
  •   
  • //获取表列表  
  • $tables = $client->getTableNames();  
  • sort($tables);  
  • foreach ($tables as $name) {  
  •   
  •     echo( "  found: {$name}\n" );  
  • }  
  •    
  • //创建新表student  
  • $columns = array(  
  •     new ColumnDescriptor(array(  
  •         'name' => 'id:',  
  •         'maxVersions' => 10  
  •     )),  
  •     new ColumnDescriptor(array(  
  •         'name' => 'name:'  
  •     )),  
  •     new ColumnDescriptor(array(  
  •         'name' => 'score:'  
  •     )),  
  • );  
  •   
  • $tableName = "student";  
  • try {  
  •     $client->createTable($tableName, $columns);  
  • } catch (AlreadyExists $ae) {  
  •     echo( "WARN: {$ae->message}\n" );  
  • }  
  • //获取表的描述  
  •   
  • $descriptors = $client->getColumnDescriptors($tableName);  
  • asort($descriptors);  
  • foreach ($descriptors as $col) {  
  •     echo( "  column: {$col->name}, maxVer: {$col->maxVersions}\n" );  
  • }  
  •   
  • //修改表列的数据  
  • $row = '2';  
  • $valid = "foobar-\xE7\x94\x9F\xE3\x83\x93";  
  • $mutations = array(  
  •     new Mutation(array(  
  •         'column' => 'score',  
  •         'value' => $valid  
  •     )),  
  • );  
  • $client->mutateRow($tableName, $row, $mutations);  
  •   
  •   
  • //获取表列的数据  
  • $row_name = '2';  
  • $fam_col_name = 'score';  
  • $arr = $client->get($tableName, $row_name, $fam_col_name);  
  • // $arr = array  
  • foreach ($arr as $k => $v) {  
  • // $k = TCell  
  •     echo ("value = {$v->value} , <br>  ");  
  •     echo ("timestamp = {$v->timestamp}  <br>");  
  • }  
  •   
  • $arr = $client->getRow($tableName, $row_name);  
  • // $client->getRow return a array  
  • foreach ($arr as $k => $TRowResult) {  
  • // $k = 0 ; non-use  
  • // $TRowResult = TRowResult  
  •     var_dump($TRowResult);  
  • }  
  •   
  • $transport->close();  
  • ?>  


通过浏览器查看看到项目中的所有表,证明PHP可以通过thrift访问HBase了。

2. 使用PHP扩展的方式来使用thrift

我们使用PHP自带的phpize来生成Thtift的php扩展。该扩展的源码结构:

hadoop@ubuntu:/usr/local/hbase-0.90.4/thrift-0.8.0/lib/php/src
$ cd ext/thrift_protocol
$ /usr/local/php/bin/phpize
$ ./configure --with-php-config=/usr/local/php/bin/php-config --enable-thrift_protocol
$ make
$ make install
  1. 然后把生成的thrift_protocol.so文件配置到php.ini并重启apache服务。
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册!

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册!

本版积分规则

快速回复 返回顶部 返回列表