自己閒的沒事,用php寫了乙個hive的查詢介面,順便把開發過程和遇到的問題記錄下來。
一、php hive api的問題
預設情況下,hive本身自帶的php api是不太好使的。乙個是路徑有問題,乙個是**本身也有問題。所以,採用thrift重新自己生成hive的php api。
找到所有的thrift檔案,並複製到某個路徑下
#cd hive
#for i in `find ./ -name "*.thrift"`
>do
>cp $ /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資料夾下。最終目錄結構和檔名如下:
然後解決api中的**bug問題,正常情況下,php是同步阻塞執行,而hive的查詢時間比較長,在查詢期間,埠會沒有響應,所以thrift會返回socket timeout的錯誤。所以需要修改api中對socket buffer的處理。
編輯transport下
1.先找public function readall($len)方法
在方法裡
找到
if ($buf === false || $buf === '')
}
} #sbin/nginx -s reload
#cd etc
#vi php-fpm.conf
process_control_timeout = 36000s
request_terminate_timeout = 36000s
#cd lib
#vi php.ini
max_input_time = 36000
default_socket_timeout = 36000
#killall php-fpm
#sbin/php-fpm -c lib/php.ini
<?php
$globals['thrift_root'] = './libs/';
// load the required files for connecting to hive
require_once $globals['thrift_root'] . 'packages/hive_service/thrifthive.php';
require_once $globals['thrift_root'] . 'transport/tsocket.php';
require_once $globals['thrift_root'] . 'protocol/tbinaryprotocol.php';
// set up the transport/protocol/client
define('host','192.168.1.49');
define('port','10000');
$transport = new tsocket(host, port);
$protocol = new tbinaryprotocol($transport);
$client = new thrifthiveclient($protocol);
//create thrifthive object
$transport->open();
$client->execute('add jar /opt/modules/hive/hive-0.7.1/lib/hive-contrib-0.7.1.jar');
$client->execute('show databases');
$db_array = $client->fetchall();
$i = 0;
while('' != @$db_array[$i])
$transport->close();
?>
execute($query) 執行查詢
fetchone() 返回一行結果
fetchn($numrows) 返回n行結果,給定行數
fetchall() 返回全部結果集
getschema() 獲取schema
getthriftschema() 獲取thrift server schema
getclusterstatus() 獲取集群狀態,很貼心啊,還沒試過
getqueryplan() 獲取queryplan
php開發Hive Web查詢
一 php hive api的問題 預設情況下,hive本身自帶的php api是不太好使的。乙個是路徑有問題,乙個是 本身也有問題。所以,採用thrift重新自己生成hive的php api。找到所有的thrift檔案,並複製到某個路徑下 cd hive for i in find name th...
PHP開發實現快遞查詢功能詳解
背景 不久前,設計實現了京東api的功能,發現如果換了其它快遞再重新設計,豈不是會浪費太多的時間,所以選個第三方提供的快遞api是最為合理的,下面給出快遞鳥和快遞100的設計實現。1.首先要有乙個快遞鳥賬號,根據對方的要求,完善使用者申請。2.根據自己的需求,開通服務 3.進入 我的api介面 根據...
php 支付寶訂單查詢 微信支付開發訂單查詢例項
因為某一方技術的原因,可能導致商戶在預期時間內都收不到最終支付通知,此時商戶可以通過該api來查詢訂單的詳細支付狀態。訂單查詢api的url為 package out trade no 11122 partner 1900090055 sign 4e8d0df3da0c3d0df38f timest...