我有一个问题 - 如何在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.csv
和 file:/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 回答
文件读取发生在执行程序节点上 . 为了使代码正常工作,您应该在所有节点上分发文件 .
如果Spark驱动程序在文件所在的同一台机器上运行,您可以尝试读取文件(例如,使用
f=open("file").read()
for python),然后调用sc.parallelize
将文件内容转换为RDD .如果以群集模式运行,则需要在同一共享文件系统的所有节点上复制文件 . 然后spark会读取该文件,否则你应该使用HDFS
我将txt文件复制到HDFS中,spark从HDFS中获取文件 .
我在所有节点的共享文件系统上复制了txt文件,然后激活读取该文件 .
两者都适合我
我遇到了类似的问题,因为您尝试加载的数据必须可以在整个群集中访问(对于主服务器和执行程序),这是正确的 .
我相信在你的情况下文件:/命令仍然试图从你的hadoop HDFS加载不存在,你可以通过使用以下命令测试
hadoop fs -cat yourfile.csv
我通过从hdfs加载文件并从hdfs读取来解决这个问题,这里是代码: