当前位置: 首页 > 知识库问答 >
问题:

需要将flink-hadoop-compatibility-2.10 jar显式复制到EMR集群上的${FLINK-HOME}/lib位置

费明诚
2023-03-14

我目前正在开发一个Flink应用程序,它使用一些Hadoop依赖项将数据写入S3位置。在本地环境中,它工作得很好,但是当我在EMR集群上部署这个Flink应用程序时,它引发了一个与兼容性问题有关的异常。

我得到的错误消息是

java.lang.RuntimeException:无法加载类'org.apache.hadoop.io.writable'的TypeInformation。您可能缺少“flink-hadoop-compatibility”依赖项。在org.apache.flink.api.java.typeutils.typeExtractor.createHadoopWritableTypeInfo(typeExtractor.java:2025)在org.apache.flink.api.java.typeExtractor.typeExtractor.privateGetForClass(typeExtractor.java:1649)在org.apache.flink.api.java.typeExtractor.typeExtractor.java.privateGetForClass(

我在POM依赖项中包含了flink-hadoop-compatibility-2.10jar的maven依赖项。但它没有探测到它。我使用的Flink版本是1.2.0

但是,当我显式地将兼容性JAR复制到${FLINK-HOME}/lib位置时,我不会得到任何异常,并且能够成功地运行Flink应用程序

我们是否可以使用任何方法,以便在不将JAR文件部署到${FLINK-HOME}/lib的情况下运行应用程序?

在POM依赖项中需要什么修改,以便应用程序能够检测到它,并且不需要将兼容性JAR复制到flink-home/lib位置?

共有1个答案

颜镜
2023-03-14
package org.apache.flink.api.java.typeutils;

public class TypeExtractor {

    /** The name of the class representing Hadoop's writable */
    private static final String HADOOP_WRITABLE_CLASS = "org.apache.hadoop.io.Writable";
    private static final String HADOOP_WRITABLE_TYPEINFO_CLASS = "org.apache.flink.api.java.typeutils.WritableTypeInfo";


    // visible for testing
    public static <T> TypeInformation<T> createHadoopWritableTypeInfo(Class<T> clazz) {
        checkNotNull(clazz);

        Class<?> typeInfoClass;
        try {
            typeInfoClass = Class.forName(HADOOP_WRITABLE_TYPEINFO_CLASS, false, TypeExtractor.class.getClassLoader());
        }
        catch (ClassNotFoundException e) {
            throw new RuntimeException("Could not load the TypeInformation for the class '"
                    + HADOOP_WRITABLE_CLASS + "'. You may be missing the 'flink-hadoop-compatibility' dependency.");
        }

        ...
    }
}

这是因为org.apache.hadoop.io.writable意味着由typeextractor.class.getClassLoader()加载,它是appClassLoader,而子项flink jar是由parentFirstClassLoader加载的,它是appClassLoader的子项,因此appClassLoader不能从flink jar加载

我不确定这是否是一个bug,将classLoader改为thread.currentThread().getContextClassLoader()将使其工作,而无需将flink-hadoop-compatibility jar文件复制到${FLINK-HOME}/lib位置。

 类似资料:
  • 我对Flink和库伯内特斯是新手。我计划创建一个flink流作业,将数据从文件系统流到Kafka。 使用工作正常的flink job jar(本地测试)。现在我正试图在kubernetes主持这项工作,并希望在AWS中使用EKS。 我已经阅读了有关如何设置flink群集的官方flink文档。https://ci.apache.org/projects/flink/flink-docs-releas

  • 我正试图在集群上运行Flink作业。这份工作在我的开发(本地)环境下运行良好。但当我使用以下命令将其部署到集群上时: 它失败了,错误如下: 我还添加了所需的依赖项 我正在使用构建jar文件

  • 一、部署模式 Flink 支持使用多种部署模式来满足不同规模应用的需求,常见的有单机模式,Standalone Cluster 模式,同时 Flink 也支持部署在其他第三方平台上,如 YARN,Mesos,Docker,Kubernetes 等。以下主要介绍其单机模式和 Standalone Cluster 模式的部署。 二、单机模式 单机模式是一种开箱即用的模式,可以在单台服务器上运行,适用于

  • 我正在尝试在kubernetes上部署高可用的flink集群。在下面的示例中,工作节点被复制,但我们只有一个主pod。 https://github.com/apache/flink-statefun 据我所知,有两种方法可以让job manager成为HA。 https://ci.apache.org/projects/flink/flink-docs-stable/ops/jobmanager

  • 我有Hadoop3.0集群(为了学习目的),1个name-node和3个slave。在每个节点上,hdfs-site.xml如下所示: 在此输入图像说明

  • 我正在使用EMR 5.30.0,并尝试使用以下命令提交Flink(1.10.0)作业 想知道是否每个提交的作业都试图创建一个Flink Yarn会话,而不是使用现有的会话。 谢谢Sateesh