前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP通过Thrift操作Hbase

PHP通过Thrift操作Hbase

作者头像
黄规速
发布2022-04-14 18:07:02
1.6K0
发布2022-04-14 18:07:02
举报

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扩展源代码。

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脚本测试:

代码语言:javascript
复制
<?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

代码语言:javascript
复制
然后把生成的thrift_protocol.so文件配置到php.ini并重启apache服务。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2012-02-27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一 、HBase访问接口
  • 二、安装Thrift
    • 1. 下载thrift
      • 2. 解压
        • 3 .编译安装:
          • 4. 启动:
          • 三、测试:
            • 1 .php脚本库操作Hbase
              • 2. 使用PHP扩展的方式来使用thrift
              相关产品与服务
              TDSQL MySQL 版
              TDSQL MySQL 版(TDSQL for MySQL)是腾讯打造的一款分布式数据库产品,具备强一致高可用、全球部署架构、分布式水平扩展、高性能、企业级安全等特性,同时提供智能 DBA、自动化运营、监控告警等配套设施,为客户提供完整的分布式数据库解决方案。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档