如何让Hive JDBC驱动程序和Hive shell与同一个DB通信?

时间:2011-10-07 21:37:26

标签: java jdbc hadoop hive

我在默认端口10000上运行的hive服务器通过以下方式运行:hive --service hiveserver 然后我使用Hive JDBC Client连接到它的java程序(教程!):

Connection con = DriverManager.getConnection("jdbc:hive://localhost:10000/default", "", "");

教程运行并在默认数据库上创建表testhivedrivertable并对其进行描述。这很好用,我的hive服务记录了很多东西。

然后我尝试通过hive -p 10000将shell发送到同一个数据库,这会让我获得一个shell但是我看不到java程序创建的表(并且java程序也看不到我创建的表)在壳中)。此外,当我在hive shell中运行命令时,控制台中没有显示任何内容,所以我很确定我正在与另一个hive实例进行通信。

如何让hive shell与java JDBC驱动程序所在的同一数据库进行交互?!

2 个答案:

答案 0 :(得分:8)

您正在与同一个Hive实例交谈;不幸的是,不一样的Metastore。

Hive Metastore是一个存储有关您的Hive表的元数据的数据库(例如,表名,列名和类型,表位置,正在使用的存储处​​理程序,表中的桶数,如果有的话则排序列,如果有的话则分区列)等)。创建表时,将使用与在新表上发布查询时查询的新表相关的信息更新此Metastore。

然而,Hive创始人的一个重要考虑因素是让它易于开箱即用。这促使他们默认使用嵌入式Derby数据库作为Metastore。这不需要设置,但副作用是数据库的范围在单个CLI调用或单个JDBC客户端上下文中。因此,Hive元数据不会在客户端的多个调用或客户端的多个调用中持久存在。这就是你所见证的。

您应该迁移到使用独立的Metastore,它将在多个Hive客户端之间保留数据。 MySQL和PostGres是很受欢迎的选择。 Cloudera有一篇关于配置Hive和MySQL以使用MySQL Metastore的文章。它可用here

答案 1 :(得分:0)

Google将我发送到此处,因此我认为我会将其调查结果分享给其他google:

如果您使用的是hive2,则可以使用新的直线客户端。它似乎使用jdbc连接到服务器,因此共享相同的Metastore。

例如:beeline -u jdbc:hive2:// localhost:10000 / default