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

  1. <?php
  2. ini_set('display_errors', E_ALL);
  3. $GLOBALS['THRIFT_ROOT'] = './php/src';
  4. require_once( $GLOBALS['THRIFT_ROOT'] . '/Thrift.php' );
  5. require_once( $GLOBALS['THRIFT_ROOT'] . '/transport/TSocket.php' );
  6. require_once( $GLOBALS['THRIFT_ROOT'] . '/transport/TBufferedTransport.php' );
  7. require_once( $GLOBALS['THRIFT_ROOT'] . '/protocol/TBinaryProtocol.php' );
  8. require_once( $GLOBALS['THRIFT_ROOT'] . '/packages/Hbase/Hbase.php' );
  9. $socket = new TSocket('10.64.60.83', '9090');
  10. $socket->setSendTimeout(10000); // Ten seconds (too long for production, but this is just a demo ;)
  11. $socket->setRecvTimeout(20000); // Twenty seconds
  12. $transport = new TBufferedTransport($socket);
  13. $protocol = new TBinaryProtocol($transport);
  14. $client = new HbaseClient($protocol);
  15. $transport->open();
  16. //获取表列表
  17. $tables = $client->getTableNames();
  18. sort($tables);
  19. foreach ($tables as $name) {
  20. echo( "  found: {$name}\n" );
  21. }
  22. //创建新表student
  23. $columns = array(
  24. new ColumnDescriptor(array(
  25. 'name' => 'id:',
  26. 'maxVersions' => 10
  27. )),
  28. new ColumnDescriptor(array(
  29. 'name' => 'name:'
  30. )),
  31. new ColumnDescriptor(array(
  32. 'name' => 'score:'
  33. )),
  34. );
  35. $tableName = "student";
  36. try {
  37. $client->createTable($tableName, $columns);
  38. } catch (AlreadyExists $ae) {
  39. echo( "WARN: {$ae->message}\n" );
  40. }
  41. //获取表的描述
  42. $descriptors = $client->getColumnDescriptors($tableName);
  43. asort($descriptors);
  44. foreach ($descriptors as $col) {
  45. echo( "  column: {$col->name}, maxVer: {$col->maxVersions}\n" );
  46. }
  47. //修改表列的数据
  48. $row = '2';
  49. $valid = "foobar-\xE7\x94\x9F\xE3\x83\x93";
  50. $mutations = array(
  51. new Mutation(array(
  52. 'column' => 'score',
  53. 'value' => $valid
  54. )),
  55. );
  56. $client->mutateRow($tableName, $row, $mutations);
  57. //获取表列的数据
  58. $row_name = '2';
  59. $fam_col_name = 'score';
  60. $arr = $client->get($tableName, $row_name, $fam_col_name);
  61. // $arr = array
  62. foreach ($arr as $k => $v) {
  63. // $k = TCell
  64. echo ("value = {$v->value} , <br>  ");
  65. echo ("timestamp = {$v->timestamp}  <br>");
  66. }
  67. $arr = $client->getRow($tableName, $row_name);
  68. // $client->getRow return a array
  69. foreach ($arr as $k => $TRowResult) {
  70. // $k = 0 ; non-use
  71. // $TRowResult = TRowResult
  72. var_dump($TRowResult);
  73. }
  74. $transport->close();
  75. ?>

通过浏览器查看看到项目中的所有表,证明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

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

PHP通过Thrift操作Hbase的更多相关文章

  1. Nodejs通过Thrift操作hbase卡住原因分析及与javascript的垃圾回收机制的关系

    在最近使用Nodejs通过Thrift操作hbase的时候写了个脚本,不断发送http请求,从而取得hbase下所需的数据,但是在run的过程中for循环并没有执行完全,在执行一部分后会卡住,就再也进 ...

  2. Python之操作HBASE数据库

    目前有两个库可以操作HBASE:hbase-thrift 和  happybase happybase使用起来比较简单方便,因此重点学习该库,hbase-thrift只做简要介绍. (一)hbase- ...

  3. 大数据自学6-Hue集成环境操作Hbase

    上一章讲过,Hue集成环境是可以直接操作Hbase,但是公司的环境一直报错,虽然也可以透过写代码访问Hbase,但是看到Hue环境中无法访问,还是觉得不爽,因此决定再花些力气找找原因. 找原因要先查L ...

  4. 大数据自学5-Python操作Hbase

    在Hue环境中本身是可以直接操作Hbase数据库的,但是公司的环境不知道什么原因一直提示"Api Error:timed out",进度条一直在跑,却显示不出表. 但是在CDH后台 ...

  5. python 操作 hbase

    python 是万能的,当然也可以通过api去操作big database 的hbase了,python是通过thrift去访问操作hbase 以下是在centos7 上安装操作,前提是hbase已经 ...

  6. 【Hbase三】Java,python操作Hbase

    Java,python操作Hbase 操作Hbase python操作Hbase 安装Thrift之前所需准备 安装Thrift 产生针对Python的Hbase的API 启动Thrift服务 执行p ...

  7. 吴裕雄--天生自然HADOOP操作实验学习笔记:使用hive操作hbase

    实验目的 熟悉hive和hbase的操作 熟悉hadoop.hbase.hive.zookeeper的关系 熟练大数据环境的搭建 学会分析日志排除问题 实验原理 1.hive整合hbase原理 前面大 ...

  8. 基于jython操作hbase

    一.前言 关于jython介绍,直接上官网www.jython.org,可以得到详细资料,这里只介绍一下jython操作hbase的一些方法,本质上和用java操作hbase差不多,只不过语法换成了p ...

  9. PySpark操作HBase时设置scan参数

    在用PySpark操作HBase时默认是scan操作,通常情况下我们希望加上rowkey指定范围,即只获取一部分数据参加运算.翻遍了spark的python相关文档,搜遍了google和stackov ...

随机推荐

  1. [转] tomcat组成及工作原理

    1 - Tomcat Server的组成部分 1.1 - Server A Server element represents the entire Catalina servlet containe ...

  2. PROTEL99生成GERBER的操作说明

    GBL BOTTOM LAYER(底层布线图)GBO BOTTOM OVERLAYER(底层丝印层)GBP BOTTOM PASTE LAYER(底层锡膏层)GBS BOTTOM SOLDER MAS ...

  3. nodejs--express开发个人博客(2)

    上一部分已经实现了视图的雏形,现在加上逻辑操作. 登陆.注册.文章发表都需要用到数据库的数据存取,用的比较多的就是mongodb了. MongoDB 是一个对象数据库,它没有表.行等概念,也没有固定的 ...

  4. perl5 第十一章 文件系统

    第十一章  文件系统 by flamephoenix 一.文件输入/输出函数  1.基本I/O函数    1)open函数    2)用open重定向输入    3)文件重定向    4)指定读写权限 ...

  5. python开发_大小写转换,首字母大写,去除特殊字符

    这篇blog主要是总结我们在平常开发过程中对字符串的一些操作: #字母大小写转换 #首字母转大写 #去除字符串中特殊字符(如:'_','.',',',';'),然后再把去除后的字符串连接起来 #去除' ...

  6. HDU 2215 Maple trees

    增量法的最小包围圈算法,不会…… #include <cstdio> #include <cstring> #include <iostream> #include ...

  7. 设计模式 - 适配器模式(adapter pattern) 具体解释

    适配器模式(adapter pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 适配器模式(adapter pattern): 将一个类的接 ...

  8. WPF与Winform的选择

    最近公司计划对ERP系统全面升级,现有的ERP是简单的bs架构系统打算改版成cs.平时如自己写一些工具,小应用都是用winform就足够.但是界面总是很难看,据了解WPF在这一方面会强一些.因为之前对 ...

  9. Querying Microsoft SQL Server 2012 读书笔记:查询和管理XML数据 2 -使用XQuery 查询XML数据

    XQuery 是一个浏览/返回XML实例的标准语言. 它比老的只能简单处理节点的XPath表达式更丰富. 你可以同XPath一样使用.或是遍历所有节点,塑造XML实例的返回等. 作为一个查询语言, 你 ...

  10. 初始Android-配置环境

    最近闲来无事自学了一下Android,今天没事想整理一下思绪,简单的介绍一下我自己对环境配置的认识,仅供参考,欢迎提出意见. 1.首先打开Eclipse,然后安装ADT,准备好ADTjar包或者zip ...