设为首页 收藏本站
查看: 1366|回复: 0

[经验分享] PHP通过Thrift操作Hbase

[复制链接]

尚未签到

发表于 2015-8-26 08:49:31 | 显示全部楼层 |阅读模式
  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进程:
  


DSC0000.gif
  

三、测试:

1 .php脚本库操作Hbase


  

  
PHP通过Thrift访问Hbase的库是在thrift-0.8.0/lib/php/src目录下,其实这个文件夹下也包含通过Thrift访问Hbase的PHP扩展源代码。
  
1)复制thrift-0.8.0/lib/php到相应的php web目录。
  
2)然后生成php与hbase接口文件


  #/usr/local/thrift/bin/thrift --gen php /usr/local/hbase/src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift

  #(根据自己的目录设置)



   生成目录文件: /usr/local/hbase/gen-php/Hbase

   有文件: Hbase.php,Hbase_types.php  
   把Hbase.php,Hbase_types.php copy到:web目录/php/src/packages/Hbase/
  
3)使用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( &quot;  found: {$name}\n&quot; );
}
//创建新表student
$columns = array(
new ColumnDescriptor(array(
'name' => 'id:',
'maxVersions' => 10
)),
new ColumnDescriptor(array(
'name' => 'name:'
)),
new ColumnDescriptor(array(
'name' => 'score:'
)),
);
$tableName = &quot;student&quot;;
try {
$client->createTable($tableName, $columns);
} catch (AlreadyExists $ae) {
echo( &quot;WARN: {$ae->message}\n&quot; );
}
//获取表的描述
$descriptors = $client->getColumnDescriptors($tableName);
asort($descriptors);
foreach ($descriptors as $col) {
echo( &quot;  column: {$col->name}, maxVer: {$col->maxVersions}\n&quot; );
}
//修改表列的数据
$row = '2';
$valid = &quot;foobar-\xE7\x94\x9F\xE3\x83\x93&quot;;
$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 (&quot;value = {$v->value} , <br>  &quot;);
echo (&quot;timestamp = {$v->timestamp}  <br>&quot;);
}
$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扩展。该扩展的源码结构:
  
DSC0001.gif


  
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



然后把生成的thrift_protocol.so文件配置到php.ini并重启apache服务。  
  



  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-104278-1-1.html 上篇帖子: php生成xml文件头 下篇帖子: php中文件的引入
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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