惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

F
Fortinet All Blogs
Microsoft Security Blog
Microsoft Security Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Vercel News
Vercel News
Application and Cybersecurity Blog
Application and Cybersecurity Blog
C
Check Point Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
W
WeLiveSecurity
The Hacker News
The Hacker News
L
LINUX DO - 热门话题
T
Tenable Blog
Hugging Face - Blog
Hugging Face - Blog
Google Online Security Blog
Google Online Security Blog
博客园 - Franky
P
Proofpoint News Feed
H
Hacker News: Front Page
P
Privacy & Cybersecurity Law Blog
月光博客
月光博客
P
Proofpoint News Feed
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
The GitHub Blog
The GitHub Blog
云风的 BLOG
云风的 BLOG
博客园_首页
www.infosecurity-magazine.com
www.infosecurity-magazine.com
C
CERT Recently Published Vulnerability Notes
Forbes - Security
Forbes - Security
I
InfoQ
Stack Overflow Blog
Stack Overflow Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Attack and Defense Labs
Attack and Defense Labs
N
News and Events Feed by Topic
博客园 - 叶小钗
T
Threat Research - Cisco Blogs
aimingoo的专栏
aimingoo的专栏
D
Darknet – Hacking Tools, Hacker News & Cyber Security
小众软件
小众软件
大猫的无限游戏
大猫的无限游戏
MongoDB | Blog
MongoDB | Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Hacker News - Newest:
Hacker News - Newest: "LLM"
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 司徒正美
O
OpenAI News
G
Google Developers Blog
Martin Fowler
Martin Fowler
罗磊的独立博客
S
SegmentFault 最新的问题
T
Tor Project blog
量子位

博客园 - pcwanli

Python批量将Word文档(.doc)转换为.docx格式的完整实现步骤 Linux下版本控制器(SVN) -命令行客户端 linux svn 命令 Qwen3-VL视频科技:内容审核系统搭建 svn update 出现Skipped 'feifazuzhi' -- Node remains in conflict处理方法 linux redis.service如何编写 深入php redis pconnect PHP中使用Redis长连接笔记 python happybase 批量读取 如何用phpredis持久化连接pconnect方法提升应用响应速度 python处理常见格式压缩包文件的全指南 Python编程:happybase读写HBase数据库 python redis zset 按分值获取记录 hbase日志如何清理 hbase日志清理 Python的time.strftime()方法 python re.sub第二参数,前值如何引用 【Python】基于python实现Windows Service程序 python解析url参数 提取网页源码头信息的正则表达式 PHP字符串分割:explode()函数详解与应用 python requests get请求禁用自动解压 python importlib动态模块加载遇到is not a package错误,解决方法。 Python正则表达式替换(re.sub)的6种典型应用场景 用Python处理HTML转义字符的5种方式 pymongo批量更新bulk_write php mongodb操作 PHP 通过 Thrift 操作 Hbase 使用thrift的php版本操作hbase数据库
PHP通过Thrift操作Hbase
pcwanli · 2026-03-04 · via 博客园 - pcwanli

来源:https://www.cnblogs.com/luckcs/articles/2619965.html

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

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


通过浏览器查看看到项目中的所有表,证明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
cdext/thriftprotocolcdext/thriftprotocol /usr/local/php/bin/phpize
./configurewithphpconfig=/usr/local/php/bin/phpconfigenablethriftprotocol./configure−−with−php−config=/usr/local/php/bin/php−config−−enable−thriftprotocol make
$ make install

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