通过hiveserver远程服务构建hive web查询分析工具

(1)hive 三种启动方式及用途,本文主要关注通过hiveserver(可jdbc连接)的方式启动

 1, hive  命令行模式,直接输入/hive/bin/hive的执行程序,或者输入 hive --service cli

       用于linux平台命令行查询,查询语句基本跟mysql查询语句类似

 2, hive  web界面的启动方式,hive --service hwi  

      用于通过浏览器来访问hive,提供基本的基于web的hive查询服务,可以看作是hive数据平台的demo,

具体用法可见:http://www.cnblogs.com/gpcuster/archive/2010/02/25/1673480.html   使用HIVE的WEB界面:HWI

3, hive  远程服务 (端口号10000) 启动方式,nohup ./hive --service hiveserver >/dev/null 2>/dev/null &

      用java等程序实现通过jdbc等驱动的方式访问hive就用这种起动方式了,这个是程序员最需要的方式了。

开源工具phphiveadmin就采用的这种方式,这种方式其实启动了一个 Hive Thrift Server ,允许你使用任意语言

与hive server通信,所以如果你不会java,语言将不会成为问题。

(2)给出一个基于hiveserver的demo,这个demo可以扩展成一个基于web操作hive的离线分析工具,类似phphiveadmin。

1、demo部署路径如下:

注:开发环境:myeclipse 8.5, tomcat 6.0

技术分享

2、code:


2.1 HiveTestCase.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
importjava.sql.Connection;
importjava.sql.DriverManager;
importjava.sql.ResultSet;
importjava.sql.SQLException;
importjava.sql.Statement;
 
publicclassHiveTestCase {
    publicstaticvoidmain(String[] args)throwsException {
        String querySQL ="SELECT a.name, a.id, a.sex FROM com58 a where a.id > 100 and a.id < 110 and sex=‘male‘";
        hive2Txt(querySQL);
    }
 
    privatestaticvoidhive2Txt(String querySQL)
            throwsClassNotFoundException, SQLException {
        Class.forName("org.apache.hadoop.hive.jdbc.HiveDriver");
 
        // String dropSQL = "drop table com58";
        // 1 male 29 3d649ecc [email protected] 20110304 20110402
        // 1.id 2.sex 3.age 4.name 5.mail 6.sDate 7.eDate
        // String createSQL =
        // "create table com58 (id int, sex string, age int, name string, mail string, sDate bigint, eDate bigint) row format delimited fields terminated by ‘ ‘";
        // hive插入数据支持两种方式一种:load文件,令一种是 CTAS(create table as select...
        // 从另一个表中查询进行插入)
        // hive是不支持insert into...values(....)这种操作的
        // String insterSQL =
        // "LOAD DATA LOCAL INPATH ‘/home/june/hadoop/hadoop-0.20.203.0/tmp/1.txt‘ OVERWRITE INTO TABLE com58";
 
        Connection con = DriverManager.getConnection(
                "jdbc:hive://localhost:10000/default","","");
        Statement stmt = con.createStatement();
        // stmt.executeQuery(dropSQL); // 执行删除语句
        // stmt.executeQuery(createSQL); // 执行建表语句
        // stmt.executeQuery(insterSQL); // 执行插入语句
        ResultSet res = stmt.executeQuery(querySQL);// 执行查询语句
 
        while(res.next()) {
            System.out.println("name:\t"+ res.getString(1) +"\tid:\t"
                    + res.getString(2) +"\tsex:\t"+ res.getString(3));
        }
    }
}


2.2 hiveSelect.jsp

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<%@ page language="java"contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
<%@pageimport="java.util.*"%>
<% @page
    import="java.io.File,
    java.io.FileWriter,
    java.io.IOException,
    java.sql.Connection,
    java.sql.DriverManager,
    java.sql.ResultSet,
    java.sql.SQLException,
    java.sql.Statement"%>
 
 
<%
    Class.forName("org.apache.hadoop.hive.jdbc.HiveDriver");
    String table = request.getParameter("table");
    String querySQL ="select * from "+ table +" limit 10";
    Connection con = DriverManager.getConnection(
            "jdbc:hive://localhost:10000/default","","");
    Statement stmt = con.createStatement();
    //      stmt.executeQuery(dropSQL); // 执行删除语句
    //      stmt.executeQuery(createSQL); // 执行建表语句
    //      stmt.executeQuery(insterSQL); // 执行插入语句
    ResultSet res = stmt.executeQuery(querySQL);// 执行查询语句
 
    FileWriter fw =newFileWriter("/home/june/a.txt");
    while(res.next()) {
        System.out.println("name:\t"+ res.getString(1) +"\tid:\t"
                + res.getString(2) +"\tsex:\t"+ res.getString(3));
        fw.write("name:\t"+ res.getString(1) +"\tid:\t"
                + res.getString(2) +"\tsex:\t"+ res.getString(3)
                +"\n");
    }
    fw.flush();
    fw.close();
%>
 
<html>
    <head>
        <meta http-equiv="Content-Type"content="text/html; charset=UTF-8">
        <title>Insert title here</title>
    </head>
    <body>
 
    </body>
</html>
2.3 select.html
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<!DOCTYPEhtml PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <metahttp-equiv="Content-Type"content="text/html; charset=UTF-8">
        <title>Insert title here</title>
    </head>
    <html>
        <head>
            <title>Hive Web Interface-Create a Hive Session</title>
        </head>
        <body>
            <table>
                <tr>
 
                    <tdvalign="top">
                        <h2>
                            select hive table to file.
                        </h2>
                        <formaction="hiveSelect.jsp">
                            <tableborder="1">
                                <tr>
                                    <td>
                                        Session Name
                                    </td>
                                    <td>
                                        <inputtype="text"name="table"value="table">
                                    </td>
                                </tr>
                                <tr>
                                    <tdcolSpan="2">
                                        <inputtype="submit">
                                    </td>
                                </tr>
                            </table>
                        </form>
                    </td>
                </tr>
            </table>
        </body>
    </html>
 
</html>
2.4 最后的结果是在相应的路径下创建一个文件输出,后续你可以用javaMail做一个邮件提醒+下载链接的功能,这样一个简易的基于hive的web分析工具就完工了。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。