1.1 什么是 RDD?
RDD(Resilient Distributed Datasets):一个弹性分布式数据集, Spark中的基本抽象。(既可以放内存中也可以放磁盘中)
代表一个不变(只读)的、可以并行操作的元素的分区集合。
Spark中原生的RDD支持从以下三种方式创建:从scala集合中创建、从文件系统中创建、现有RDD的transform操作创建
1.1 RDD 特点有哪些?
1)分区集合:RDD是一个分区(partition)的集合,一个RDD有一个或多个分区。分区的数量决定了并行度。
2)计算函数以分区为单位:RDD在任务计算时是以分区为单位的,计算函数为compute函数。
3)RDD依赖于其他RDD:每个RDD都有依赖关系(源RDD的依赖关系为空),这些依赖关系成为lineage,可以通过toDebugString方法来获得lineage。
4)key-value 类型RDD的 Partitioner:对于非key-value类型的RDD,Partitioner为None,对于key-value类型的RDD,Partitioner默认为HashPartitioner。在进行shuffle操作时,如reduceByKey,sortByKey,Partitioner决定了父RDD shuffle的输出时对应的分区中的数据是如何进行map的。
5)分区支持数据本地性:Spark在进行任务调度时,会尝试将任务分配到数据所在的机器上,从而避免了机器间的数据传输。RDD获取优先位置的方法为getPreferredLocations。
1.2 RDD Transform & Action
Transform:
Transform 直译为“转换”,它表示一个 RDD 通过 transform 后,返回为一个新的 RDD。
例如:map、filter、flatMap、union、reduceByKey 等等
Action:
Action 直译为“行动”,它表示一个 RDD 通过 action 后,返回 一个数值,一组数值或者 Unit。
例如:reduce、count、saveAsTextFile、foreach 等等
1.3 lazy(惰性)执行
RDD 在进行 transform 操作时,并不会进行计算,只会记录 RDD 之间的转换关系,只有在进行 action 操作时,操作真正出发计算任务开始计算。
1.4 RDD cache/persist
RDD 允许缓存/持久化到内存或硬盘中,以便于重用。可以通过 cache 方法或是 persist 方法来缓存。
cache 方法无法指定缓存级别,只能缓存到内存中。persist 方法可以指定缓存级别,可以缓存到内存、硬盘或者两者都有。
1.5 先创建完文件,才可以进行这步的练习。可以看。关于HDFS的练习
1、
其textFile通过外部文件生成一个Rdd,是一个transform的操作。
生产中Rdd内容很大的情况下不可用collect。否则会出问题。会将内存搞崩。
其first 或者 collect 这些命令的执行,都是属于action操作。
2、
3、将文件拆成一个个单词。用flatMap()方法
对于生产出来的words 这个Rdd,也是属于MapPartitionsRDD[2]这个Rdd。
flatMap是一个transform的操作,因为没有进行计算,只是一个转换关系。
4、 再次查看words里面的内容
5、变成单词后,可以进行计数。计数前,需要调用map的一个操作。
6、现在可以对其键值对进行计数(reduceByKey也是一个transform操作)
在学习中,要先把Spark集群启动。先将用hdfs dfs -ls / 查看目录。(先启动start-master.sh start-slaves.sh)
2. 掌握 Spark DataSet/DataFrame/SQL 编程
3. 掌握 Spark Streaming 编程