您的位置:首页 > 编程语言 > PHP开发

通过thrift使用PHP访问Hbase

2012-01-10 17:11 483 查看
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

-----------------------------------------------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: