【问题标题】:Hadoop FileUtils not able to write files on local(Unix) filesystem from ScalaHadoop FileUtils 无法从 Scala 在本地(Unix)文件系统上写入文件
【发布时间】:2019-06-03 05:27:17
【问题描述】:

我正在尝试使用org.apache.hadoop.fs 的文件系统库将文件写入本地FileSystem。下面是我应该这样做的大 scala 代码中的一个内衬代码,但事实并非如此。

fs.copyToLocalFile(false, hdfsSourcePath, new Path(newFile.getAbsolutePath), true)

newFile 的值为:

val newFile = new File(s"${localPath}/fileName.dat")

localPath 只是一个包含本地磁盘完整路径的变量。 hdfsSourcePath 是 HDFS 位置的完整路径。

作业正常执行,但我没有看到在本地创建的文件。我在cluster 模式下通过Spark 引擎运行它,这就是为什么我使用copyToLocalFile 方法重载useRawLocalFileSystem 的第四个参数并将其设置为true。使用它,我们可以避免将文件写入执行程序节点。

有什么想法吗?

【问题讨论】:

    标签: scala apache-spark hadoop


    【解决方案1】:

    我使用了 copyToLocalFile 方法,它重载了 useRawLocalFileSystem 的第四个参数并将其设置为 true。使用它,我们可以避免将文件写入执行程序节点。

    我认为你理解错了。集群模式使驱动程序运行在执行程序节点上,本地文件系统是执行程序的文件系统。 useRawLocalFileSystem 仅阻止写入校验和文件 (->info),它不会使文件出现在提交作业的机器上,这可能是您所期望的。

    您可以做的最好的事情是将文件保存到 HDFS 并在作业完成后显式检索它们。

    【讨论】:

    • 那我当然理解错了。仅仅在实用程序中存在这些 copyToLocal 方法就无关紧要了。只是一个查询,copyMerge 会做必要的工作吗?
    • 不会的。驱动程序与提交作业的节点没有任何联系。这就像“一发不可收拾”。但是,如果您的情况可能,您也可以尝试使用客户端模式。
    • 无法使用客户端模式,我只能在cluster 模式下执行作业。不确定在程序中使用HDFS 命令在程序完成后复制文件的可行性有多大;必须尝试。
    • 嗨。我试图按照您的建议移动通过 Hadoop 特定命令创建的文件。遇到权限问题,stackoverflow.com/questions/56420928/…
    猜你喜欢
    • 2018-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-08
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多