从hadoop文件系统读取文件后,从本地文件系统读取文件

时间:2020-07-29 20:54:48

标签: scala file hadoop filesystems filenotfoundexception

我正在尝试从本地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 个答案:

答案 0 :(得分:0)

对于您的第一个 st 问题:

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

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


2 nd 问题:

当您尝试使用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。

希望能解决您的问题。