sc.textFile()默认读取本地系统文件还是HDFS系统文件?

Posted howard2005

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sc.textFile()默认读取本地系统文件还是HDFS系统文件?相关的知识,希望对你有一定的参考价值。

文章目录

一、Spark集群拓扑

二、做好准备工作

(一)准备本地系统文件

  • /home目录里创建test.txt

(二)准备HDFS系统文件

  • test.txt上传到HDFS系统的/park目录里

(三)启动HDFS服务

  • 执行命令:start-dfs.sh

三、以–master=local[*]方式启动spark-shell

(一)尝试读取本地系统文件和HDFS系统上的文件

  • --master=local[*]方式启动spark-shell

1、读取本地系统/home/test.txt文件创建RDD,不加file://

  • 执行命令:val rdd = sc.textFile("/home/test.txt")
  • 执行命令:rdd.collect(),查看RDD的内容

2、读取本地系统/home/test.txt文件创建RDD,加上file://

  • 执行命令:val rdd = sc.textFile("file:///home/test.txt")
  • 执行命令:rdd.collect(),查看RDD的内容
  • 执行命令::quit,退出spark-shell

3、读取HDFS系统上的文件/park/test.txt,不加hdfs://master:9000

  • 执行命令:val rdd = sc.textFile("/park/test.txt")
  • 执行命令:rdd.collect(),查看RDD的内容
  • 报错,因为读取的不是HDFS系统上的文件/park/test.txt,而是本地系统文件/park/test.txt,显然这个文件是不存在的

4、读取HDFS系统上的文件/park/test.txt,加上hdfs://master:9000

  • 执行命令:val rdd = sc.textFile("hdfs://master:9000/park/test.txt")
  • 执行命令:rdd.collect(),查看RDD的内容

(二)根据上述尝试得到结论

  • --master=local[*]方式启动spark-shell,sc.textFile()默认读取本地系统文件,比如sc.textFile("/home/test.txt")就相当于sc.textFile("file:///home/test.txt"),要访问HDFS系统上的/park/test.txt,必须要写成sc.textFile("hdfs://master:9000/park/test.txt")

四、以–master=spark://master:7077方式启动spark-shell

(一)尝试读取本地系统文件和HDFS系统上的文件

  • --master=spark://master:7077方式启动spark-shell

1、读取本地系统/home/test.txt文件创建RDD,不加file://

  • 执行命令:val rdd = sc.textFile("/home/test.txt")
  • 执行命令:rdd.collect(),查看RDD的内容
  • 报错,因为读取的是HDFS系统上的文件/home/test.txt,文件不存在

2、读取本地系统/home/test.txt文件创建RDD,加上file://

  • 执行命令:val rdd = sc.textFile("file:///home/test.txt")
  • 执行命令:rdd.collect(),查看RDD的内容
  • 报错,加上file://,依然说文件/home/test.txt不存在

3、读取HDFS系统上的文件/park/test.txt,不加hdfs://master:9000

  • 执行命令:val rdd = sc.textFile("/park/test.txt")
  • 执行命令:rdd.collect(),查看RDD的内容

4、读取HDFS系统上的文件/park/test.txt,加上hdfs://master:9000

  • 执行命令:val rdd = sc.textFile("hdfs://master:9000/park/test.txt")

  • 执行命令:rdd.collect(),查看RDD的内容

  • 执行命令::quit,退出spark-shell

(二)根据上述尝试得出结论

  • --master=spark://master:7077方式启动spark-shell,sc.textFile()不能访问本地系统文件,只能读取HDFS系统文件,对于文件/park/test.txt,必须写成hdfs://master:9000/park/test.txt才能访问,否则会报错。

五、小结

  • 如果以 spark-shell --master spark://master:7077方式启动spark-shell,只能读取HDFS系统上的文件,不能读取本地系统文件,而以spark-shell --master=local[*]方式启动spark-shell,既可以读取本地系统文件,加不加file://都可以,还可以访问HDFS系统上的文件,但是必须加上hdfs://master:9000

以上是关于sc.textFile()默认读取本地系统文件还是HDFS系统文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何将hdfs里某一目录下的所有文件的文件名读取出来

使用 sc.textFile() 加载本地文件以触发

Spark RDD 操作实战之文件读取

2RDD编程

Spark 使用 sc.textFile ("s3n://...) 从 S3 读取文件

spark配置