【问题标题】:How to add Hadoop to dependencies via maven?如何通过 Maven 将 Hadoop 添加到依赖项?
【发布时间】:2022-01-23 20:30:19
【问题描述】:

我正在尝试构建一个 apache flink 作业,该作业必须通过 HDFS 访问文件。它在本地运行良好,但是当我将作业提交到 flink 集群时,出现错误:

Hadoop is not in the classpath/dependencies.

我正在使用 Maven shade 插件来构建我的 job.jar。 Flink 集群没有 Hadoop jar,所以我必须将它们全部添加到作业本身。

在本地,我必须在我的 IDE 设置中添加选项“将具有“提供”范围的依赖项添加到类路径以使其工作,但我不知道如何使用 maven 来做到这一点。

pom.xml


        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-java</artifactId>
            <version>${dep.flink.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-clients_2.11</artifactId>
            <version>${dep.flink.version}</version>
            <scope>provided</scope>
        </dependency>
...
<build>
        <plugins>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>${plugin.maven-compiler.version}</version>
                <configuration>
                    <source>${project.build.targetJdk}</source>
                    <target>${project.build.targetJdk}</target>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>${plugin.maven-shade.version}</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <minimizeJar>true</minimizeJar>
                            <relocations>
                                <relocation>
                                    <pattern>org.apache.commons.cli</pattern>
                                    <shadedPattern>org.test.examples.thirdparty.commons_cli</shadedPattern>
                                </relocation>
                            </relocations>
                            <filters>
                                <!-- Filters out signed files to avoid SecurityException when integrating a signed jar in the resulting jar. -->
                                <filter>
                                    <artifact>*:*</artifact>
                                    <excludes>
                                        <exclude>META-INF/*.SF</exclude>
                                        <exclude>META-INF/*.DSA</exclude>
                                        <exclude>META-INF/*.RSA</exclude>
                                    </excludes>
                                </filter>
                            </filters>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

【问题讨论】:

    标签: java maven hadoop apache-flink


    【解决方案1】:

    如果您在 YARN 上阅读 yarn deployment

    确保设置了 HADOOP_CLASSPATH 环境变量(可以通过运行echo $HADOOP_CLASSPATH 进行检查)。如果没有,请使用

        export HADOOP_CLASSPATH=`hadoop classpath`
    

    要添加 maven 依赖项,您可以转到 maven repo 搜索您想要的工件,选择您的版本,您将在页面上有一个依赖项代码将其添加到您的 .pom 文件中:

    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-hadoop-compatibility_2.11</artifactId>
        <version>1.13.1</version>
        <scope>test</scope>
    </dependency>
    

    你把它加在标签&lt;dependencies&gt;&lt;/dependencies&gt;之间

    【讨论】:

    • 为什么我需要 hadoop 来运行我的 flink 应用程序?据我了解,我应该只需要在我的工作中使用 maven 依赖项来连接 HDFS。我在一台机器上安装了 hadoop,而 flink 在另一台机器上运行,所以我的 flinkcluster 中没有 hadoop。 >“要添加 maven 依赖项,您可以转到所需的 maven repo 搜索工件,选择您的版本,您将在页面上有一个依赖项代码将其添加到您的 .pom 文件中:”我已经这样做了,但仍然是同样的错误。我尝试了所有我能找到的 hadoop/hdfs/flink-connection 依赖项。
    • 你使用什么版本的 Flink。您尝试做什么以及如何做 - 也可以提供帮助。我从未尝试在远离它的情况下访问 HDFS。提供更多详细信息有助于更好地了解您的问题。
    • 我在 docker 上运行了一个 flink 集群 v1.15。在它旁边,我还使用 docker 运行了一个 Hadoop 集群。我的 hadoop 集群中有一个文件保存在 HDFS 上。我想创建一个在我的 flink 集群上运行的 flink 作业,它从我的 HDFS 读取文件。当我在本地(通过我的 IDE)运行我的 flink 时它可以工作,但是当我将它编译到一个 jar 并在 flink 集群上运行它时,我收到这个错误:Hadoop 不在类路径/依赖项中。
    • 你应该将你给我的信息添加到你的主题中,有人会给你确切的答案。我认为您在 Docker 中的 Flink Standalone 集群的主要问题是对您的 HDFS 集群的存在一无所知,您应该将 HDFS 容器的HADOOP_CLASSPATH 提供给您的 Flink 容器......
    • @nanobot HDFS 适用于大文件。除非您尝试模拟生产环境,否则您实际上并不需要 HDFS namenode/datanode docker 容器......只需将数据文件直接挂载到 Flink 容器中即可在那里读取/处理
    猜你喜欢
    • 2012-02-22
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多