flink on yarn 遇到 Argument list too long

在进行flink on yarn 任务的时候,hdfs上有大量的jar包需要下载,yarn会报如下错误,请问有什么办法可以解决吗?flink on yarn 采用 application 模式。

Exception message: Cannot run program "bash" (in directory "/hadoop/dhadoop/hadoop-2.9.2/data/tmp/nm-local-dir/usercache/root/appcache/application_1676528338653_0002/container_1676528338653_0002_01_000001"): error=7, Argument list too long

For more detailed output, check the application tracking page: http://hadoop102:8088/cluster/app/application_1676528338653_0002 Then click on links to logs of each attempt.
. Failing the application.

img

个人分析,是报错的原因是由于这个,但是暂时没有找到解决的办法,希望有人可以帮助,谢谢

这个错误信息通常是由于运行的命令行参数过长导致的。在这种情况下,一种可能的解决方案是在命令行中使用通配符(wildcard)来代替具体的jar包列表,以减少命令行的长度。例如,使用通配符*来代替所有jar包:

flink run -m yarn-cluster -ynm "MyJob" -c com.example.MyJob ./myjob.jar -j hdfs:///path/to/jars/*


另一种解决方案是将hdfs上的jar包文件复制到本地文件系统上,然后使用本地文件系统路径代替HDFS路径,以避免yarn下载大量的jar包。例如:

hdfs dfs -copyToLocal /path/to/jars/* /tmp/flink-jars
flink run -m yarn-cluster -ynm "MyJob" -c com.example.MyJob ./myjob.jar -j /tmp/flink-jars/*


请注意,这种方法可能会占用更多的磁盘空间,因为需要将jar包复制到本地文件系统上。

这个错误通常发生在参数列表太长的情况下。在这种情况下,Shell 将无法处理所有参数。在 YARN 应用程序的情况下,这通常是由于 Hadoop 向应用程序提供了大量的 JAR 文件而导致的。对于 Flink on YARN,有一些可能的解决方法:

1.减少 JAR 文件的数量:考虑减少应用程序中使用的 JAR 文件数量。可以将一些 JAR 文件打包成更大的 uber-JAR 文件或者使用依赖管理工具来简化依赖关系。同时,可以通过在应用程序中直接编写和使用 Flink 内置的函数来减少需要下载的 JAR 文件的数量。

2.使用代码包:可以将应用程序的代码打包成 ZIP 文件并将其上传到 HDFS,以便在运行时从 HDFS 中加载代码。这样,应用程序就可以避免下载所有 JAR 文件。通过设置 yarn.application.classpath,可以将代码包添加到应用程序类路径中,从而在运行时加载它们。

3.调整 YARN 配置:如果无法减少 JAR 文件数量或者使用代码包,可以尝试调整 YARN 的一些配置参数。例如,可以尝试增加 yarn.nodemanager.vmem-check-enabled 和 yarn.nodemanager.vmem-pmem-ratio 的值,或者增加 yarn.scheduler.maximum-allocation-mb 和 yarn.nodemanager.resource.memory-mb 的值。这将增加每个容器的内存限制,从而使容器能够处理更多的参数。不过,这些配置更改可能会影响整个 Hadoop 集群,因此需要谨慎处理。