Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 如何避免;“不是文件”;使用spark从HDFS读取时出现异常_Apache Spark_Hdfs_Emr_S3distcp - Fatal编程技术网

Apache spark 如何避免;“不是文件”;使用spark从HDFS读取时出现异常

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

在最初的EMR步骤中,我将文件树从S3复制到HDFS<代码>hdfs 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/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,即使是本地文件系统。