java - 如何让 Hive JDBC 驱动程序和 Hive shell 与同一个数据库通信?

标签 java jdbc hadoop hive

我有一个在默认端口 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/

相关文章:

hadoop - 泰兹。慢 reducer

hadoop - Oozie:传播配置不起作用

hadoop - 当文件不在目录中时将文件从 HDFS 加载到配置单元的替代方法

java - 机器人:无法解析符号 'ObjectSerializer'

java - Hadoop MapReduce程序连接到数据库

java - 我如何检查证书 A 是否获得证书 B 作为 Java 的颁发者? --> X509Certificates

java - 如何将数据库中的所有数据显示到jtable中?

java - 在 Android Studio 的 EditText 中添加逗号作为数字的千位分隔符?

java - SQL 错误或丢失数据库( “?” : syntax error) 附近

java - 如何从给定id的自动数据库检索数据?