自己闲的没事,用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']) {

二、修改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

因为hive查询比较慢,为了防止超时,我都设置成了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这样的语句去做查询。然后用execute方法执行一下。

转载于:https://blog.51cto.com/slaytanic/766230

php开发Hive Web查询相关推荐

  1. java web数据库查询_Java Web开发之信息查询方式总结

    本文实例讲述了Java Web开发之信息查询方式总结.分享给大家供大家参考.具体如下: 这里介绍的查询方式有: ① 根据某个特定的字段查询: ② 在多个字段中查询: ③ 根据任意字段查询: ④ 任意字 ...

  2. 十分钟上线-基于函数计算开发 Restful web api asp.net core web app

    前言 这篇文章适合所有的 C# 开发新手.老鸟以及想准备学习开发 C# 的程序猿..NET Core是一个开源通用的开发框架,支持跨平台, 阿里云函数计算推出了 dotnetcore2.1 runti ...

  3. 使用 dotnet core 和 Azure PaaS服务进行devOps开发(Web API 实例)

    引子 这一篇文章将用一个完整的实例,给大家介绍如何基于dotnet core(微软.NET的最新版本,支持跨平台,跨设备的应用开发,详情请参考 https://www.microsoft.com/ne ...

  4. php web访问数据库,百宝箱之介绍PHP Web查询数据库基本步骤

    PHP是开发WEB动态页面的***编程,最近看了一本书收获很多,现在和大家一起分享一下PHP Web查询数据库的知识,下面我们就一起来看看吧.从PHP Web查询数据库的基本步骤: 1. 检查并过滤来 ...

  5. 实战 Java 第8天:开发商品详情查询接口

    实战 Java 第8天:开发商品详情查询接口 前言 一.在 ProductService 类中添加接口 二.在 ProductMapper 类中添加接口 三.增加 sql 语句 四.在 Product ...

  6. 全栈开发和web开发_全栈开发人员:这是什么,以及如何成为一个完整的开发人员...

    全栈开发和web开发 一个全职的开发人员是各行各业的杰作,也是一个备受追捧的求职者. 标题暗示着知识的广度,这对于人手不足的初创公司和管理复杂应用程序的大公司而言都是无价的. 但是, 术语" ...

  7. Hive用户接口(一)—Hive Web接口HWI的操作及使用

    问题导读: 1.Hive提供了哪三种用户访问接口? 2.如何手动构建hive-hwi-*.war安装包? 3.hwi 服务启动命令是什么? 4.hwi启动之前需要将哪两个包拷贝到hive安装目录的li ...

  8. WebGIS开发和Web开发的区别

    很多对GIS开发有一定了解的朋友应该知道,WebGIS开发是GIS开发岗位招聘中需求最高的. 学习GIS开发,第一步都是先学习Web开发基础(HTML5/CSS/JS),那WebGIS开发和Web开发 ...

  9. Python开发自定义Web框架

    文章目录 开发自定义Web框架 1.开发Web服务器主体程序 2.开发Web框架主体程序 3.使用模板来展示响应内容 4.开发框架的路由列表功能 5.采用装饰器的方式添加路由 6.电影列表页面的开发案 ...

最新文章

  1. 公开课报名 | 详解CNN-pFSMN模型以及在语音识别中的应用
  2. Facebook:易于解释的神经元可能会阻碍深度神经网络的学习
  3. pyinstaller打包生成的exe文件(并设置运行时静默)
  4. 关于Jdk7与Jdk8对Collections进行分组的区别
  5. VisualNet在资源管理中的应用
  6. java weblogic反序列化_Weblogic JAVA反序列化漏洞攻防搭建(3)
  7. linux go语言环境配置文件,linux下安装配置go语言环境
  8. 设计模式心得:三——命令模式
  9. uci大学教育转计算机,UCI加州大学尔湾分校计算机科学硕士M.S. Computer Science
  10. 超详细前端开发案例:品优购商场项目(二)
  11. VMware ubuntu16安装
  12. gsm模块 java 录音_深入详解Android GSM驱动模块
  13. 软件发布!DOTA2统计学
  14. rapidxml往xml文件循环写入内容
  15. 百度大脑5.0实现史上最大升级,发布远场语音交互芯片“鸿鹄”
  16. 买房? 上区块链, 安排! 全国首张不动产区块链电子凭证诞生
  17. 瑞芯微RK3328芯片怎么样?RK3328处理器参数介绍
  18. 输入身份证号自动算出年龄,出生日期,性别
  19. Windows10共享CentOS文件系统(Samba的使用)
  20. YOLOV3--训练数据+视频检测

热门文章

  1. java的常用注解有哪些_spring系列笔记之常用注解
  2. 每日总结app_焊工日常工作的主要职责是什么?焊工证考试用什么APP复习?
  3. oracle中日期相减及显示几天几小时几分钟
  4. 批处理实现—循环Ping指定网段(检测网络时使用)
  5. ARM发布自动驾驶芯片架构,重新宣示车载系统市场的主权
  6. “每天AI资讯这么多!该看哪些?”推荐一份优质资料清单
  7. Pony.ai签约落户广州南沙,计划年底前推出无人车队
  8. Xamarin自定义布局系列——PivotPage(多页面切换控件)
  9. 大数据(3) - 高可用 HDFS HA
  10. 利用大数据构建智能交通