我正在尝试从本地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")
如何将此文件读入文件?
1条答案
按热度按时间wtlkbnrh1#
对于第一个问题:
提交hadoop作业时,可以在任何工作节点(包括主节点)上创建主应用程序(取决于配置)。
如果您使用的是emr,那么默认情况下会在任何工作节点(核心节点)上创建应用程序主节点,但不会在主节点上创建。
当你说
file:///emr/myFile.csv
这个文件存在于您的本地文件系统上(我假设这意味着在主节点上),您的程序将在应用程序主节点所在的节点上搜索这个文件,而它肯定不在您的主节点上,因为您不会得到任何错误。第二个问题:
当您尝试使用java访问hdfs中的文件时
File.class
,它将无法访问该文件。您需要使用hadoop文件系统api(
org.apache.hadoop.fs.FileSystem
)与hdfs文件交互。也可以使用hdfs文件标记
hdfs://<namenode>:<port>/emr/CNSMR_ACCNT_BAL/myFile.csv
.如果你的
core-site.xml
包含的值fs.defaultFS
那么您不需要简单地输入namenode和port信息hdfs:///emr/CNSMR_ACCNT_BAL/myFile.csv
那么,在hadoop集群中访问文件时,有什么更好的选择呢?答案取决于您的用例,但大多数情况下,将其放在hdfs中会更好,因为您不必担心应用程序主机在哪里。每个节点都可以访问hdfs。
希望这能解决你的问题。