在 写入数据到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。
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的默认值。
hive需要先作为服务运行起来,第三方应用才可以进行连接,使用下面的命令启动hive服务:
这个服务的默认端口号是10000。同时,还提供了一个web UI,默认端口号是10002,可以通过浏览器直接访问:
图1. Hive Web UI
可以从这里下载各个版本的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
配置好了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,创建了临时表、插入数据、并读取了数据。
感谢阅读,希望这篇文章能给你带来帮助!
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有