RainbowUni 2025-04-24 16:25 采纳率: 50%
浏览 6

Flink SQL建表出现jdk报错

Flink 1.19.2 Hive3.1.3 通过Flink SQL建表出现java包报错

通过linux不同用户环境变量配置,Flink为jdk11,hive jdk8 Hive可以正常建库建表,
但是在Flink SQL客户端内执行语句报如下错误

could not execute sql statement. reason: java.lang.classcastexception: class jdk.internal.loader.classloaders$appclassloader cannot be cast to class java.net.urlclassloader (jdk.internal.loader.classloaders$appclassloader and java.net.urlclassloader are in module java.base of loader 'bootstrap')

img

已经成功配置了hive catalog并且在Flink SQL内切换到注册库了,执行语句前切换到了hive方言,如下为建表语句

CREATE TABLE IF NOT EXISTS ods_mission_stream (
missionId BIGINT,
missionName STRING,
startTime TIMESTAMP,
endTime TIMESTAMP,
manager STRING,
state STRING
) STORED AS PARQUET;
  • 写回答

4条回答 默认 最新

  • 阿里嘎多学长 2025-04-24 16:25
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    Flink SQL建表出现jdk报错

    你遇到的问题是,使用 Flink 1.19.2 和 Hive 3.1.3 通过 Flink SQL 建表时出现了 JDK 报错,且报错与 JDK 版本相关。

    问题的原因可能是 Flink 和 Hive 使用的 JDK 版本不同,Flink 使用的是 JDK 11,而 Hive 使用的是 JDK 8。这种情况下,Flink SQL 建表时可能会出现兼容性问题。

    解决方案:

    1. 使用同一个 JDK 版本:可以尝试使用同一个 JDK 版本来运行 Flink 和 Hive,例如使用 JDK 8。
    2. 配置 Flink 的 JDK 版本:可以在 Flink 的配置文件中指定 JDK 版本,例如在 flink-conf.yaml 文件中添加以下配置:
    java: "1.8"
    
    1. 使用 Hive 的 JDK 版本:可以在 Hive 的配置文件中指定 JDK 版本,例如在 hive-site.xml 文件中添加以下配置:
    <property name="hive.java.version" value="1.8"/>
    
    1. 重新编译 Flink 和 Hive:如果上述解决方案不起作用,可以尝试重新编译 Flink 和 Hive,以确保它们使用同一个 JDK 版本。

    希望这些解决方案能够帮助你解决问题。如果你需要更多帮助,请提供更多的错误信息和配置信息。

    评论
  • 紫雾凌寒 人工智能领域新星创作者 2025-04-24 16:25
    关注

    让 “紫雾凌寒” 来帮你回答,本回答结合 DeepSeek

    如果还有问题,请评论或点击头像私信,如果有帮助到您, 请关注、采纳、点赞

    1. 关键点分析:
      - 问题核心在于在特定的Flink 1.19.2和Hive 3.1.3版本组合下,通过Flink SQL建表时出现了Java包报错,虽然在不同用户环境变量配置下Flink使用JDK11,Hive使用JDK8时Hive能正常建库建表,但Flink SQL建表仍有问题。
    2. 解决方案:
      - 首先,检查Flink SQL建表语句中涉及的Java类引用是否正确。例如,如果建表语句中有类似CREATE TABLE ... WITH ('connector' = 'jdbc', 'driver' = 'com.mysql.cj.jdbc.Driver', ...)这样的配置,确保com.mysql.cj.jdbc.Driver这个类在Flink运行环境(JDK11)下是可访问的。
      - 可能是Flink与Hive集成时,由于JDK版本差异导致某些类加载出现问题。可以尝试在Flink作业提交时添加一些特定的类路径配置。假设你的Flink作业是通过命令行提交的,例如:
      sh flink run -c your.main.Class -p 1 -d \ --classpath /path/to/your/dependencies.jar \ your_job.jar
      这里的--classpath参数可以用来指定额外的类路径,确保所有依赖的Java类都能被正确加载。
      - 另外,检查Flink和Hive的版本兼容性文档,看是否存在已知的JDK版本相关的兼容性问题。虽然你提到Hive在JDK8下能正常建库建表,但与Flink SQL建表的交互可能存在特殊情况。
    3. 不同方案优缺点:
      - 检查类引用
      • 优点:简单直接,如果是类引用错误,很容易定位和修正。
      • 缺点:如果不是类引用问题,可能无法解决根本原因。
      • 添加类路径配置
      • 优点:可以解决类加载路径的问题,确保所有依赖类能被找到。
      • 缺点:如果依赖管理复杂,添加类路径可能会变得繁琐,且可能引入新的路径冲突问题。
    4. 总结:
      - 出现这种JDK版本相关的报错,首先要仔细检查建表语句中的类引用,确保其在Flink的JDK11环境下正确。然后可以尝试通过添加类路径的方式来解决类加载问题。同时,参考官方文档检查版本兼容性也是很重要的步骤,以确定是否存在其他潜在的问题。

    希望以上解答对您有所帮助。如果您有任何疑问,欢迎在评论区提出。

    评论
  • 宝码香车 JavaScript领域优质创作者 2025-04-24 16:29
    关注

    让【宝码香车】来帮你解答,本回答参考DeepSeek编写,并整理提供。
    如果还有疑问可以点击头像关注私信或评论。如果答案让您满意,请采纳、点赞、关注,非常感谢!

    Flink SQL 建表出现 JDK 报错解决方案

    问题分析

    您遇到的问题是由于 Flink (JDK 11) 和 Hive (JDK 8) 使用了不同版本的 JDK 导致的类加载器兼容性问题。具体错误表明 JDK 11 的 AppClassLoader 无法转换为 URLClassLoader,这是 JDK 9+ 模块化系统引入的变化。

    解决方案

    方案1:统一 JDK 版本(推荐)

    最佳实践是让 Flink 和 Hive 使用相同版本的 JDK

    1. 将 Hive 升级到支持 JDK 11 的版本(Hive 3.1.3 官方支持 JDK 8)
    2. 或者将 Flink 降级到 JDK 8 环境运行

    方案2:使用兼容性配置

    如果无法统一 JDK 版本,可以尝试以下配置:

    1. 在 Flink 的 conf/flink-conf.yaml 中添加:
    classloader.resolve-order: parent-first
    
    1. 或者在启动 Flink SQL 客户端时添加参数:
    ./sql-client.sh -e "SET 'classloader.resolve-order' = 'parent-first';"
    

    方案3:使用 Hive 连接器兼容模式

    在 Flink SQL 中设置 Hive 连接器兼容模式:

    SET table.sql-dialect=hive;
    SET hive.version=3.1.3;
    

    方案4:检查依赖冲突

    确保 Flink 和 Hive 的依赖版本兼容,特别是:

    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-connector-hive_2.12</artifactId>
        <version>1.19.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hive</groupId>
        <artifactId>hive-exec</artifactId>
        <version>3.1.3</version>
        <exclusions>
            <exclusion>
                <groupId>org.pentaho</groupId>
                <artifactId>*</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    

    其他注意事项

    1. 检查您的建表语句中有一个拼写错误:endTime TIMESTAWP 应该是 endTime TIMESTAMP
    2. 确保 Hive metastore 服务正常运行
    3. 检查 Flink 的 Hive catalog 配置是否正确

    如果以上方案都不能解决问题,可能需要考虑升级 Flink 和 Hive 到更兼容的版本组合。

    展开全部

    评论
  • 码农阿豪@新空间 Java领域优质创作者 2025-04-24 16:41
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    根据报错信息,可能是由于Flink和Hive使用的JDK版本不一致导致的类转换异常。Flink使用JDK11,而Hive使用JDK8,造成了类加载器的不匹配。为了解决这个问题,需要确保Flink和Hive使用相同版本的JDK。 解决方法:
    1. 确保Flink和Hive都使用相同版本的JDK,建议都升级到JDK11或将两者都降级到JDK8。
    2. 可以在Flink的conf/flink-conf.yaml文件中设置环境变量env.java.opts,指定JDK版本。例如env.java.opts: "-Djava.version=1.8"
    3. 如果以上方法无效,可以尝试在启动Flink SQL客户端时,指定JDK版本。例如java -version:1.8 -jar flink-sql-client.jar。 案例: 假设现在Flink使用的是JDK11,而Hive使用的是JDK8,可以通过以下步骤解决这个问题。 步骤一:在Flink的conf/flink-conf.yaml文件中设置环境变量env.java.opts,指定JDK版本为1.8。
    env.java.opts: "-Djava.version=1.8"
    

    步骤二:重启Flink集群。 步骤三:重新启动Flink SQL客户端,并执行建表语句。 继续遇到问题可以尝试其他方法或者查看Flink和Hive的官方文档进行详细配置。 希望以上回答对您有帮助,如有不清楚的地方或者其他问题,请随时与我联系。

    评论
编辑
预览

报告相同问题?

手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部