我正在尝试从本地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")
如何将该文件读入文件?
答案 0 :(得分:0)
提交Hadoop作业时,可以在包括主节点(取决于您的配置)的任何工作节点上创建主数据库。
如果您使用的是EMR,则默认情况下,您的应用程序主数据库是在您的任何工作节点(CORE节点)上创建的,而不是在主节点上创建的。
当您说file:///emr/myFile.csv
时,此文件存在于本地文件系统中(我假设这意味着在主节点上),您的程序将在应用程序主文件所在的那个节点上搜索该文件,并且绝对不存在。在您的主节点上,因为这样您就不会收到任何错误。
当您尝试使用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。
希望能解决您的问题。