问题描述
Flink1.13.6 如何集成Hadoop-3.3.0
通常Flink集群配置好后,还不能直接访问HDFS,因为缺少相关jar包,会弹出无法解析hdfs类型的schema的错误:
org.apache.flink.core.fs.UnsupportedFileSystemSchemeException: Could not find a file system implementation for scheme 'hdfs'. The scheme is not directly supported by Flink and no Hadoop file system to support this scheme could be loaded.
版本说明
我的flink是1.13.6版本,hadoop是3.3.0版本
虽然官方声明flink目前尚没有对hadoop 3.x的支持,但只要没用到hadoop 3.x的新特性,只用hadoop 2.x就有的常规功能的话,现有的jar包是可以支持的。
解决方法
网上找到的诸如添加HADOOP_CLASSPATH方法对我的flink集群无效,后来花了一番功夫,尝试了其他方法,终于解决了。
此时只需要往服务器上的 flink 中的lib目录里添加2个jar包即可.
commons-cli-1.4.jar
flink-shaded-hadoop-3-uber-3.1.1.7.2.9.0-173-9.0.jar
设置环境变量 HADOOP_CLASSPATH
export HADOOP_CLASSPATH=`hadoop classpath`
重启Flink集群
bin/stop-cluster.sh
bin/start-cluster.sh
补充问题1
上面测试使用的是官方写好的jar包,如果使用的是自己编写代码后打包的jar包,放到flink集群上运行时会出现诸如:
Wrong FS: hdfs://node1:8020/xxx, expected: hdfs://node1:8020
的问题,说明没给代码配置好正确的hdfs路径,只需要把hadoop中的这两个配置文件粘贴到工程的 `src/main/resources` 目录里即可:
core-site.xml
hdfs-site.xml
重新打包jar包。
补充问题2
还可能出现下面的错误:
Cannot instantiate file system for URI: hdfs
则检查自己的工程里`pom.xml`文件中有没有添加`hadoop-client`的依赖:
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>3.3.0</version>
</dependency>
重新打包jar包,再重启服务器的flink集群(重启集群看起来没必要,但玄学的是这个问题我重启了才能成功解决)。
flink run方式执行jar包
bin/flink run ~/jars/my_flink_app.jar [args1] [args2] ...