【问题标题】:SparkContext.wholeTextFiles() java.io.FileNotFoundException: File does not exist:SparkContext.wholeTextFiles() java.io.FileNotFoundException:文件不存在:
【发布时间】:2014-12-03 04:55:44
【问题描述】:

我正在尝试在存储 amazon S3 的文件上使用 apache Spark sc.wholeTextFiles() 我收到以下错误:

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('s3n://wiki-dump/wikiinput'),它读取文件没有任何问题。

EDIT2:

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

【问题讨论】:

    标签: python scala amazon-s3 apache-spark


    【解决方案1】:

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

    您使用的是最新版本的 Spark 吗?我认为 Python 在旧版 Spark 中有些落后。

    gensim.corpora.wikicorpus.extract_pages 期望什么输入?我只是好奇,因为/wikiinput/wiki.xml.gz 既不包含协议也不包含存储桶,因此可能根本无法解决正确的文件。当我在 Scala 和 HDFS 上使用 WholeTextFiles 时,文件名为 hdfs://&lt;host&gt;:&lt;port&gt;/path/to/file

    【讨论】:

    • 是的,我使用的是最新版本的 Spark (1.1.0)。是的,错误指向/wikiinput/wiki.xml.gz,但在我的代码中,我指定了整个路径's3n://wiki-dump/wikiinput',当我放在那里时,'s3n://wiki-dump/ wikiinput/wiki.xml.gz' 然后什么都没有改变,所以我很惊讶为什么它被 spark 改变了? extract_pages 需要类似对象的文件,但是当它是字符串时,这不是问题,我会将其转换为类似对象的文件。
    • 请注意,wholeTextFile 为您提供了一个 (fileName, content) 的元组
    • 好的,谢谢。当我将运行第二个更简单的代码时,我将使用 extract_pages 在代码中修复它。
    • 我也尝试从 Scala 运行它,但我仍然遇到同样的错误。
    • 那么它可能不支持S3。实现与textFile 完全不同。不幸的是,我没有要测试的 S3 存储桶。
    【解决方案2】:

    问题似乎主要不在于 spark,而在于链接的 Hadoop 库的版本。我在将 spark 1.3.0 与 Hadoop 1 一起使用时得到了这个,但在使用 Hadoop 2 时看不到它。如果您需要此方法来使用 s3,请务必安装链接到 Hadoop 2 库的 spark 版本。具体来说,如果您使用 spark-ec2 脚本在 AWS 上设置集群,请确保包含选项 --hadoop-major-version=2

    完整的细节可以在这里找到: https://issues.apache.org/jira/browse/SPARK-4414

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-27
      • 1970-01-01
      相关资源
      最近更新 更多