歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> php開發Hive Web查詢

php開發Hive Web查詢

日期:2017/3/1 10:35:20   编辑:Linux編程
自己閒的沒事,用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']) {
Copyright © Linux教程網 All Rights Reserved