Pyspark - 加载文件:路径不存在

时间:2017-02-07 13:51:47

标签: apache-spark pyspark emr amazon-emr pyspark-sql

我是Spark的新手。我正在尝试读取EMR集群中的本地csv文件。该文件位于:/ home / hadoop /。我正在使用的脚本就是这个:

spark = SparkSession \
    .builder \
    .appName("Protob Conversion to Parquet") \
    .config("spark.some.config.option", "some-value") \
    .getOrCreate()\

df = spark.read.csv('/home/hadoop/observations_temp.csv, header=True)

运行脚本时会引发以下错误消息:

  

pyspark.sql.utils.AnalysisException:u'Path不存在:   HDFS://ip-172-31-39-54.eu-west-1.compute.internal:8020 /家庭/ hadoop的/ observations_temp.csv

然后,我发现我必须在文件路径中添加file://,以便它可以在本地读取文件:

df = spark.read.csv('file:///home/hadoop/observations_temp.csv, header=True)

但这一次,上述方法引发了一个不同的错误:

  

0.0级失去任务0.3(TID 3,
  ip-172-31-41-81.eu-west-1.compute.internal,executor 1):   java.io.FileNotFoundException:文件   file:/home/hadoop/observations_temp.csv不存在

我认为是因为文件//扩展只是在本地读取文件,而不是在其他节点上分发文件。

您知道如何阅读csv文件并将其提供给所有其他节点吗?

3 个答案:

答案 0 :(得分:9)

你的工作人员节点中缺少你的文件,这是正确的,这会引发你得到的错误。

以下是官方文档Ref. External Datasets

  

如果在本地文件系统上使用路径,则还必须可以在工作节点上的相同路径上访问该文件。将文件复制到所有工作者或使用网络安装的共享文件系统。

所以基本上你有两个解决方案:

在开始工作之前,将文件复制到每个工作人员中;

或者您将使用以下内容上传HDFS :(推荐的解决方案)

hadoop fs -put localfile /user/hadoop/hadoopfile.csv

现在您可以阅读:

df = spark.read.csv('/user/hadoop/hadoopfile.csv', header=True)

您似乎也在使用AWS S3。您可以随时尝试直接从S3读取它而不下载它。 (当然有适当的证书)

有人建议使用spark-submit提供的--files标记将文件上传到执行目录。我不推荐这种方法,除非你的csv文件非常小但是你不需要Spar。

或者,我会坚持使用HDFS(或任何分布式文件系统)。

答案 1 :(得分:0)

我认为您缺少的是在初始化SparkSession时显式设置主节点,请尝试类似的操作

spark = SparkSession \
    .builder \
    .master("local") \
    .appName("Protob Conversion to Parquet") \
    .config("spark.some.config.option", "some-value") \
    .getOrCreate()

然后以与您以前相同的方式读取文件

df = spark.read.csv('file:///home/hadoop/observations_temp.csv')

这应该可以解决问题...

答案 2 :(得分:0)

可能对使用 Docker 在 mac 上运行 zeppelin 的人有用。

  1. 将文件复制到自定义文件夹:/Users/my_user/zeppspark/myjson.txt

  2. docker run -p 8080:8080 -v /Users/my_user/zeppspark:/zeppelin/notebook --rm --name zeppelin apache/zeppelin:0.9.0

  3. 在 Zeppelin 上,您可以运行它来获取您的文件:

%pyspark

json_data = sc.textFile('/zeppelin/notebook/myjson.txt')