在Spark中加载本地文件(而不是HDFS)失败

时间:2016-02-01 04:59:00

标签: apache-spark pyspark

我有一个问题 - 如何在PySpark上使用sc.textFile加载本地文件(不在HDFS上,而不在S3上)。 我读了this article,然后将sales.csv复制到主节点的本地(不是HDFS),最后执行

sc.textFile("file:///sales.csv").count()

但它返回以下错误,说file:/click_data_sample.csv does not exist

  

Py4JJavaError:调用时发生错误   Z:org.apache.spark.api.python.PythonRDD.collectAndServe。 :   org.apache.spark.SparkException:作业因阶段失败而中止:   阶段3.0中的任务0失败4次,最近失败:丢失任务0.3   在第3.0阶段(TID 10,   IP-17X-XX-XX-xxx.ap东北-1.compute.internal):   java.io.FileNotFoundException:文件文件:/sales.csv   不存在

我尝试了file://sales.csvfile:/sales.csv,但两者都失败了。

非常有帮助,请给我一些如何加载本地文件的建议。

Noted1:

  • 我的环境是亚马逊emr-4.2.0 + Spark 1.5.2。
  • 所有端口均已打开

Noted2:

我确认了来自HDFS或S3的加载文件正常工作

以下是从HDFS加载的代码 - 下载csv,提前复制到hdfs然后加载 sc.textFile(“/ path / at / hdfs”)

commands.getoutput('wget -q https://raw.githubusercontent.com/phatak-dev/blog/master/code/DataSourceExamples/src/main/resources/sales.csv')
commands.getoutput('hadoop fs -copyFromLocal -f ./sales.csv /user/hadoop/')
sc.textFile("/user/hadoop/sales.csv").count()  # returns "15" which is number of the line of csv file

以下是从S3加载的代码 - 事先将csv文件放在S3,然后使用 sc.textFile(“s3n:// path / at / hdfs”)加载“s3n:/ /“flag。

sc.textFile("s3n://my-test-bucket/sales.csv").count() # also returns "15" 

3 个答案:

答案 0 :(得分:10)

文件读取发生在执行程序节点上。为了使代码正常工作,您应该在所有节点上分发文件。

如果Spark驱动程序在文件所在的同一台机器上运行,您可以尝试读取文件(例如,使用f=open("file").read()进行python),然后调用sc.parallelize将文件内容转换为RDD。

答案 1 :(得分:3)

如果您在群集模式下运行,则需要在同一共享文件系统的所有节点上复制文件。然后spark会读取该文件,否则你应该使用HDFS

我将txt文件复制到HDFS中,spark从HDFS中获取文件。

我在所有节点的共享文件系统上复制了txt文件,然后激活读取该文件。

两者都为我工作

答案 2 :(得分:2)

我遇到了类似的问题,因为您尝试加载的数据必须可以在整个群集中访问(对于主数据库和执行程序),这是正确的。

我相信你的情况:/ command仍然试图从你的hadoop HDFS加载,这不存在,你可以使用以下命令测试这个

@inline(__always)

我通过从hdfs加载文件并从hdfs读取来解决这个问题,这里是代码:

hadoop fs -cat yourfile.csv