我有一个在默认端口 10000 上运行的配置单元服务器,启动方式为:hive --service hiveserver
然后我有 java 程序(教程!)使用 Hive JDBC Client使用以下方式连接到它:
Connection con = DriverManager.getConnection("jdbc:hive://localhost:10000/default", "", "");
教程运行并在默认数据库上创建一个表 testhivedrivertable
并对其进行描述。这工作正常,我的 hive 服务记录了一堆东西。
然后我尝试通过 hive -p 10000
将 shell 调到同一个数据库,这让我得到了一个 shell 但是我看不到 java 程序创建的表(java 程序也看不到查看我在 shell 中时创建的表)。此外,当我在配置单元 shell 中运行命令时,控制台中没有任何显示,所以我很确定我正在与不同的配置单元实例对话。
我怎样才能让 hive shell 与 java JDBC 驱动程序所在的同一个数据库进行交互?!
最佳答案
您正在与同一个 Hive 实例对话;不幸的是,不是同一个 Metastore。
Hive metastore 是一个数据库,用于存储有关 Hive 表的元数据(例如,表名、列名和类型、表位置、正在使用的存储处理程序、表中的桶数、排序列(如果有)、分区列(如果有) , ETC。)。当你创建一个表时,这个元存储会更新与新表相关的信息,当你对该表发出查询时,这些信息会被查询。
但是,Hive 创始人的重要考虑之一是使其易于开箱即用。这促使他们决定默认使用嵌入式 Derby 数据库作为元存储。这不需要设置,但副作用是数据库的范围在单个 CLI 调用或单个 JDBC 客户端上下文中。因此,Hive 元数据不会跨客户端的多次调用或跨客户端持久化。这就是您所看到的。
您应该迁移到使用独立的 Metastore,它将跨多个 Hive 客户端保存数据。 MySQL 和 PostGres 是流行的选择。 Cloudera 有一篇关于配置 Hive 和 MySQL 以使用 MySQL 元存储的好文章。可用here .
关于java - 如何让 Hive JDBC 驱动程序和 Hive shell 与同一个数据库通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7693097/