Spark编程模型经典解析(二)
创建RDD
方式一:从集合创建RDD
● makeRDD
● Parallelize
● 注意:makeRDD可以指定每个分区perferredLocations参数,parallelize则没有。
方式二:读取外部存储创建RDD
Spark与Hadoop完全兼容,所以对Hadoop所支持的文件类型或者数据库类型,Spark同样 支持。
● 多文件格式支持:
● 多文件系统支持:
1) 本地文件系统
2) S3
3) HDFs
数据库
1)jdbcRDD
2) spark-cassandra-connector(datastax/spark-cassandra-connector)
https://github.com/search?utf8=%E2%9C%93&q=spark-cassandra-connector&type=
3) org.apache.hadoop.hbase.mapreduce.TableInputFormat(SparkContext.newAPIHad oopRDD)
4) Elasticsearch-Hadoop
Transformation操作
惰性求值
● RDD 的转化操作都是惰性求值的。这意味着在被调用行动操作之前Spark 不会开始计算
● 读取数据到RDD的操作也是惰性的
● 惰性求值的好处:
Spark 使用惰性求值可以把一些操作合并到一起来减少计算数据的步骤。在类似 Hadoop
MapReduce 的系统中,开发者常常花费大量时间考虑如何把操作组合到一起,以减少
MapReduce 的周期数。
而在Spark 中,写出一个非常复杂的映射并不见得能比使用很多简单的连续操作获得好很多的性能。因此,用户可以用更小的操作来组织他们的程序,这样也使这些操作更容易管理。
转换操作
● RDD 的转化操作是返回新RDD 的操作
● 我们不应该把RDD 看作存放着特定数据的数据集,而最好把每个RDD 当作我们通过转化操作构建出来的、记录如何计算数据的指令列表。
解读:
基本转换操作1
解读:
Map:x=>x+1:每一个元素加1
Flatmap:x=>x.to(3):是 1到3,2到3,3到3,所以会有{1,2,3,2,3,3,3}
基本转换操作2
解读:
subtract:{1,2,3}和{3,4,5}.rdd.subtract(other)的时候,以{1,2,3}为准
有共同的元素就移除,如果没有共同的元素,但是不在{1,2,3}里面也要移除。
Cartesion:循环遍历
控制操作
● persist操作,可以将RDD持久化到不同层次的存储介质,以便后续操作重复使用。1)cache:RDD[T]
2)persist:RDD[T] 3)Persist(level:StorageLevel):RDD[T]
● Checkpoint操作
将RDD持久化到HDFS中,与persist操作不同的是checkpoint会切断此RDD之前的依赖关 系,而persist依然保留RDD的依赖关系。
Checkpoint:
就是建立检查点,类似于快照,例如在spark计算里面 计算流程DAG特别长,服务器需要将整个DAG计算完成得出结果,但是如果在这很长的计算流程中突然中间算出的数据丢失了,spark又会根据RDD的依赖关系从头到尾计算一遍,这样子就很费性能,当然我们可以将中间的计算结果通过cache或者persist放到内存或者磁盘中,但是这样也不能保证数据完全不会丢失,存储的这个内存出问题了或者磁盘坏了,也会导致spark从头再根据RDD计算一遍,所以就有了checkpoint,其中checkpoint的作用就是将DAG中比较重要的中间数据做一个检查点将结果存储到一个高可用的地方(通常这个地方就是HDFS里面)
Action操作
后续会有更详细的解读!!下篇博客准备中!!!