【问题标题】:Reading a file from local file system after reading it from hadoop file system从hadoop文件系统读取文件后从本地文件系统读取文件
【发布时间】:2020-07-29 20:54:48
【问题描述】:

我正在尝试从本地 EMR 文件系统中读取文件。它在文件夹/emr/myFile.csv 下作为文件存在。但是,我不断收到FileNotFoundException。这是我用来阅读它的代码行:

val myObj: File = new File("/emr/myFile.csv")

我也在文件路径中添加了一个file://// 前缀,因为我已经看到它对其他人有用,但这仍然不起作用。所以我也尝试直接从存储在文件夹中的hadoop文件系统中读取:/emr/CNSMR_ACCNT_BAL/myFile.csv,因为我认为它可能默认在hdfs中检查。但是,这也会产生FileNotFoundException。这是代码:

val myObj: File = new File("/emr/CNSMR_ACCNT_BAL/myFile.csv")

我怎样才能把这个文件读入一个文件?

【问题讨论】:

    标签: scala file hadoop filesystems filenotfoundexception


    【解决方案1】:

    对于您的第一个st 问题:

    当您提交 hadoop 作业应用程序时,可以在您的任何工作节点(包括主节点)上创建主节点(取决于您的配置)。
    如果您使用的是 EMR,默认情况下,您的应用程序主节点会在您的任何工作节点(CORE 节点)上创建而不是主节点

    当您说file:///emr/myFile.csv 此文件存在于您的本地文件系统上(我假设这意味着在主节点上)时,您的程序将在应用程序主节点所在的那个节点上搜索此文件,并且它绝对不在您的主节点,因为这样你不会得到任何错误。


    2nd 问题:

    当您尝试使用 java File.class 访问 HDFS 中的文件时,它将无法访问该文件。
    您需要使用 hadoop FileSystem api (org.apache.hadoop.fs.FileSystem) 与 HDFS 文件进行交互。

    也使用HDFS文件标签hdfs://<namenode>:<port>/emr/CNSMR_ACCNT_BAL/myFile.csv
    如果您的core-site.xml 包含fs.defaultFS 的值,那么您不需要简单地输入名称节点和端口信息hdfs:///emr/CNSMR_ACCNT_BAL/myFile.csv


    那么在访问 hadoop 集群中的文件时,这里有什么更好的选择?
    答案取决于您的用例,但大多数情况下将它放在 HDFS 中会更好,因为您不必担心应用程序主控器在哪里。每个节点都可以访问 hdfs。

    希望能解决您的问题。

    【讨论】:

    • 您好,感谢您的回复。所以我尝试使用以下代码从hadoop文件系统api使用copyToLocalFile方法:hadoopFileSystem.copyToLocalFile(hadoopFileSystem.globStatus(new Path("hdfs:///emr/CNS_ACCNT_BAL/part*.csv"))(0).getPath , new Path("file:///emr/myFile.csv")) 该过程完成且没有错误,但是,我在本地文件系统中找不到该文件。我还尝试将目标路径设置为 /emr/myFile.csv 而不使用 file:/// 前缀,但仍然找不到它的位置。有什么帮助吗?
    • 你是如何执行程序的?如果您将其作为 hadoop 作业执行,则文件 /emr/myFile.csv 将位于您的应用程序主节点所在的那个节点中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-20
    • 2012-04-12
    相关资源
    最近更新 更多