1. 环境信息
- Apache Hadoop 3.2.2
2. 问题描述
情景说明:
本人正在开发数据工厂的实时计算后台,需要将Flink集群的运行纳入到数据工厂的管控之下。数据工厂中的每一个工作空间,如果它有实时计算管道,那么在开发环境和生产环境分别将提供独立的YARN-SESSION模式的集群。
例如开发人员试图在数据工厂的DataStudio中运行测试一条计算管道,那么引擎将会去检查一下这个工作空间的Flink集群有没有启动,没有启动的话,将会启动这个Flink集群,然后将计算管道提交到Flink集群运行,DataStudio中实时获取其执行日志、监控其状态。
后台实现中有如下重要细节:
1) 将Flink程序包传到HDFS上;
- 自己的代码启动集群时,会复制HDFS上的Flink程序包到另一个HDFS目录/user/hadoop/.flink/appXXXX,然后部署启动。
问题描述
在启动Flink集群时, 启动失败,从Hadoop YARN原生的监控界面可看到失败消息:
Resource hdfs://XXX/user/hadoop/.flink/application_1646096734199_0013/plugins/external-resource-gpu/flink-external-resource-gpu-1.14.3.jar is not publicly accessible and as such cannot be part of the public cache.
3. 问题分析
此异常消息出自:

跟着进入isPublic方法:

跟踪进入checkPublicPermsForAll方法:

再查看isPublic方法中的一行代码:
return ancestorsHaveExecutePermissions(fs, current.getParent(), statCache);
跟踪进入:

从源代码分析可知,当YARN从HDFS上离线程序包时,要求程序包及程序包的祖先目录,对于other组,文件夹有r-x权限,文件有r--权限。
发现程序包的祖先目录“.flink”和“hadoop”文件夹的other组权限缺少“r-w”。

4. 解决办法
给“.flink”和“hadoop”文件夹的other组添加“r-w”权限。
[hadoop@XCloud152 bin]$ hadoop fs -chmod o+rx /user/hadoop
[hadoop@XCloud152 bin]$ hadoop fs -chmod o+rx /user/hadoop/.flink
网友评论