自己闲的没事,用php写了一个hive的查询界面,顺便把开发过程和遇到的问题记录下来。
一、php Hive API的问题
默认情况下,Hive本身自带的php API是不太好使的。一个是路径有问题,一个是代码本身也有问题。所以,采用thrift重新自己生成hive的php api。
找到所有的thrift文件,并复制到某个路径下
#cd hive
#for i in `find ./ -name "*.thrift"`
>do
>cp ${i} /usr/local/www/hive/thrift
>done
然后找到thrift里面的fb303.thrift,复制到一起。修改hive_metastore和hive_service里面inlclude fb303的路径。然后用thrift -r --gen php 生成两个hive的thrift。
然后再复制thrift本身的protocol,transport文件夹和autoload.php和Thrift.php。
我把这些东西都放在libs文件夹下。最终目录结构和文件名如下:
./tree.sh libs | grep -v ".php"
|---transport
|---protocol
|---packages
||---fb303
||---hive_service
||---queryplan
||---hive_metastore
./tree.sh libs/
|---transport
||---TTransport.php
||---TNullTransport.php
||---TSocketPool.php
||---TMemoryBuffer.php
||---TFramedTransport.php
||---TBufferedTransport.php
||---THttpClient.php
||---TPhpStream.php
||---TSocket.php
|---autoload.php
|---Thrift.php
|---protocol
||---TProtocol.php
||---TBinaryProtocol.php
|---packages
||---fb303
|||---fb303_types.php
|||---FacebookService.php
||---hive_service
|||---hive_service_types.php
|||---ThriftHive.php
||---queryplan
|||---queryplan_types.php
||---hive_metastore
|||---ThriftHiveMetastore.php
|||---hive_metastore_types.php
|||---hive_metastore_constants.php
然后解决API中的代码bug问题,正常情况下,php是同步阻塞执行,而hive的查询时间比较长,在查询期间,端口会没有响应,所以thrift会返回socket timeout的错误。所以需要修改api中对socket buffer的处理。
编辑transport下TSocket.php红色修改前,绿色修改后,总共五个位置需要修改。
1.先找public function readAll($len)方法
在方法里
找到
if ($buf === FALSE || $buf === '') {
修改为
if($buf === FALSE) {
找到两处
if ($md['timed_out']) {
均改为
if (true === $md['timed_out'] && false === $md['blocked']) {
--------------------------------------------
2.找到public function read($len)方法
在方法里找到
if ($data === FALSE || $data === '') {
修改为
if ($data === FALSE) {
找到一处
if ($md['timed_out']) {
修改为
if (true === $md['timed_out'] && false === $md['blocked']) {