110 views

php经典开发系列教程之怎么样使用Hive Web进行查询

By | 2019年3月3日

我无事可做,用PHP编写一个Hive查询接口,并记录开发过程和遇到的问题。

一、php Hive API的问题
默认情况下,Hive自己的PHP API不是很好。一个是路径有问题,另一个是代码本身有问题。所以,使用节俭来重新生成Hive的PHP API。

查找所有节俭文件并将其复制到路径

#cd hive
#for i in `find ./ -name “*.thrift”`
>do
>cp ${i} /usr/local/www/hive/thrift
>done

然后找到FB303。节俭与复制。修改hive_metastore和hive_服务中include FB303的路径。然后使用Thrift-R–Gen PHP生成两个蜂箱的节俭。

然后复制节俭协议本身、传输文件夹和自动加载。PHP和节俭。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中的代码错误问题。通常,PHP是同步阻塞执行,而Hive的查询需要很长时间。在查询过程中,端口将不响应,因此Thrift将返回套接字超时错误。所以我们需要修改API中套接字缓冲区的处理。

编辑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’]) {

二、修改nginx和php的设置,为了保证hive正常使用,我用的php 5.3.8

nginx修改

http
{
keepalive_timeout 36000;
server {
location ~ \.php$
{
fastcgi_connect_timeout 36000;
fastcgi_send_timeout 36000;
fastcgi_read_timeout 36000;
}
}
}
#sbin/nginx -s reload

php修改

#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

因为配置单元查询比较慢,为了防止超时,我设置了10小时的超时,都是内网应用程序,没关系。

三、编写第一个php-hive程序

<?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]) {
echo $db_array[$i];
$i++;
}

$transport->close();
?>

php中有几种hive方法,列出来以便参考

execute($query) 执行查询
fetchOne() 返回一行结果
fetchN($numRows) 返回N行结果,给定行数
fetchAll() 返回全部结果集
getSchema() 获取Schema
getThriftSchema() 获取Thrift Server Schema
getClusterStatus() 获取集群状态,很贴心啊,还没试过
getQueryPlan() 获取QueryPlan

这些是最常见的。当然,没有像mysql_select_db这样的命令。您需要使用诸如use database to query之类的语句。然后执行它。

本文转载于:http://win-man.com
本文关键词:香港服务器 韩国服务器 台湾服务器 国内服务器
作者:云漫网络技术人员

发表评论

电子邮件地址不会被公开。 必填项已用*标注