1、Java通過JDBC操作Hive

來源:互聯網
上載者:User

標籤:ogg   使用者名稱   hiveql   類別關係   檔案中   dir   rman   oid   基於   

0、概述

使用的都是CLI或者hive –e的方式僅允許使用HiveQL執行查詢、更新等操作。然而Hive也提供用戶端的實現,通過HiveServer或者HiveServer2,用戶端可以在不啟動CLI的情況下對Hive中的資料進行操作,兩者都允許遠程用戶端使用多種程式設計語言如Java、Python向Hive提交請求,取回結果。

HiveServer與HiveServer2的異同?

HiveServer和HiveServer2都是基於Thrift。既然已經存在HiveServer為什麼還需要HiveServer2呢?因為HiveServer不能處理多於一個用戶端的並發請求,這是由於HiveServer使用的Thrift介面所導致的限制,不能通過修改HiveServer的代碼修正。因此在Hive-0.11.0版本中重寫了HiveServer代碼得到了HiveServer2,進而解決了該問題。HiveServer2支援多用戶端的並發和認證,為開放API用戶端如JDBC、ODBC提供了更好的支援。

1、啟動服務

1)、hive-site.xml的關鍵配置

<property>

  <name>hive.metastore.warehouse.dir</name>

  <value>/usr/hive/warehouse</value>               //(hive中的資料庫和表在HDFS中存放的檔案夾的位置)

  <description>location of default database for the warehouse</description>

</property>

<property>

  <name>hive.server2.thrift.port</name>

  <value>10000</value>                               //(HiveServer2遠端連線的連接埠,預設為10000)

  <description>Port number of HiveServer2 Thrift interface.

  Can be overridden by setting $HIVE_SERVER2_THRIFT_PORT</description>

</property>

<property>

  <name>hive.server2.thrift.bind.host</name>

  <value>**.**.**.**</value>                          //(hive所在叢集的IP地址)

  <description>Bind host on which to run the HiveServer2 Thrift interface.  Can be overridden by setting $HIVE_SERVER2_THRIFT_BIND_HOST</description>

</property>

<property>

  <name>hive.server2.long.polling.timeout</name>

  <value>5000</value>                                // (預設為5000L,此處修改為5000,不然程式會報錯)

  <description>Time in milliseconds that HiveServer2 will wait, before responding to asynchronous calls that use long polling</description>

</property>

<property>

  <name>javax.jdo.option.ConnectionURL</name>

  <value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true</value>  //(Hive的中繼資料庫,我採用的是本地Mysql作為中繼資料庫)

  <description>JDBC connect string for a JDBC metastore</description>

</property>

<property>                        

  <name>javax.jdo.option.ConnectionDriverName</name>          //(串連中繼資料的驅動名)

  <value>com.mysql.jdbc.Driver</value>

  <description>Driver class name for a JDBC metastore</description>

</property>

<property>

  <name>javax.jdo.option.ConnectionUserName</name>             //(串連中繼資料庫使用者名稱)

  <value>hive</value>

  <description>username to use against metastore database</description>

</property>

<property>

  <name>javax.jdo.option.ConnectionPassword</name>             // (串連中繼資料庫密碼)

  <value>hive</value>

  <description>password to use against metastore database</description>

</property>

2)、啟動中繼資料庫

先啟動中繼資料庫,在命令列中鍵入:hive --service metastore & 

3)、啟動服務

#hive --service hiveserver2 >/dev/null & 

以上命令啟動hiveserver2服務。

Hive提供了jdbc驅動,使得我們可以用java代碼來串連Hive並進行一些類別關係型資料庫的sql語句查詢等操作。首先,我們必須將Hive的服務,也就是HiveServe開啟。如果啟動hiveserver就把上面命令改為

#hive --service hiveserver >/dev/null &  

2、將所需Jar包放到

$HADOOP_HOME/share/hadoop/common/hadoop-common-2.8.0.jar

$HIVE_HOME/lib/hive-exec-2.1.1.jar

$HIVE_HOME/lib/hive-jdbc-2.1.1.jar

$HIVE_HOME/lib/hive-metastore-2.1.1.jar

$HIVE_HOME/lib/hive-service-2.1.1.jar

$HIVE_HOME/lib/libfb303-0.9.3.jar

$HIVE_HOME/lib/commons-logging-1.2.jar

$HIVE_HOME/lib/slf4j-api-1.6.1.jar

3、java串連程式

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.Statement;

public class HiveClientUtils {

    private static String driverName ="org.apache.hive.jdbc.HiveDriver";

    //填寫hive的IP,之前在設定檔中配置的IP

    private static String Url="jdbc:hive2://localhos:10000/default";   

    private static Connection conn;

    private static PreparedStatement ps;

    private static ResultSet rs; 

    //建立串連

    public static Connection getConnnection(){

        try {

            Class.forName(driverName);

            //此處的使用者名稱一定是有許可權操作HDFS的使用者,否則程式會提示"permission deny"異常

            conn = DriverManager.getConnection(Url,"vagrant","vagrant");

        } catch(ClassNotFoundException e)  {

           e.printStackTrace();

           System.exit(1);

        } catch (SQLException e) {

            e.printStackTrace();

        }

        return conn;

    }

    public static PreparedStatement prepare(Connection conn, String sql) {

        PreparedStatement ps = null;

        try {

            ps = conn.prepareStatement(sql);

        } catch (SQLException e) {

            e.printStackTrace();

        }

        return ps;

    }

    public static void getAll(String tablename) {

          conn=getConnnection();

        String sql="select * from "+tablename;

        System.out.println(sql);

        try {

            ps=prepare(conn, sql);

            rs=ps.executeQuery();

            int columns=rs.getMetaData().getColumnCount();

            while(rs.next()) {

                for(int i=1;i<=columns;i++) {

                    System.out.print(rs.getString(i));

                    System.out.print("\t\t");

                }

                System.out.println();

            }

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }

    public static void main(String[] args) {

        String tablename="test1";

        getAll(tablename);

    }

}

上面代碼是針對hiveserver2的。如果是hiveserver。那有兩處需要修改,具體修改如下:

org.apache.Hive.jdbc.HiveDriver  改為:org.apache.Hadoop.hive.jdbc.HiveDriver

jdbc:hive2://localhost:10000/default  改為:jdbc:hive://localhost:10000/default

其中‘localhost‘是主機地址,10000是連接埠後,default是預設的db。

1、Java通過JDBC操作Hive

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.