我正在开发一个应用程序,从hadoop读取文件,处理并将数据存储回hadoop。 我很困惑正确的hdfs文件路径格式应该是什么。当从火花外壳读取 hdfs 文件时,例如
val file=sc.textFile("hdfs:///datastore/events.txt")
它工作正常,我能够阅读它。
但是当我将jar汇总为包含相同代码集的纱线时,它给出的错误是
org.apache.hadoop.HadoopIllegalArgumentException: Uri without authority: hdfs:/datastore/events.txt
当我添加名称节点 ip 作为hdfs://namenodeserver/datastore/events.txt
一切正常时。
我对这种行为有点困惑,需要指导。
注意:我正在使用 aws emr 设置,所有配置都是默认配置。
如果你想使用 sc.textFile("hdfs://..."(,你需要给出完整的路径(绝对路径(,在你的例子中是"nn1home:8020/..">
如果你想让它变得简单,那么只需使用 sc.textFile("hdfs:/input/war-and-peace.txt"(
那只是一个/
我认为它会起作用。
问题解决了。当我进一步调试时fs.defaultFS
当我只是将路径传递为hdfs:///path/to/file
时,core-site.xml
没有使用该属性。但是所有的hadoop配置属性都被加载了(因为我记录了sparkContext.hadoopConfiguration
对象。
作为解决方法,我手动将属性读取为sparkContext.hadoopConfiguration().get("fs.defaultFS)
并将其附加到路径中。
我不知道这是不正确的方法。