我试图使用Hadoop的copyToLocalFile函数从我的Spark2应用程序将文件从HDFS复制到本地。
val hadoopConf = new Configuration()
val hdfs = FileSystem.get(hadoopConf)
val src = new Path("/user/yxs7634/all.txt")
val dest = new Path("file:///home/yxs7634/all.txt")
hdfs.copyToLocalFile(src, dest)
当我在 Yarn 客户端模式下提交我的 Spark 应用程序时,上面的代码工作正常。但是,它在 Yarn 集群模式下不断失败,出现以下异常。
18/10/03 12:18:40 ERROR yarn.ApplicationMaster: User class threw exception: java.io.FileNotFoundException: /home/yxs7634/all.txt (Permission denied)
在 yarn-cluster 模式下,驱动程序也由 yarn 处理,所选的驱动程序节点可能不是提交作业的节点。因此,为了使此作业在 yarn-cluster 模式下工作,我相信您需要将本地文件放置在群集中的所有 spark 节点中。
在 yarn 模式下,Spark 作业通过 YARN 提交。 驱动程序将在另一个节点上启动。
为了解决这个问题,您可以使用像HDFS这样的分布式文件系统来存储文件,然后给出绝对路径。
例如:
val src = new Path("hdfs://nameservicehost:8020/user/yxs7634/all.txt")
看起来像在一个用户下运行的Spark服务器(例如"spark"(,以及存储在其他用户"yxs7634"目录中的代码中的文件。 在集群模式下,用户"spark"不允许写入"yxs7634"用户目录,并且会发生此类异常。
Spark 用户需要额外的权限才能写入"/home/yxs7634"。
在本地模式下工作正常,因为 Spark 在"yxs7634"用户下运行。
您有一个权限被拒绝错误,我的意思是您用于提交作业的用户无法访问该文件。该目录至少应该具有用户"other"的读取权限,如下所示:-rw-rw-r--
您可以粘贴目录和文件的权限吗?该命令是
hdfs dfs -ls /your-directory/