spark初级篇(上)
-
什么是RDD?
RDD(Resilient[弹回的有弹力的] Distributed Dataset)是一个分布式弹性数据集,是spark对数据的核心抽象
-
RDD的属性?
①一组分片
②一个/每个分区的计算函数(算子)一个分区一个算子 并行计算
③RDD的依赖关系 通过装换生成新的RDD 而原有的RDD不变
④一个partitioner只有key value 的数据才有的partitioner默认是hash
⑤一个列表:这个列表保存的是每个partition所在的位置
-
rdd的分片个数?
- 默认和CPU个数相同
- 用户自己指定
- 从HDFS获取数据,和块的个数相同
- 从kafka获取数据,和kafka partition个数相同
-
如何创建rdd?
①由一个已经存在的Scala集合创建。
val rdd1 sc.parallelize(Array(1,2,3,4,5,6,7,8))②由外部存储系统的数据集创建,包括本地的文件系统,还有所有Hadoop支持的数据集,比如HDFS、Cassandra、HBase等
val rdd2 sc.textFile(“hdfs://beicai01:9000/words.txt”) -
算子分为?区别?
(一)Transformation转换算子:
①不会立刻执行,是一个延时执行。遇到它的最后的action算子之后,才执行。
如果不这样设计,每算一步,数据都得落地,这样影响运行的速度,
如果这些rdd的某些partition的是在同一个节点上执行了多个转换操作,内部有优化机制,
会对它们做计算的合并,进一步的减少中间结果,提高性能。
②一般来说,转换算子都是生成一个新的rdd。
(二)Action算子:
①立刻执行的,当spark程序遇到action算子就会启动一个计算的job。
②一个rdd通过action算子之后,肯定不会再变成一个新的rdd了,要么就把结果打印出来了,
要么就返回一个list输出,甚至写入外部存储介质,hdfs,mysql。 -
总结常用的算子。(10个以上)
Transformation:
转换 含义 map(func) 返回一个新的RDD,该RDD由每一个输入元素经过func函数转换后组成 filter(func) 返回一个新的RDD,该RDD由经过func函数计算后返回值为true的输入元素组成 flatMap(func) 类似于map,但是每一个输入元素可以被映射为0或多个输出元素(所以func应该返回一个序列,而不是单一元素) mapPartitions(func) 类似于map,但独立地在RDD的每一个分片上运行,因此在类型为T的RDD上运行时,func的函数类型必须是Iterator[T] => Iterator[U] mapPartitionsWithIndex(func) 类似于mapPartitions,但func带有一个整数参数表示分片的索引值,因此在类型为T的RDD上运行时,func的函数类型必须是 (Int, Interator[T]) => Iterator[U] sample(withReplacement, fraction, seed) 根据fraction指定的比例对数据进行采样,可以选择是否使用随机数进行替换,seed用于指定随机数生成器种子 union(otherDataset) 对源RDD和参数RDD求并集后返回一个新的RDD intersection(otherDataset) 对源RDD和参数RDD求交集后返回一个新的RDD distinct([numTasks])) 对源RDD进行去重后返回一个新的RDD groupByKey([numTasks]) 在一个(K,V)的RDD上调用,返回一个(K, Iterator[V])的RDD reduceByKey(func, [numTasks]) 在一个(K,V)的RDD上调用,返回一个(K,V)的RDD,使用指定的reduce函数,将相同key的值聚合到一起,与groupByKey类似,reduce任务的个数可以通过第二个可选的参数来设置 aggregateByKey(zeroValue)(seqOp, combOp, [numTasks]) 第一个参数是, 每个key的初始值
第二个是个函数, Seq Function, 经测试这个函数就是用来先对每个分区内的数据按照key分别进行定义进行函数定义的操作
第三个是个函数, Combiner Function, 对经过 Seq Function 处理过的数据按照key分别进行进行函数定义的操作sortByKey([ascending], [numTasks]) 在一个(K,V)的RDD上调用,K必须实现Ordered接口,返回一个按照key进行排序的(K,V)的RDD sortBy(func,[ascending], [numTasks]) 与sortByKey类似,但是更灵活 join(otherDataset, [numTasks]) 在类型为(K,V)和(K,W)的RDD上调用,返回一个相同key对应的所有元素对在一起的(K,(V,W))的RDD cogroup(otherDataset, [numTasks]) 在类型为(K,V)和(K,W)的RDD上调用,返回一个(K,(Iterable,Iterable))类型的RDD cartesian(otherDataset) 笛卡尔积 Action
动作 含义 reduce(func) 通过func函数聚集RDD中的所有元素,这个功能必须是课交换且可并联的 collect() 在驱动程序中,以数组的形式返回数据集的所有元素 count() 返回RDD的元素个数 first() 返回RDD的第一个元素(类似于take(1)) take(n) 返回一个由数据集的前n个元素组成的数组 takeSample(withReplacement,num, [seed]) 返回一个数组,该数组由从数据集中随机采样的num个元素组成,可以选择是否用随机数替换不足的部分,seed用于指定随机数生成器种子 takeOrdered(n, [ordering]) saveAsTextFile(path) 将数据集的元素以textfile的形式保存到HDFS文件系统或者其他支持的文件系统,对于每个元素,Spark将会调用toString方法,将它装换为文件中的文本 saveAsSequenceFile(path) 将数据集中的元素以Hadoop sequencefile的格式保存到指定的目录下,可以使HDFS或者其他Hadoop支持的文件系统。 saveAsObjectFile(path) countByKey() 针对(K,V)类型的RDD,返回一个(K,Int)的map,表示每一个key对应的元素个数。 foreach(func) 在数据集的每一个元素上,运行函数func进行更新。 -
spark重分区算子?使用场景分别是什么?
-
repartition(增大)
如果想要增加rdd的分区,必须使用带有shuffle的重分区方式,repartition/coalesce(num, true)
-
coalesce(减少 合并)
如果想要减少rdd的分区,可以不使用带有shuffle的重分区方式,coalesce(num, false)
-
-
分区的个数有什么意义?
决定与我们的并行算,rdd是并行计算,每个分区都会运行一个task,并行度不是越高越好。
-
什么是宽依赖,窄依赖?宽依赖的算子有哪些?
窄依赖是指父RDD的每个分区只被子RDD的一个分区所使用,子RDD分区通常对应常数个父RDD分区(O(1),与数据规模无关)
相应的,宽依赖是指父RDD的每个分区都可能被多个子RDD分区所使用,子RDD分区通常对应所有的父RDD分区(O(n),与数据规模有关)
简单来说, 就是窄依赖是一对一或者多对一, 宽依赖就是多对多或者一对多
宽依赖:reduceByKey groupByKey sortBy sortByKey join leftOuterJoin rightOuterJoin fullOuterJoin
distinct cogroup repatition- bykey的算子
- 部分join算子
- repartition cartesian
-
spark持久化算子?
- persist算子:
- cache算子:
- checkpoint算子:可以把rdd持久化到HDFS(容错)
-
reducebykey和groupbykey的区别?
操作的都是K-V类型,对相同的key的数据、进行聚合操作,但是相比于groupByKey,reduceBykey因为有聚合的操作,
具体的实现细节是,先在上一级的rdd里面的每一个partition里面,先对相同key值的数据做局部的聚合,再把局部聚合的结果,
最终做全局的聚合,如果用groupByKey,然后再用类似reduce的操作,就不会先在本地聚合,性能就没有reduceByKey好。 -
spark的容错?
- lineAge (血缘)
- checkpoint