PHP通过Thrift操作Hbase

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.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( "  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扩展。该扩展的源码结构:

2.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服务。

转自:http://blog.csdn.net/hguisu/article/details/7298456

原创文章,作者:s19930811,如若转载,请注明出处:http://www.178linux.com/3076

(0)
s19930811s19930811
上一篇 2015-05-18 17:45
下一篇 2015-05-18 17:48

相关推荐

  • Python入门之迭代,列表解析,生成器及文件操作

    迭代器是访问集合元素的一种方式,迭代器包含了__iter__()(返回迭代器对象本身)next()(返回迭代器的下一个元素)迭代器只能往前不会退后 以下类型支持迭代 序列类型:list,str,tuple 非序列类型:dict,file 自定义类 通过内建的函数iter()或对象自带方法__iter__可以获取迭代器对象 l1=range(5) iter1=…

    Linux干货 2015-12-13
  • 网络配置——路由配置实验

    一、实验环境: 4台虚拟主机,2台CentOS6.8主机做了R1路由器和PC1主机,2台CentOS7.2主机做了R2路由器和PC2主机,4台主机工作在桥接模式下 实验拓扑图: 二、网络配置: ·PC1的网卡配置; ·PC2的网卡配置; ·R1的网卡配置; ·R2的网卡配置; ·启用路由      &nbsp…

    Linux干货 2016-09-07
  • Linux三剑客之grep

    grep(Globel Search Regular Expression and Printing out the line)全面搜索正则表达式并把行打印出来)是一个强大的文本搜索工具,使用正则表达式搜索文本的文本,并把结果打印出来。Unix家族包括grep、egrep和fgrep。egrep是扩张的正则表达式它支持更多的字符,fgrep是fast gre…

    Linux干货 2016-08-12
  • Nginx反向代理、负载均衡的实现

    概述:     上篇介绍了Nginx作为web服务器的一些常用配置的说明,但是在实际生产环境中,Nginx更多是作为前端的负载均衡器,反代前端用户请求到后端真实的web服务器上,完成LNAMP的组合的方式存在。本篇就介绍一些Nginx作为http的反向代理和前端负载均衡调度器的一些常用配置,具体包括:  &n…

    Linux干货 2016-11-01
  • 自制Linux系统

                          自制Linux系统 1、环境准备:         在centos6上添加一块新硬盘,并分区格式化。 &n…

    系统运维 2016-09-21
  • N25-第十周博客作业

    1、请详细描述CentOS系统的启动流程(详细到每个过程系统做了哪些事情) 内核空间的启动流程 一. POST 加电自检 在加电之后,智能设备所运行的内部存储的一系列检测程序集合。缩写为POST。这些检测程序在软件加载到硬件上运行之前对硬件的基本完整性加以验证。 用于实现POST的代码在主板上ROM(CMOS)芯片上。 二. Boot Sequence(BI…

    Linux干货 2017-03-25