热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

通过JDBC连接hive

      hive是大数据技术簇中进行数据仓库应用的基础组件,是其它类似数据仓库应用的对比基准。基础的数据操作我们可以通过脚本方式以hi

       hive是大数据技术簇中进行数据仓库应用的基础组件,是其它类似数据仓库应用的对比基准。基础的数据操作我们可以通过脚本方式以hive-client进行处理。若需要开发应用程序,则需要使用hive的jdbc驱动进行连接。本文以hive wiki上示例为基础,详细讲解了如何使用jdbc连接hive数据库。hive wiki原文地址:

https://cwiki.apache.org/confluence/display/Hive/HiveClient

https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Clients#HiveServer2Clients-JDBC

      首先hive必须以服务方式启动,我们平台选用hdp平台,hdp2.2平台默认启动时hive server2 模式。hiveserver2是比hiveserver更高级的服务模式,提供了hiveserver不能提供的并发控制、安全机制等高级功能。服务器启动以不同模式启动,客户端代码的编码方式也略有不同,具体见代码。

     服务启动完成之后,在eclipse环境中编辑代码。代码如下:

import java.sql.SQLException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.DriverManager;

public class HiveJdbcClient {

/*hiverserver 版本使用此驱动*/
//private static String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver";
/*hiverserver2 版本使用此驱动*/
private static String driverName = "org.apache.hive.jdbc.HiveDriver";

public static void main(String[] args) throws SQLException {

try {
Class.forName(driverName);
}
catch (ClassNotFoundException e) {
e.printStackTrace();
System.exit(
1);
}

/*hiverserver 版本jdbc url格式*/
//Connection con = DriverManager.getConnection("jdbc:hive://hostip:10000/default", "", "");

/*hiverserver2 版本jdbc url格式*/
Connection con
= DriverManager.getConnection("jdbc:hive2://hostip:10000/default", "hive", "hive");
Statement stmt
= con.createStatement();
//参数设置测试
//boolean resHivePropertyTest = stmt
// .execute("SET tez.runtime.io.sort.mb = 128");

boolean resHivePropertyTest = stmt
.execute(
"set hive.execution.engine=tez");
System.out.println(resHivePropertyTest);

String tableName
= "testHiveDriverTable";
stmt.executeQuery(
"drop table " + tableName);
ResultSet res
= stmt.executeQuery("create table " + tableName + " (key int, value string)");

//show tables
String sql = "show tables '" + tableName + "'";
System.out.println(
"Running: " + sql);
res
= stmt.executeQuery(sql);
if (res.next()) {
System.out.println(res.getString(
1));
}

//describe table
sql = "describe " + tableName;
System.out.println(
"Running: " + sql);
res
= stmt.executeQuery(sql);
while (res.next()) {
System.out.println(res.getString(
1) + "\t" + res.getString(2));
}

// load data into table
// NOTE: filepath has to be local to the hive server
// NOTE: /tmp/a.txt is a ctrl-A separated file with two fields per line
String filepath = "/tmp/a.txt";
sql
= "load data local inpath '" + filepath + "' into table " + tableName;
System.out.println(
"Running: " + sql);
res
= stmt.executeQuery(sql);

// select * query
sql = "select * from " + tableName;
System.out.println(
"Running: " + sql);
res
= stmt.executeQuery(sql);
while (res.next()) {
System.out.println(String.valueOf(res.getInt(
1)) + "\t" + res.getString(2));
}

// regular hive query
sql = "select count(1) from " + tableName;
System.out.println(
"Running: " + sql);
res
= stmt.executeQuery(sql);
while (res.next()) {
System.out.println(res.getString(
1));
}

}

}

     可以将如下jar包放在eclipse buildpath,可以在启动时放在classpath路径。

    image

其中jdbcdriver可用hive-jdbc.jar,这样的话,其他的jar也必须包含,或者用jdbc-standalone jar包,用此jar包其他jar包就可以不用包含。其中hadoop-common包一定要包含。

     执行后等待结果正确运行。若出现异常,则根据提示进行解决。提示不明确的几个异常的解决方案如下:

1. 假如classpath或者buildpath中不包含hadoop-common-0.23.9.jar,出现如下错误

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/conf/Configuration
at org.apache.hive.jdbc.HiveConnection.createBinaryTransport(HiveConnection.java:
393)
at org.apache.hive.jdbc.HiveConnection.openTransport(HiveConnection.java:
187)
at org.apache.hive.jdbc.HiveConnection.
(HiveConnection.java:163)
at org.apache.hive.jdbc.HiveDriver.connect(HiveDriver.java:
105)
at java.sql.DriverManager.getConnection(DriverManager.java:
664)
at java.sql.DriverManager.getConnection(DriverManager.java:
247)
at HiveJdbcClient.main(HiveJdbcClient.java:
28)
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.conf.Configuration
at java.net.URLClassLoader.findClass(URLClassLoader.java:
381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:
424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:
331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:
357)
...
7 more

2. HIVE JDBC连接服务器卡死:

     假如使用hiveserver    版本JDBCdriver 连接hiverserver2,将可能出现此问题,具体在JDBCDriver连接上之后根据协议要求请求hiveserver2返回数据时,hiveserver2不返回任何数据,因此JDBC driver将卡死不返回。

3. TezTask出错,返回错误号1.

Exception in thread "main" java.sql.SQLException: Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.tez.TezTask
at org.apache.hive.jdbc.HiveStatement.execute(HiveStatement.java:
296)
at org.apache.hive.jdbc.HiveStatement.executeQuery(HiveStatement.java:
392)
at HiveJdbcClient.main(HiveJdbcClient.java:
40)

错误号1代表用户认证失败,在连接时必须指定用户名密码,有可能通过服务器设置可以不需要用户认证就可以执行,hdp默认安装配置用户名密码是hive,hive

3. TezTask出错,返回错误号2.

TaskAttempt 3 failed, info=[Error: Failure while running task:java.lang.IllegalArgumentException: tez.runtime.io.sort.mb 256 should be larger than 0 and should be less than the available task memory (MB):133
at com.google.common.base.Preconditions.checkArgument(Preconditions.java:
88)
at org.apache.tez.runtime.library.common.sort.impl.ExternalSorter.getInitialMemoryRequirement(ExternalSorter.java:
291)
at org.apache.tez.runtime.library.output.OrderedPartitionedKVOutput.initialize(OrderedPartitionedKVOutput.java:
95)
at org.apache.tez.runtime.LogicalIOProcessorRuntimeTask$InitializeOutputCallable.call(LogicalIOProcessorRuntimeTask.java:
430)
at org.apache.tez.runtime.LogicalIOProcessorRuntimeTask$InitializeOutputCallable.call(LogicalIOProcessorRuntimeTask.java:
409)
at java.util.concurrent.FutureTask.run(FutureTask.java:
266)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:
511)
at java.util.concurrent.FutureTask.run(FutureTask.java:
266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:
1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:
617)
at java.lang.Thread.run(Thread.java:
745)
]], Vertex failed as one or more tasks failed. failedTasks:
1, Vertex vertex_1441168955561_1508_2_00 [Map 1] killed/failed due to:null]
Vertex killed, vertexName
=Reducer 2, vertexId=vertex_1441168955561_1508_2_01, diagnostics=[Vertex received Kill while in RUNNING state., Vertex killed as other vertex failed. failedTasks:0, Vertex vertex_1441168955561_1508_2_01 [Reducer 2] killed/failed due to:null]
DAG failed due to vertex failure. failedVertices:
1 killedVertices:1
FAILED: Execution Error,
return code 2 from org.apache.hadoop.hive.ql.exec.tez.TezTask

 

code 2,代表错误是参数错误,一般是指对应的值不合适,以上堆栈指示tez.runtime.io.sort.mb参数256比可用内存大,因此修改配置文件或者执行查询之前先设置其大小即可。

通过以上设置以及参数修正之后,应用程序就能正确的使用jdbc连接hive数据库。

另可以用squirrel-sql GUI客户端管理hivedb,驱动设置方式与代码中对应jar包、驱动类、url等使用同样方式设置,测试成功建立好alias就可以开始连接hive,可以比较方便的管理和操作hive数据库。


推荐阅读
  • 用阿里云的免费 SSL 证书让网站从 HTTP 换成 HTTPS
    HTTP协议是不加密传输数据的,也就是用户跟你的网站之间传递数据有可能在途中被截获,破解传递的真实内容,所以使用不加密的HTTP的网站是不 ... [详细]
  • 如何在服务器上配置SSL证书
    SSL证书是用于验证互联网上身份的一种数字凭证,通过启用HTTPS协议,确保用户与服务器之间的通信安全。本文将详细介绍如何在API和服务器上配置SSL证书,以提升网站的安全性和可信度。 ... [详细]
  • 本文最初发表在Thorben Janssen的Java EE博客上,每周都会分享最新的Java新闻和动态。 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • 本文是Java并发编程系列的开篇之作,将详细解析Java 1.5及以上版本中提供的并发工具。文章假设读者已经具备同步和易失性关键字的基本知识,重点介绍信号量机制的内部工作原理及其在实际开发中的应用。 ... [详细]
  • 本文深入解析了通过JDBC实现ActiveMQ消息持久化的机制。JDBC能够将消息可靠地存储在多种关系型数据库中,如MySQL、SQL Server、Oracle和DB2等。采用JDBC持久化方式时,数据库会自动生成三个关键表:`activemq_msgs`、`activemq_lock`和`activemq_ACKS`,分别用于存储消息数据、锁定信息和确认状态。这种机制不仅提高了消息的可靠性,还增强了系统的可扩展性和容错能力。 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案
    深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • Java高并发与多线程(二):线程的实现方式详解
    本文将深入探讨Java中线程的三种主要实现方式,包括继承Thread类、实现Runnable接口和实现Callable接口,并分析它们之间的异同及其应用场景。 ... [详细]
  • 本文总结了一些开发中常见的问题及其解决方案,包括特性过滤器的使用、NuGet程序集版本冲突、线程存储、溢出检查、ThreadPool的最大线程数设置、Redis使用中的问题以及Task.Result和Task.GetAwaiter().GetResult()的区别。 ... [详细]
  • 【实例简介】本文详细介绍了如何在PHP中实现微信支付的退款功能,并提供了订单创建类的完整代码及调用示例。在配置过程中,需确保正确设置相关参数,特别是证书路径应根据项目实际情况进行调整。为了保证系统的安全性,存放证书的目录需要设置为可读权限。值得注意的是,普通支付操作无需证书,但在执行退款操作时必须提供证书。此外,本文还对常见的错误处理和调试技巧进行了说明,帮助开发者快速定位和解决问题。 ... [详细]
  • 如何在PHP中准确获取服务器IP地址?
    如何在PHP中准确获取服务器IP地址? ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • 深入探索HTTP协议的学习与实践
    在初次访问某个网站时,由于本地没有缓存,服务器会返回一个200状态码的响应,并在响应头中设置Etag和Last-Modified等缓存控制字段。这些字段用于后续请求时验证资源是否已更新,从而提高页面加载速度和减少带宽消耗。本文将深入探讨HTTP缓存机制及其在实际应用中的优化策略,帮助读者更好地理解和运用HTTP协议。 ... [详细]
author-avatar
手机用户2502855477
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有