使用.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,创建了临时表、插入数据、并读取了数据。

感谢阅读,希望这篇文章能给你带来帮助!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Hadoop实操

如何使用HAProxy实现Kerberos环境下的Impala负载均衡

前面Fayson介绍过《如何使用HAProxy实现Impala的负载均衡》,在Kerberos环境HAProxy的配置与非Kerberos环境下是一样的,只是在...

57950
来自专栏个人分享

SparkSQL项目中的应用

Spark是一个通用的大规模数据快速处理引擎。可以简单理解为Spark就是一个大数据分布式处理框架。基于内存计算的Spark的计算速度要比Hadoop的MapR...

15330
来自专栏Hadoop实操

如何使用Hue上创建一个完整Oozie工作流

在使用CDH集群中经常会有一些特定顺序的作业需要在集群中运行,对于需要多个作业顺序执行的情况下,如何能够方便的构建一个完整的工作流在CDH集群中执行,前面Fay...

1.5K60
来自专栏Spark学习技巧

Spark2.4.0屏障调度器

其中,就有一项说到Spark 为了支持深度学习而引入的屏障调度器。本文就详细讲讲。

17530
来自专栏Hadoop实操

如何使用Spark Streaming读取HBase的数据并写入到HDFS

Spark Streaming是在2013年被添加到Apache Spark中的,作为核心Spark API的扩展它允许用户实时地处理来自于Kafka、Flum...

1.2K40
来自专栏PPV课数据科学社区

盘点Hadoop让人讨厌的12件事

? 1. Pig vs. Hive 你在 Pig 里用不了 Hive UDFS。在 Pig 中你必须用 HCatalog 来访问 Hive 表。你在 Hive...

33280
来自专栏Hadoop实操

如何在Kerberos的Linux上安装及配置Impala的ODBC驱动

Impala提供了多种访问方式如impala-shell、beeline、JDBC以及ODBC等方式,关于beeline、JDBC的连接方式可以参考Fayson...

51350
来自专栏数据之美

windows 安装 spark 及 pycharm 调试 TopN 实例

首先声明本文搭建的环境为:windows8.1 + spark1.6.0 + python2.7 + jdk8,spark on windows 对 windo...

55860
来自专栏Hadoop实操

如何使用Oozie API接口向Kerberos环境的CDH集群提交Spark2作业

前面Fayson介绍了多种方式在CDH集群外的节点向集群提交Spark作业,文章中均采用Spark1来做为示例,本篇文章主要介绍如何是用Oozie API向Ke...

1.4K40
来自专栏Hadoop实操

如何给Hadoop集群划分角色

Fayson在之前的文章中介绍过《CDH网络要求(Lenovo参考架构)》,《如何为Hadoop集群选择正确的硬件》和《CDH安装前置准备》,而我们在搭建Had...

57470

扫码关注云+社区

领取腾讯云代金券