在初始EMR步骤中,我使用S3DistCP将文件树从S3复制到HDFS。 hdfs dfs -ls -R hdfs:///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/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
我(或许是天真地)认为火花会递归地降落在“树”树上。并加载数据文件。如果我指向S3,它会成功加载数据。
我误解了HDFS吗?我可以告诉spark忽略零字节文件吗?我可以使用S3DistCp来展平树吗?
答案 0 :(得分:4)
在当前spark上下文的Hadoop配置中,配置"递归"在获取sql ctx之前读取Hadoop InputFormat
val hadoopConf = sparkCtx.hadoopConfiguration
hadoopConf.set("mapreduce.input.fileinputformat.input.dir.recursive", "true")
这将为"而不是文件"提供解决方案。 接下来,阅读多个文件:
Hadoop job taking input files from multiple directories
或将文件列表合并为单个数据帧:
答案 1 :(得分:2)
问题已解决:
spark-submit ...
--conf spark.hadoop.mapreduce.input.fileinputformat.input.dir.recursive=true \
--conf spark.hive.mapred.supports.subdirectories=true \
...
答案 2 :(得分:0)
必须在spark版本2.1.0中以这种方式设置参数:
.set("spark.hive.mapred.supports.subdirectories","true")
.set("spark.hadoop.mapreduce.input.fileinputformat.input.dir.recursive","true")