当前位置:   article > 正文

【Spark】Spark读取本地与hdfs文件_打开虚拟机上传文件到hdfs, 使用spark读取hdfs文件

打开虚拟机上传文件到hdfs, 使用spark读取hdfs文件

目录

一、spark直接读取本地文件系统的文件(非常不方便,不建议使用)

1、file前缀地址“file:///”

二、本地文件系统的文件上传到HDFS系统

1、put命令

2、copyFromLocal命令

三、spark读写HDFS文件


一、spark直接读取本地文件系统的文件(非常不方便,不建议使用)

1、file前缀地址“file:///”

例1:绝对路径成功

  1. scala> val rdd=sc.textFile("file:///usr/lib/spark-2.0.0/README.md")
  2. rdd: org.apache.spark.rdd.RDD[String] = file:///usr/lib/spark-2.0.0/README.md MapPartitionsRDD[7] at textFile at <console>:24
  3. scala> rdd.first
  4. res3: String = # Apache Spark

说明:

(1)本地文件系统地址的前缀是“file:///”后边也必须是全部的绝对路径,不能用相对路径。

(2)所访问的文件必须在所有的节点上都存在一个一样的备份(路径和文件名称名一致,内容应该也一样?)。

本例子中,要加载的数据已经在spark工作目录,并且hadoop用户已经有访问权限。这在所有节点上是一致的。

例2:相对路径失败

  1. scala> val rdd=sc.textFile("file:///./README.md") //失败
  2. rdd: org.apache.spark.rdd.RDD[String] = file:///./README.md MapPartitionsRDD[19] at textFile at <console>:24
  3. scala> rdd.first
  4. org.apache.hadoop.mapred.InvalidInputException: Input path does not exist: file:/README.md

 说明:即便是绝对路径,而只在master上有的文件,spark也无法访问。

二、本地文件系统的文件上传到HDFS系统

1、put命令

例3:上传本地文件到用户在HDFS的默认目录

[hadoop@master dataset]$ hdfs dfs -put ./kinship/kinship.raw input

默认操作:

(1)在HDFS 的用户默认目录 hdfs://master:9000/user/hadoop/创建input目录,

(2)然后把kinship.raw 上传到该目录。

  1. [hadoop@master dataset]$ hdfs dfs -ls input
  2. -rw-r--r-- 3 hadoop supergroup 2666 2016-10-22 23:20 input

说明:

(1)目标地址里,如果是“input”和“/input”是不一样的。

前者的绝对地址是:hdfs://master:9000/user/hadoop/input

后者的绝对地址是:hdfs://master:9000/input

这是最本质的差别。

例4:如下

  1. [hadoop@master dataset]$ hdfs dfs -ls /user/hadoop/input/
  2. -rw-r--r-- 3 hadoop supergroup 2666 2016-10-22 23:20 /user/hadoop/input

2、copyFromLocal命令

例5:copyFromLocal

  1. [hadoop@master dataset]$ hdfs dfs -copyFromLocal ./kinship/kinship.raw input
  2. [hadoop@master dataset]$ hdfs dfs -ls /user/hadoop/input
  3. -rw-r--r-- 3 hadoop supergroup 2666 2016-10-22 23:26 /user/hadoop/input

三、spark读写HDFS文件

已经知道:HDFS的根目录是hdfs://master:9000/,用户默认的目录是hdfs://master:9000/user/hadoop/

例6:进入spark-shell,将RDD数据写入HDFS

  1. scala> val rdd1 = sc.parallelize(Seq(1, 2, 3, 4))
  2. rdd1: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[15] at parallelize at <console>:24
  3. scala> rdd1.saveAsTextFile("rdd1")

说明:

(1) 这里只给了一个相对路径"rdd1", 系统默认在hdfs的hdfs://master:9000/user/hadoop/目录下创建rdd1子目录,然后保存内容。

绝对路径就是 "hdfs://master:9000/user/hadoop/rdd1" ,这里的hadoop是hadoop的用户名,每个人的安装配置不一样,自然不一样,

user是固定的。

例7:读取HDFS数据

  1. scala> val rdd2 = sc.textFile("hdfs://master:9000/user/hadoop/rdd1")
  2. rdd2: org.apache.spark.rdd.RDD[String] = hdfs://master:9000/user/hadoop/rdd1 MapPartitionsRDD[18] at textFile at <console>:24
  3. scala> rdd2.collect # 这里不应该是rdd2.collect()?
  4. res12: Array[String] = Array(1, 2, 3, 4)

我自己的pyspark读取如下:

  1. from pyspark.sql import SparkSession
  2. spark = SparkSession \
  3. .builder \
  4. .appName("test pyspark") \
  5. .master("local") \
  6. .enableHiveSupport() \
  7. .getOrCreate()
  8. sc = spark.sparkContext
  9. # data = sc.textFile("michelle/README.md") # hdfs读取
  10. data = sc.textFile("file:///home/michelle/recsys_code/README.md") # 本地读取也可以
  11. data.count() # 4
  12. spark.stop()

例8:不写入用户默认目录,如果给定根目录符号 “/”,那么系统会在hdfs的根目录(hdfs://master:9000/)创建一个rdd3目录。

  1. scala> val rdd3 = sc.parallelize(Seq(4, 5, 6))
  2. rdd3: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[20] at parallelize at <console>:24
  3. scala> rdd3.saveAsTextFile("/rdd3")
  4. scala> val rdd4=sc.textFile("hdfs://master:9000/rdd3")
  5. rdd4: org.apache.spark.rdd.RDD[String] = hdfs://master:9000/rdd3 MapPartitionsRDD[23] at textFile at <console>:24
  6. scala> rdd3.collect
  7. res15: Array[Int] = Array(4, 5, 6)

参考:

Spark入门:读写文件 - 南北大侠无问东西的文章 - 知乎

by the way,还是有点不明白hdfs hadoop spark scala之间的关系,或许没有关系??疑惑

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/662977
推荐阅读
相关标签
  

闽ICP备14008679号