spark初级篇

spark初级篇(上)

  1. 什么是RDD?

    RDD(Resilient[弹回的有弹力的] Distributed Dataset)是一个分布式弹性数据集,是spark对数据的核心抽象

  2. RDD的属性?

    ①一组分片

    ②一个/每个分区的计算函数(算子)一个分区一个算子 并行计算

    ③RDD的依赖关系 通过装换生成新的RDD 而原有的RDD不变

    ④一个partitioner只有key value 的数据才有的partitioner默认是hash

    ⑤一个列表:这个列表保存的是每个partition所在的位置

  3. rdd的分片个数?

    • 默认和CPU个数相同
    • 用户自己指定
    • 从HDFS获取数据,和块的个数相同
    • 从kafka获取数据,和kafka partition个数相同
  4. 如何创建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”)

  5. 算子分为?区别?

    (一)Transformation转换算子:
    ①不会立刻执行,是一个延时执行。遇到它的最后的action算子之后,才执行。
    如果不这样设计,每算一步,数据都得落地,这样影响运行的速度,
    如果这些rdd的某些partition的是在同一个节点上执行了多个转换操作,内部有优化机制,
    会对它们做计算的合并,进一步的减少中间结果,提高性能。
    ②一般来说,转换算子都是生成一个新的rdd。
    (二)Action算子:
    ①立刻执行的,当spark程序遇到action算子就会启动一个计算的job。
    ②一个rdd通过action算子之后,肯定不会再变成一个新的rdd了,要么就把结果打印出来了,
    要么就返回一个list输出,甚至写入外部存储介质,hdfs,mysql。

  6. 总结常用的算子。(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进行更新。
  7. spark重分区算子?使用场景分别是什么?

    • repartition(增大)

      如果想要增加rdd的分区,必须使用带有shuffle的重分区方式,repartition/coalesce(num, true)

    • coalesce(减少 合并)

      如果想要减少rdd的分区,可以不使用带有shuffle的重分区方式,coalesce(num, false)

  8. 分区的个数有什么意义?

    决定与我们的并行算,rdd是并行计算,每个分区都会运行一个task,并行度不是越高越好。

  9. 什么是宽依赖,窄依赖?宽依赖的算子有哪些?

    窄依赖是指父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
  10. spark持久化算子?

    • persist算子:
    • cache算子:
    • checkpoint算子:可以把rdd持久化到HDFS(容错)
  11. reducebykey和groupbykey的区别?

    操作的都是K-V类型,对相同的key的数据、进行聚合操作,但是相比于groupByKey,reduceBykey因为有聚合的操作,
    具体的实现细节是,先在上一级的rdd里面的每一个partition里面,先对相同key值的数据做局部的聚合,再把局部聚合的结果,
    最终做全局的聚合,如果用groupByKey,然后再用类似reduce的操作,就不会先在本地聚合,性能就没有reduceByKey好。

  12. spark的容错?

    • lineAge (血缘)
    • checkpoint
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值