返回

Hive 3.1.3 连接多个 MySQL 数据源时遇到的连接问题及其解决方案

mysql

如何解决 Hive 3.1.3 中使用 JDBC 存储处理程序映射多个 MySQL 数据源时的连接问题

引言

在使用 Hive 3.1.3 管理多个 MySQL 数据源时,可能会遇到连接问题。本文将探讨导致此问题的常见原因,并提供解决方案。

问题概述

使用 JDBC 存储处理程序将多个 MySQL 数据源映射到 Hive 3.1.3 时,在连接条件中选择不同数据源时,可能会遇到以下错误:

  • Table not found in dpyy_ucs.order_info
  • Table not found in dpyy_vas.account_info

原因分析

Hive 3.1.3 中的一个已知问题导致此连接问题。该问题阻止在连接条件中选择不同的 MySQL 数据源。

解决方案

目前,解决此问题的唯一方法是将 Hive 3.1.3 降级到 Hive 3.1.0。

详细步骤

  1. 停止 Hive 3.1.3 服务。
  2. 下载 Hive 3.1.0 版本。
  3. 解压缩 Hive 3.1.0 文件并将其复制到 Hive 安装目录。
  4. 重新启动 Hive 服务。

其他注意事项

  • 确保 Hive 配置文件中的 hive.metastore.uris 属性指向正确的元存储 URI。
  • 确保已将 JDBC 驱动程序添加到 Hive 的类路径中。
  • 如果问题仍然存在,请检查 Hive 日志以获取更多详细信息。

示例代码

以下是使用 Hive 3.1.0 映射多个 MySQL 数据源并进行连接的示例代码:

-- 映射第一个 MySQL 数据源
CREATE EXTERNAL TABLE IF NOT EXISTS dim_order_right_detail(
  id bigint,
  right_detail_id string,
  open_id string,
  order_id string
) STORED BY 'org.apache.hive.storage.jdbc.JdbcStorageHandler' 
LOCATION 'hdfs://hdp5/dpyy/prod/hive/dpyy_prod.db/dim_order_right_detail' 
TBLPROPERTIES (
  'hive.sql.database.type' = 'MYSQL',
  'hive.sql.jdbc.driver' = 'com.mysql.cj.jdbc.Driver',
  'hive.sql.jdbc.url' = 'jdbc:mysql://XXX.XX.XXX.XXX:3306/dpyy_vas?&allowPublicKeyRetrieval=true&useSSL=false',
  'hive.sql.dbcp.username' = 'XXXXX',
  'hive.sql.dbcp.password' = 'XXXXX',
  'hive.sql.query' = 'SELECT id,right_detail_id,open_id,order_id FROM order_right_detail',
  'hive.sql.dbcp.maxActive' = '1'
);

-- 映射第二个 MySQL 数据源
CREATE EXTERNAL TABLE IF NOT EXISTS dim_account_info(
     id bigint,
     open_id string,
     user_id string
) STORED BY 'org.apache.hive.storage.jdbc.JdbcStorageHandler' 
LOCATION 'hdfs://hdp5/dpyy/prod/hive/plat_prod.db/dim_account_info' 
TBLPROPERTIES (
  'hive.sql.database.type' = 'MYSQL',
  'hive.sql.jdbc.driver' = 'com.mysql.cj.jdbc.Driver',
  'hive.sql.jdbc.url' = 'jdbc:mysql://XXX.XXX.XXX.XXX:3306/dpyy_ucs?&allowPublicKeyRetrieval=true&useSSL=false',
  'hive.sql.dbcp.username' = 'dpyy_bigdata',
  'hive.sql.dbcp.password' = 'XXXXXXX',
  'hive.sql.query' = 'SELECT id,open_id,user_id FROM account_info',
  'hive.sql.dbcp.maxActive' = '1'
);

-- 使用连接条件连接两个数据源
SELECT *
FROM dim_order_right_detail t1
JOIN dim_account_info t2
ON t1.open_id = t2.open_id;

常见问题解答

  1. 为什么会遇到此连接问题?
    这是 Hive 3.1.3 中的一个已知问题,导致无法在连接条件中选择不同的 MySQL 数据源。

  2. 除了降级到 Hive 3.1.0 之外,还有其他解决方法吗?
    目前没有其他已知的解决方法。

  3. 如何检查 Hive 日志以获取更多详细信息?
    Hive 日志通常位于 HIVE_LOG_DIR 中,可以通过以下命令访问:cat $HIVE_LOG_DIR/hive.log

  4. 如何将 JDBC 驱动程序添加到 Hive 的类路径中?
    将 JDBC 驱动程序添加到 hive-site.xml 配置文件中,并在 hive.aux.jars.path 属性中指定其位置。

  5. 如何映射多个 MySQL 数据源?
    使用 CREATE EXTERNAL TABLE 语句,如本文中的示例代码所示,为每个数据源创建外部表。