通过thrift使用PHP访问Hbase

来源:互联网 发布:碳 半导体 知乎 编辑:程序博客网 时间:2024/04/30 20:38
xammp安装在/opt目录下,www目录是/opt/lampp/htdocs/


(1) 创建一个Web目录 phpHbase
[root@gd02 htdocs]# mkdir -p /opt/lampp/htdocs/phpHbase/
[root@gd02 htdocs]# cd /opt/lampp/htdocs/phpHbase
{ 查看PHP访问HBase的例子文件DemoClient.php 
[root@gd02 phpHbase]# locate DemoClient.php 
/root/software/hbase-0.20.6/src/examples/thrift/DemoClient.php
[root@gd02 phpHbase]# ls /root/software/hbase-0.20.6/src/examples/thrift/
DemoClient.cpp  DemoClient.java  DemoClient.php  DemoClient.py  DemoClient.rb  Makefile  README.txt
}


(2) 复制实例文件到web目录 phpHbase  
[root@gd02 phpHbase]# cp /root/software/hbase-0.20.6/src/examples/thrift/DemoClient.php .
{ 查看thrift生成php库所必须的Hbase.thrift文件
[root@gd02 phpHbase]# locate Hbase.thrift
/root/software/hbase-0.20.6/src/java/org/apache/hadoop/hbase/thrift/Hbase.thrift
}


(3) 使用thrift生成php访问Hbase的类文件
[root@gd02 phpHbase]# thrift --gen php /root/software/hbase-0.20.6/src/java/org/apache/hadoop/hbase/thrift/Hbase.thrift
[root@gd02 phpHbase]# ls 命令成功后生成gen-php目录
DemoClient.php  gen-php
[root@gd02 phpHbase]# ls gen-php/Hbase/ 目录下是两个php文件,里面封装了访问HBase的操作.
Hbase.php  Hbase_types.php


(4) 复制thrift的php库文件到当前web目录
[root@gd02 phpHbase]# cp -r /root/thrift-0.6.1/lib/php/src .
[root@gd02 phpHbase]# ls
DemoClient.php  gen-php  src    


(5) 复制生成的php访问Hbase的类文件到src目录下的相应路径中
[root@gd02 phpHbase]# cp gen-php/Hbase/Hbase* src/packages/Hbase/


(6) 修改实例文件以便能够执行
[root@gd02 phpHbase]# vim DemoClient.php 
做如下修改:
#$GLOBALS['THRIFT_ROOT'] = '/Users/irubin/Thrift/thrift-20080411p1/lib/php/src';
更改为:
$GLOBALS['THRIFT_ROOT'] = './src';
#$socket = new TSocket( 'localhost', 9090 );
更改为:
$socket = new TSocket( 'gd02', 9090 );
这里要注意主机名和端口号要对应启动thrift服务的主机和与thrift服务绑定的端口号.


说明:
更改之后, DemoClient.php 中下面这类语句实际只的是 ./src/packages/Hbase/Hbase.php 文件.
require_once( $GLOBALS['THRIFT_ROOT'].'/packages/Hbase/Hbase.php' );
src目录下有这些目录和文件:
[root@gd02 phpHbase]# ls src/
autoload.php  ext  packages  protocol  server  Thrift.php  transport
在 DemoClient.php 有调用到这些目录下的php文件.


(7) 启动 thrift
启动thrift服务的节点和 DemoClient.php 中 $socket = new TSocket( $hostname, $port ) 行中的 $hostname 是对应的,
启动thrift服务时指定的端口号(默认是9090)也要与 $port 对应.
例如:启动 thrift 服务并指定端口号为 9999, 使用 hbase thrift -p 9999 start 命令.


[root@gd02 phpHbase]# hbase  thrift start 1>thrift.log 2>&1 &  启动时没有指定端口号,此时启用默认端口号.
[1] 32430
[root@gd02 phpHbase]# tail -f thrift.log 
日志中出现如下警告信息,但是thrift仍能正常启动成功:
11/06/24 21:32:11 WARN zookeeper.ZKConfig: Cannot read zoo.cfg, loading from XML files
java.io.IOException: The server in zoo.cfg cannot be set to localhost in a fully-distributed setup because it won't be reachable. See "Getting Started" for more information.
at org.apache.hadoop.hbase.zookeeper.ZKConfig.parseZooCfg(ZKConfig.java:173)
at org.apache.hadoop.hbase.zookeeper.ZKConfig.makeZKProps(ZKConfig.java:69)
at org.apache.hadoop.hbase.zookeeper.ZKConfig.getZKQuorumServersString(ZKConfig.java:250)
at org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher.<init>(ZooKeeperWatcher.java:113)
at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getZooKeeperWatcher(HConnectionManager.java:989)
at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.setupZookeeperTrackers(HConnectionManager.java:302)
at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.<init>(HConnectionManager.java:293)
at org.apache.hadoop.hbase.client.HConnectionManager.getConnection(HConnectionManager.java:156)
at org.apache.hadoop.hbase.client.HBaseAdmin.<init>(HBaseAdmin.java:85)
at org.apache.hadoop.hbase.thrift.ThriftServer$HBaseHandler.<init>(ThriftServer.java:194)
at org.apache.hadoop.hbase.thrift.ThriftServer$HBaseHandler.<init>(ThriftServer.java:188)
at org.apache.hadoop.hbase.thrift.ThriftServer.doMain(ThriftServer.java:824)
at org.apache.hadoop.hbase.thrift.ThriftServer.main(ThriftServer.java:881)
11/06/24 21:32:11 INFO ThriftServer: starting HBase ThreadPool Thrift server on gd02/10.10.104.2:9090 (启动成功了,启动节点是 gd02, 端口号是 9090)
意思为: 在完全分布式配置下,zookeeper的配置文件zoo.cfg中的server不能设置为localhost, 这里只需要修改启动thrift服务的节点上的zookeeper配置文件 zoo.cfg.
解决:
[root@gd02 phpHBase]# locate zoo.cfg
/etc/zookeeper.dist/zoo.cfg
[root@gd02 phpHBase]# vim /etc/zookeeper.dist/zoo.cfg
将行 server.0=localhost:2888:3888 更改为 server.0=gd02:2888:3888


启动成功后可以查看到相关进程:
[hadoop@gd02 phpHbase]$ jps
372 Jps
6815 HMaster
32736 ThriftServer 刚使用hbase  thrift start命令启动的进程,它是一个java进程
6757 HQuorumPeer
6180 JobTracker
5930 NameNode
查看进程详细信息
[hadoop@gd02 phpHbase]$ ps -ef | grep thrift 
我们发现启动进程ThriftServer实际上就是调用类的方法: org.apache.hadoop.hbase.thrift.ThriftServer start


(8) 测试:
http://10.10.104.2/phpHbase/DemoClient.php
这里10.10.104.2是gd02的IP.


出现如下结果:
-----------------------------------------------------------------------
scanning tables...
  found: demo_table
    disabling table: demo_table
    deleting table: demo_table
  found: researchers
  found: student
  found: t1
  found: test
creating table: demo_table
column families in demo_table:
  column: entry:, maxVer: 10
  column: unused:, maxVer: 3




Fatal error:  Uncaught exception 'Exception' with message 'shouldn't get here!' in /opt/lampp/htdocs/phpHbase/DemoClient.php:161
Stack trace:
#0 {main}
  thrown in /opt/lampp/htdocs/phpHbase/DemoClient.php on line 161
-----------------------------------------------------------------------









原创粉丝点击