首页 文章

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

提问于
浏览
14

我有一个问题 - 如何在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次,最近失败:阶段3.0中丢失任务0.3(TID 10,ip-17x-xx-xx-xxx.ap -northeast-1.compute.internal):java.io.FileNotFoundException:文件文件:/sales.csv不存在

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

你给我一些如何加载本地文件的建议是非常有帮助的 .


注意1:

  • 我的环境是亚马逊emr-4.2.0 Spark 1.5.2 .

  • 所有端口都已打开


注2:

我确认了HDFS或S3 works 的加载文件 .

这是从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加载的代码 - 提前将S3放入csv文件,然后使用带有"s3n://"标志的 sc.textFile("s3n://path/at/hdfs") 加载 .

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

3 回答

  • 1

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

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

  • 9

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

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

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

    两者都适合我

  • 3

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

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

    hadoop fs -cat yourfile.csv

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

    var conf = new org.apache.hadoop.conf.Configuration();     
    var fs = org.apache.hadoop.fs.FileSystem.get(conf); 
    var filenamePath = new org.apache.hadoop.fs.Path("myfile.json");  
    
       if (fs.exists(filenamePath))
       {
           fs.delete(filenamePath, true);
       }
    
       var fin = fs.create(filenamePath);
       fin.writeBytes(html);
       fin.close();
    
    val metOffice = sql.read.json("myfile.json")
    

相关问题