RDD 的创建方式

RDD 的创建方式有四种:

1.使用程序中的集合创建 RDD,RDD 的数据源是程序中的集合,通过 parallelize 或者 makeRDD 将集合转化为 RDD;

*例


val num = Array(1,2,3,4,5,6)

val rdd = sc.parallelize(num)


2.使用本地文件或 HDFS 创建 RDD,RDD 的数据源是本地文件系统或 HDFS 的数据,使用 textFile 方法创建RDD。

*例

val rdd = sc.textFile(“hdfs://master:9000/abc/data”)

3.使用数据流创建 RDD,使用 Spark Streaming 的相关类,接收实时的输入数据流创建 RDD(数据流来源可以是 kafka、flume 等)。

*例


val ssc = new StreamingContext(conf, Seconds(1))

val lines = ssc.socketTextStream(“localhost”, 9999)

val words = lines.flatMap(_.split(“ ”))


4.使用其他方式创建 RDD,从其他数据库上创建 RDD,例如 Hbase、MySQL 等。

*例


val sqlContext = new SQLContext(sc)

val url = "jdbc:mysql://ip:port/xxxx"

val prop = new Properties()

val df = sqlContext.read.jdbc(url, “play_time”, prop)


RDD 的分区机制

RDD 的分区机制有两个关键点:一个是关键参数,即 Spark 的默认并发数 spark.default.parallelism;另一个是关键原则,RDD 分区尽可能使得分区的个数等于集群核心数目。

当配置文件 spark-default.conf 中显式配置了 spark.default.parallelism,那么 spark.default.parallelism=配置的值,否则按照如下规则进行取值:

1.本地模式(不会启动 executor,由 SparkSubmit 进程生成指定数量的线程数来并发)

spark-shell spark.default.parallelism = 1 spark-shell --master local[N] spark.default.parallelism = N (使用 N 个核) spark-shell --master local spark.default.parallelism = 1

2.伪集群模式(x 为本机上启动的 executor 数,y 为每个 executor 使用的 core 数,z 为每个 executor 使用的内存)

spark-shell --master local-cluster[x,y,z] spark.default.parallelism = x * y

3.Yarn、standalone 等模式

spark.default.parallelism = max(所有 executor 使用的 core 总数,2)

4.Mesos

spark.default.parallelism = 8

spark.context 会生成两个参数,由 spark.default.parallelism 推导出这两个参数的值:


sc.defaultParallelism     = spark.default.parallelism

sc.defaultMinPartitions  = min(spark.default.parallelism, 2)


当 sc.defaultParallelism 和 sc.defaultMinPartitions 确认后,就可以推算 RDD 的分区数了。

  • 以 parallelize 方法为例

val rdd = sc.parallelize(1 to 10)


如果使用 parallelize 方法时没指定分区数, RDD 的分区数 = sc.defaultParallelism

  • 以 textFile 方法为例

val rdd = sc.textFile(“path/file”)


分区机制分两种情况:

1.从本地文件生成的 RDD,如果没有指定分区数,则默认分区数规则为

rdd 的分区数 = max(本地 file 的分片数, sc.defaultMinPartitions)

2.从 HDFS 生成的 RDD,如果没有指定分区数,则默认分区数规则为:

rdd 的分区数 = max(hdfs 文件的 block 数目, sc.defaultMinPartitions)

/ RDD 的常用操作 /

RDD 支持两种类型的操作:转换(Transformation)和动作(Action),转换操作是从已经存在的数据集中创建一个新的数据集,而动作操作是在数据集上进行计算后返回结果到 Driver,既触发 SparkContext 提交 Job 作业。转换操作都具有 Lazy 特性,即 Spark 不会立刻进行实际的计算,只会记录执行的轨迹,只有触发行动操作的时候,它才会根据 DAG 图真正执行。

转换与动作具体包含的操作种类如下图所示:

hdfs支持分块存储吗_hdfs支持分块存储吗

图 5:转换操作

hdfs支持分块存储吗_spark_02

图 6:动作操作

最后我们通过一段代码来看看它具体的操作:

hdfs支持分块存储吗_spark_03

这段代码是用来计算某个视频被男性或女性用户的播放次数,其中 rdd_attr 用来记录用户性别,rdd_src 是用户对某个视频进行播放的记录,这两个 RDD 会进行一个 join 操作,比如这是某个男性用户对某个视频进行了播放,进行 map 操作之后得到视频 id 和性别作为 key,根据这个 key 做 reduceByKey 的操作,最终得到一个视频被男性/女性用户总共播放了多少次的 RDD,然后使用 combineByKey 合并同一个视频 id 的多个结果,最后保存到 HDFS 上。