使用.net通過odbc訪問Hive

寫入數據到Hive表(命令行) 這篇文章中,我們通過命令行的方式和hive進行了交互。但在通常情況下,是通過編程的方式來操作Hive,Hive提供了JDBC和ODBC接口,因爲公司的數據處理程序是使用.net開發並運行在windows server上的,因此這篇文章將介紹如何通過ODBC來訪問Hive。

說明:ODBC:Open Database Connectivity,開放數據庫連接,是微軟開放服務結構(WOSA,Windows Open Services Architecture)中有關數據庫的一個組成部分,它建立了一組規範,並提供了一組對數據庫訪問的標準API(應用程序編程接口)。這些API利用SQL來完成其大部分任務。 JDBC:Java Database Connectivity,Java數據庫連接,是用於Java編程語言和數據庫之間的數據庫無關連接的標準Java API。

1. 配置hive-site.xml

hive-site.xml是Hive的配置文件,位於$HIVE_HOME/conf文件夾下,在其中添加如下配置:

<property> <name>hive.server2.authentication</name> <value>NONE</value> <description> Expects one of [nosasl, none, ldap, kerberos, pam, custom]. Client authentication types. NONE: no authentication check LDAP: LDAP/AD based authentication KERBEROS: Kerberos/GSSAPI authentication CUSTOM: Custom authentication provider (Use with property hive.server2.custom.authentication.class) PAM: Pluggable authentication module NOSASL: Raw transport </description> </property>

遠程訪問Hive,有好幾種身份驗證方式,因爲我們的Hive服務僅在局域網中訪問,簡單起見,可以配置爲NONE,也就是不進行身份驗證,NONE也是hive.server2.authentication的默認值。

2. 確認hiveserver2服務已經運行

hive需要先作爲服務運行起來,第三方應用纔可以進行連接,使用下面的命令啓動hive服務:

# hive --service hiveserver2 2018-07-25 11:40:51: Starting HiveServer2

這個服務的默認端口號是10000。同時,還提供了一個web UI,默認端口號是10002,可以通過瀏覽器直接訪問:

圖1. Hive Web UI

3. 下載、安裝和配置ODBC Connector

可以從這裏下載各個版本的HIVE ODBC:http://archive.mapr.com/tools/MapR-ODBC/MapR_Hive/

Windows上odbc安裝和配置說明:Install the Hive ODBC Connector on Windows

windows上的安裝很簡單,一路next,安裝完成後從“開始”菜單中找到:MapR Hive ODBC Connector 2.1 (64-bit),打開 64-bit ODBC Administrato,可以看到下面的界面:

圖2. 點擊“添加”

圖3. 選擇“MapR Hive ODBC Connector”

按照下圖這樣配置,注意修改Hosts爲運行Hive服務的主機IP:

圖4. 選擇“MapR Hive ODBC Connector”

點擊“Test”,你可能會遇到這樣一個錯誤:User: root is not allowed to impersonate root.

此時,可以修改$HADOOP_HOME/etc/hadoop下的core-site.xml文件,在最底部加入下面配置:

<property> <name>hadoop.proxyuser.root.hosts</name> <value>*</value> </property> <property> <name>hadoop.proxyuser.root.groups</name> <value>*</value> </property>

重啓hadoop服務後,再次執行點擊“Test”,成功後可以看到下面的界面:

提示:如何重啓Hadoop可以參看:linux上安裝和配置Hadoop(單節點)

圖5. 成功連接至hive

4. 編寫.Net Core控制檯程序訪問Hive

配置好了ODBC數據源之後,新建一個.Net Core項目,首先通過NuGet包管理器安裝 System.Data.Odbc。

圖6. 安裝System.Data.Odbc

接下來編寫代碼就很容易了,都是熟悉的味道,我就直接貼上來了:

using System;
using System.Data;
using System.Data.Odbc;

namespace HiveClient {
    class Program {
        static void Main(string[] args) {
            string dns = "DSN=dev56;UID=root;PWD=";

            using(HiveOdbcClient client = new HiveOdbcClient(dns)) {
                string sql = "Create TEMPORARY Table golds_log_tmp(user_id bigint, accounts string, change_type string, golds bigint, log_time int) ROW FORMAT DELIMITED  FIELDS TERMINATED BY '|'";

                client.Excute(sql);

                sql = @"Insert into table golds_log_tmp values
                    (3645787,'d159159(4172194)','遊戲比賽獎勵',1000,1526027152),
                    (3641649, 'ffddbbgg55(4167873)', '遊戲比賽獎勵', 100, 1526027152),
                    (684321, '763274471(850395)', '遊戲比賽獎勵', 100, 1526027152)";

                client.Excute(sql);

                sql = "select * from golds_log_tmp";
                var table = client.Query(sql);
                foreach(DataRow row in table.Rows) {
                    Console.WriteLine($"{ row[0] }, {row[1]}, { row[2] }, { row[3] }, { row[4] }");
                }
            }
            Console.ReadKey();
        }
    }

    public class HiveOdbcClient:IDisposable {
        OdbcConnection _conn;

        public HiveOdbcClient(string dns) {            
            _conn = new OdbcConnection(dns);
            _conn.Open();
        }

        public void Excute(string sql) {
            OdbcCommand cmd = new OdbcCommand(sql, _conn);
            cmd.ExecuteNonQuery();
        }

        public DataTable Query(string sql) {
            DataTable table = new DataTable();
            OdbcDataAdapter adapter = new OdbcDataAdapter(sql, _conn);
            adapter.Fill(table);
            return table;
        }

        public void Dispose() {
            if (_conn != null) {
                _conn.Dispose();
            }
        }
    }
        
}

需要注意的是:執行Insert語句的部分執行的會比較久,因爲通過Hive底層依然執行的是MapReduce,這是一個比較耗時的操作。如果此時查看linux的控制檯,可以看到Hive的log輸出:

Hadoop job information for Stage-1: number of mappers: 1; number of reducers:0
2018-07-25 17:59:40,983 Stage-1 map = 0%,  reduce = 0%
2018-07-25 17:59:47,238 Stage-1 map = 100%,  reduce = 0%, Cumulative CPU 2.02sec
MapReduce Total cumulative CPU time: 2 seconds 20 msec
Ended Job = job_1532510920759_0002
Stage-4 is selected by condition resolver.
Stage-3 is filtered out by condition resolver.
Stage-5 is filtered out by condition resolver.
Moving data to directory hdfs://localhost:9000/tmp/hive/root/41c5d246-48b8-47e-a321-3726bdbc3e22/_tmp_space.db/e1545b51-4bdc-4859-b6d6-ebc09acf4e66/.hive-taging_hive_2018-07-25_17-59-32_779_3671872308271402381-3/-ext-10000
Loading data to table default.golds_log_tmp
MapReduce Jobs Launched:
Stage-Stage-1: Map: 1   Cumulative CPU: 2.02 sec   HDFS Read: 5290 HDFS Write 259 SUCCESS
Total MapReduce CPU Time Spent: 2 seconds 20 msec

至此,我們已經成功通過.Net編程的方式訪問了Hive,創建了臨時表、插入數據、並讀取了數據。

感謝閱讀,希望這篇文章能給你帶來幫助!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章