我试图使用Spark2应用程序中的Hadoop的copyToLocalFile函数将文件从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应用程序时,上面的代码工作正常。但是,它在纱线群集模式下始终会失败,并出现以下异常。
18/10/03 12:18:40 ERROR yarn.ApplicationMaster: User class threw exception: java.io.FileNotFoundException: /home/yxs7634/all.txt (Permission denied)
答案 0 :(得分:1)
在纱线群集模式下,驱动程序也由纱线处理,并且选定的驱动程序节点可能不是您提交作业的节点。因此,为了使这项工作能够在纱线群集模式下工作,我相信您需要将本地文件放置在群集中的所有spark节点中。
答案 1 :(得分:1)
在纱线模式下,火花作业通过YARN提交。 该驱动程序将在其他节点上启动。
要解决此问题,可以使用HDFS之类的分布式文件系统来存储文件,然后提供绝对路径。
例如:
>>> with open('default-python-path.txt', 'w') as fp:
... for folder in sorted(sys.path):
... print(folder, file=fp)
...
>>>
答案 2 :(得分:0)
您有一个权限被拒绝的错误,我的意思是,您用来提交作业的用户无法访问该文件。该目录至少应具有用户“ other”的读取权限,如下所示:-rw-rw-r--
可以粘贴目录和文件的权限吗?该命令是
hdfs dfs -ls /your-directory/
答案 3 :(得分:0)
看起来像运行在一个用户(例如“ spark”)下的Spark服务器,并且文件中的文件存储在另一个用户“ yxs7634”目录中。 在群集模式下,用户“ spark”不允许在“ yxs7634”用户目录中写入,并且会发生此类异常。
Spark用户需要附加权限才能写入“ / home / yxs7634”。
在本地模式下工作正常,因为Spark在“ yxs7634”用户下运行。