Apache spark 如何避免;“不是文件”;使用spark从HDFS读取时出现异常
在最初的EMR步骤中,我将文件树从S3复制到HDFS<代码>hdfs dfs-ls-Rhdfs:///data_dir显示预期的文件,这些文件类似于:Apache spark 如何避免;“不是文件”;使用spark从HDFS读取时出现异常,apache-spark,hdfs,emr,s3distcp,Apache Spark,Hdfs,Emr,S3distcp,在最初的EMR步骤中,我将文件树从S3复制到HDFShdfs dfs-ls-Rhdfs:///data_dir显示预期的文件,这些文件类似于: /data_dir/year=2015/ /data_dir/year=2015/month=01/ /data_dir/year=2015/month=01/day=01/ /data_dir/year=2015/month=01/day=01/data01.12345678 /data_dir/year=2015/month=01/day=01/da
/data_dir/year=2015/
/data_dir/year=2015/month=01/
/data_dir/year=2015/month=01/day=01/
/data_dir/year=2015/month=01/day=01/data01.12345678
/data_dir/year=2015/month=01/day=01/data02.12345678
/data_dir/year=2015/month=01/day=01/data03.12345678
“目录”列为零字节文件
然后我运行一个spark步骤,需要读取这些文件。因此,加载代码为:
sqlctx.read.json('hdfs:///data_dir, schema=schema)
作业失败,出现java异常
java.io.IOException: Not a file: hdfs://10.159.123.38:9000/data_dir/year=2015
我曾经(也许是天真地)假设spark会递归地从“dir树”下降并加载数据文件。如果我指向S3,它将成功加载数据
我误解HDFS了吗?我能告诉spark忽略零字节文件吗?我可以使用S3DistCp展平树吗?在当前spark上下文的Hadoop配置中,在获取sql ctx之前,为Hadoop InputFormat配置“递归”读取
val hadoopConf = sparkCtx.hadoopConfiguration
hadoopConf.set("mapreduce.input.fileinputformat.input.dir.recursive", "true")
这将为“非文件”提供解决方案。
接下来,要读取多个文件:
或将文件列表合并到单个数据帧中:
在spark 2.1.0版中,必须以这种方式设置参数:
.set("spark.hive.mapred.supports.subdirectories","true")
.set("spark.hadoop.mapreduce.input.fileinputformat.input.dir.recursive","true")
通过以下方式解决问题:
spark-submit ...
--conf spark.hadoop.mapreduce.input.fileinputformat.input.dir.recursive=true \
--conf spark.hive.mapred.supports.subdirectories=true \
...
对于DataFrame API,我无法判断,但在纯Spark中,即使用RDD,您可以使用
SparkContext.wholeTextFiles(*path*)
,加载目录中的所有文件。有关详细信息,请参阅“/data_dir/*/*/*/*/*.*”?根据我的经验,spark不会在子目录中递归加载文件。@WoodChopper谢谢,你是对的。HDFS驱动程序不会递归地降低文件层次结构(hierarchy.yw:)我猜它只是不支持HDFS,即使是本地文件系统。