SparkContext.wholeTextFiles()java.io.FileNotFoundException:文件不存在:

时间:2014-10-08 13:42:47

标签: python scala amazon-s3 apache-spark

我试图在文件上使用apache Spark sc.wholeTextFiles()存储在亚马逊S3中我得到了以下错误:

14/10/08 06:09:50 INFO input.FileInputFormat: Total input paths to process : 1
14/10/08 06:09:50 INFO input.FileInputFormat: Total input paths to process : 1
Traceback (most recent call last):
File "/root/distributed_rdd_test.py", line 27, in <module>
result = distData.flatMap(gensim.corpora.wikicorpus.extract_pages).take(10)
File "/root/spark/python/pyspark/rdd.py", line 1126, in take
totalParts = self._jrdd.partitions().size()
File "/root/spark/python/lib/py4j-0.8.2.1-src.zip/py4j/java_gateway.py", line 538, in __call__
File "/root/spark/python/lib/py4j-0.8.2.1-src.zip/py4j/protocol.py", line 300, in get_return_value

py4j.protocol.Py4JJavaError: An error occurred while calling o30.partitions.
: java.io.FileNotFoundException: File does not exist: /wikiinput/wiki.xml.gz
at org.apache.hadoop.hdfs.DistributedFileSystem.getFileStatus(DistributedFileSystem.java:517)
at org.apache.hadoop.mapreduce.lib.input.CombineFileInputFormat$OneFileInfo.<init>(CombineFileInputFormat.java:489)
at org.apache.hadoop.mapreduce.lib.input.CombineFileInputFormat.getMoreSplits(CombineFileInputFormat.java:280)
at org.apache.hadoop.mapreduce.lib.input.CombineFileInputFormat.getSplits(CombineFileInputFormat.java:240)
at org.apache.spark.rdd.WholeTextFileRDD.getPartitions(NewHadoopRDD.scala:220)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:204)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:202)
at scala.Option.getOrElse(Option.scala:120)
at org.apache.spark.rdd.RDD.partitions(RDD.scala:202)
at org.apache.spark.api.python.PythonRDD.getPartitions(PythonRDD.scala:56)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:204)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:202)
at scala.Option.getOrElse(Option.scala:120)
at org.apache.spark.rdd.RDD.partitions(RDD.scala:202)
at org.apache.spark.api.java.JavaRDDLike$class.partitions(JavaRDDLike.scala:50)
at org.apache.spark.api.java.JavaRDD.partitions(JavaRDD.scala:32)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:231)
at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:379)
at py4j.Gateway.invoke(Gateway.java:259)
at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:133)
at py4j.commands.CallCommand.execute(CallCommand.java:79)
at py4j.GatewayConnection.run(GatewayConnection.java:207)
at java.lang.Thread.run(Thread.java:745)

我的代码如下:

sc = SparkContext(appName="Process wiki")
distData = sc.wholeTextFiles('s3n://wiki-dump/wikiinput') 
result = distData.flatMap(gensim.corpora.wikicorpus.extract_pages).take(10)
for item in result:
    print item.getvalue()
sc.stop()

所以我的问题是,是否可以从Spark中读取S3中的整个文件?根据文档,它应该是可能的,但它似乎对我不起作用。

当我这样做时:

sc = SparkContext(appName="Process wiki")
distData = sc.wholeTextFiles('s3n://wiki-dump/wikiinput').take(10)
print distData

然后我得到的错误完全一样。

修改

我当然尝试过sc.textFile(&#39; s3n:// wiki-dump / wikiinput&#39;),它会毫无问题地读取文件。

EDIT2:

我还试图从Scala运行相同的代码,但我仍然遇到同样的错误。特别是我试图运行val file = sc.wholeTextFiles("s3n://wiki-dump/wikiinput").first()

2 个答案:

答案 0 :(得分:0)

由于错误消息指向您未指定的特定文件(/wikiinput/wiki.xml.gz),因此该文件应该已损坏,或者您没有正确的权限来访问它。

您使用的是最新版本的Spark吗?我认为Python在较旧的Spark版本中落后了一点。

gensim.corpora.wikicorpus.extract_pages期望得到什么输入?我只是好奇,因为/wikiinput/wiki.xml.gz既不包含协议也不包含桶,因此可能无法解决正确的文件。当我使用Scala和HDFS的wholeTextFiles时,文件名为hdfs://<host>:<port>/path/to/file

答案 1 :(得分:0)

问题似乎并非主要与spark有关,而是与Hadoop库的版本相关联。我在使用带有Hadoop 1的spark 1.3.0时得到了这个,但在使用Hadoop 2时却没有看到它。如果你需要这个方法来使用s3,请确保安装一个链接到Hadoop 2库的spark版本。具体来说,如果您使用spark-ec2脚本在AWS上设置集群,请确保包含选项--hadoop-major-version = 2

详细信息可在此处找到: https://issues.apache.org/jira/browse/SPARK-4414