scala—从hadoop文件系统读取文件后从本地文件系统读取文件

9gm1akwq  于 2021-05-31  发布在  Hadoop
关注(0)|答案(1)|浏览(561)

我正在尝试从本地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")

如何将此文件读入文件?

wtlkbnrh

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。
希望这能解决你的问题。

相关问题