进行 Spark 核心编程时,首先要做的第一件事就是创建一个初始 RDD。
该 RDD 中,通常就代表和包含了 Spark 应用程序的输入源数据。
然后创建了初始的 RDD 之后,才可以通过 Spark Core 提供的 transformation 算子,对该 RDD 进行转换,来获取其他 RDD。
Spark Core 提供了三种创建 RDD 的方式,包括:使用程序中的集合创建 RDD;使用 本地文件创建 RDD;使用 HDFS 文件创建 RDD。
个人认为:
(1)使用程序中的集合创建 RDD,主要用于测试,可以实际部署到集群运行之前,自己使用集合构造测试数据,来测试后面的 Spark 应用的流程。
(2)使用本地文件创建 RDD,主要用于临时性地处理一些存储了大量数据的文件
(3)使用 HDFS 文件创建 RDD,应该是最常用的生成环境处理方式,主要可以针对 HDFS 上存储的大数据,进行离线批处理操作
一、并行化集合创建 RDD
调用 SparkContext 中的 parallelize() 方法。 Spark 会将集合中的数据拷贝到集群上去,形成一个分布式的数据集合,也就是一个 RDD。集合中的一部分数据会在一个节点上,另外一部分数据会在另外一些节点上。
val arr = Array(1,2,3,4,5,6)
val rdd = sc.parallelize(arr)
val sum = rdd.reduce(_+_)
调用 parallelize() 方法,有一个重要的参数可以指定,就是要将集合切分成多少个 partition。 Spark 会为每一个 partition 运行一个 task 来处理。 Spark 官方的建议是,为集群中的每个 CPU 创建 2 ~ 4 个 partition。Spark 默认会根据集群的情况来设置 partition 数量。但是也可以在调用 parallelize() 方法时,传入第二个参数,来指定 RDD 的partition 数量。比如 parallelize(arr,10)
二、使用本地文件和 hdfs 文件来创建rdd
Spark 是支持使用任何 Hadoop 支持的存储系统上的文件创建 RDD 的,比如说 HDFS、Cassandra、HBase 以及本地文件。通过调用 SparkContext.textFile() 方法,可以针对本地文件或者 HDFS 文件创建 RDD。
有几个事项需要注意的:
(1)如果是针对本地文件的话,如果是在 Windows 本地测试,Windows 上有一份文件即可;如果是在 Spark 集群上针对 linux 本地文件,那么需要将文件拷贝到所有的 worker 节点上。
(2)Spark 的 textFile() 方法支持针对目录、压缩文件以及通配符进行 RDD 的创建
(3)Spark 默认会为 hdfs 文件的每一个 block 创建一个 partition,但是也可以通过 textFile() 的第二个参数手动设置分区数量,只能比 block 数量多,不能比 block 数量少。
val rdd = sc.textFile("d://data.txt")
val wordCount = rdd.map(line => line.length).reduce(_+_)