如何避免"不是文件"使用spark从HDFS读取时的异常

时间:2015-10-03 10:29:29

标签: apache-spark hdfs emr s3distcp

在初始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来展平树吗?

3 个答案:

答案 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

或将文件列表合并为单个数据帧:

Read multiple files from a directory using Spark

答案 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")