我在默认端口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驱动程序所在的同一数据库进行交互?!
答案 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