Spark Core

1.1 RDD概念

  1. 弹性分布式数据集合

    • 弹性 :分区

    • 分布式:使用多台服务器资源进行计算

    • 数据集合:类似于python列表类型

  2. RDD是spark中最基本的数据结构, 是一个抽象的内存数据

1.2 RDD特点

  1. 分区

    • RDD中的数据可以拆分成多份

    • 一个分区数据对应一个task线程任务, 一个task线程任务是由一个核执行

  2. 只读

    • RDD中的数据只能读取, 不能修改

    • 一旦修改RDD一定会创建一个新的RDD

  3. 依赖(血统)

    • 相邻RDD之间存储因果关系

    • 新RDD是由旧RDD计算得到

  4. 缓存

    • 保证容错性

    • 临时持久化

    • 存储到内存或本地磁盘中

    • 程序运行结束会被清空

  5. checkpoint

    • 保证容错性

    • 永久持久化

    • 存储到HDFS中(分块多副本)

    • 程序运行结束不会被清空

1.3 RDD创建

  1. sc.parallelize(c=python容器类型, numSlices=分区数)

  2. sc.textFile(name=路径, minPartitions=分区数)

    • 路径

      • 本地磁盘文件/目录路径 file://

      • HDFS文件/目录路径 hdfs://ip:8020/

    • 分区数:最小分区, 实际分区数有可能多一个

  3. sc.wholeTextFlies(name=路径, minPartitions=分区数)

    • 目录中有多个小文件场景

    • 合理分配资源

1.4 RDD算子

  1. 概念

    • 方法/函数

    • SparkCore提供了处理RDD的方法

  2. 分类

    • transformation算子

      • 转化算子, 返回一个新的rdd, 定义计算任务

      • rdd.map(f=自定义函数)

        • 将rdd的元素经过自定义函数处理, 将自定义函数的返回值保存到新的rdd中

        • 不会改变自定义函数的返回值结构

      • rdd.flatMap(f=自定义函数)

        • 将rdd的元素经过自定义函数处理, 将自定义函数的返回值进行拆分后保存到新的rdd中

        • 会改变自定义函数的返回值结构

        • tips:自定义函数返回值是迭代对象(容器类型)

      • rdd.mapValues(f=自定义函数)

        • 将k-v格式rdd的value值经过自定义函数处理, 将自定义函数的返回值保存到新的rdd中

      • rdd.filter(f=lambda 参数:参数条件判断)

        • 返回True对应的rdd的元素

      • rdd.distinct():去重

      • rdd.groupBy(f=自定义函数)

        • 自定义函数的返回值作为分组key值, 将相同key值对应的所有value值合并到一起, 返回一个k-v格式的rdd

      • rdd.groupByKey()

        • 对k-v格式的rdd中的key进行分组, 将相同key值对应的所有value值合并到一起, 返回一个k-v格式的rdd

      • rdd.reduceByKey(f=自定义函数/聚合函数)

        • 分组聚合操作

        • 对k-v格式的rdd中的key进行分组, 将相同key值对应的所有value值经过自定义函数进行聚合操作

      • rdd.sortByKey(ascending=,keyfunc=lambda x:x)

        • 对k-v格式的rdd根据key值进行排序操作

      • rdd.sortBy(keyfunc=自定义函数, ascending=)

        • 对k-v格式的rdd根据自定义函数的返回值进行排序操作

      • 关联算子

        • rdd1.join(other=rdd2)

        • rdd1.leftOuterJoin(other=rdd2)

        • rdd1.rightOuterJoin(other=rdd2)

        • rdd1.fullOuterJoin(other=rdd2)

    • action算子

      • 执行算子, 得到最终计算结果, 触发了计算任务

      • rdd.collect()

        • 收集rdd中所有元素

        • 考虑rdd数据量, 数据量大的话容易造成内存溢出

      • rdd.collectAsMap():将k-v格式rdd保存到字典中

      • rdd.take(num=):收集指定数量的rdd元素

      • rdd.takeordered(num=,key=):升序后收集指定数量的rdd元素

      • rdd.reduce(func=自定义函数/聚合函数):对非k-v格式rdd进行聚合操作

      • rdd.sum()/count()/mean()/max()/min() 

      • rdd.countByKey() :统计k-v格式rdd的key值出现的次数, 返回字典

      • rdd.countByValue():统计非k-v格式rdd的元素输出的次数, 返回字典

      • rdd.saveAsTextFile(path=)

        • 将rdd结果保存到文件中

        • path

          • 指定本地磁盘或hdfs目录路径

          • 注意:不存在的目录路径

1.5 RDD缓存和checkpoint

  1. 缓存

    • 概念

      • 将RDD数据存储在内存或本地磁盘中

    • 作用

      • 提高应用程序计算效率

      • 容错

    • 应用场景

      • 计算时间长的rdd

      • 计算成本高的rdd

      • 重复多次使用的rdd

    • 缓存级别

      • 决定RDD存储在哪个位置

      • 默认存储在内存中, 也可以设置存储在本地磁盘()

    • 使用

      • 定义缓存任务

      • rdd.persist(storageLevel=StorageLevel.MEMORY_ONLY)

      • rdd.cache()

    • 注意点

      • 程序运行结束会清空缓存rdd

      • 不会删除缓存rdd之间的依赖关系(缓存rdd可能丢失)

      • 通过action算子触发缓存任务, 没触发之前使用的rdd都是通过依赖关系计算得到

  2. checkpoint

    • 概念

      • 将RDD存储在HDFS上

    • 作用

      • 提高应用程序计算效率

      • 容错

    • 应用场景

      • 计算时间长的rdd

      • 计算成本高的rdd

      • 重复多次使用的rdd

    • 使用

      • 设置checkpoint存储路径 sc.setCheckpointDir()

      • 定义checkpoint任务:rdd.checkpoint()

    • 注意点

      • 程序运行结束不会清空checkpoint的rdd

      • 会删除checkpoint的rdd之间的依赖关系(HDFS数据不会丢失)

      • 通过action算子触发checkpoint任务, 没触发之前使用的rdd都是通过依赖关系计算得到

1.6 RDD依赖

  1. 概念

    • 相邻rdd之间存储因果关系

    • 新rdd是由旧rdd计算得到

  2. 分类

    • 窄依赖

      • 父rdd中的一个分区数据由子rdd中的一个分区使用

        • 一对一

        • 多对一

      • 算子

        • map

        • flatMap

        • filter

        • mapPartitions

    • 宽依赖

      • 父rdd中的一个分区数据由字段rdd中的多个分区使用

        • 一对多

      • 算子

        • groupBy

        • groupByKey

        • reduceByKey

        • sortBy

        • sortByKey

        • distinct

    • 管理

      • DAG有向无环图

      • DAG根据宽依赖关系划分计算步骤, 称为stage阶段

    • 为什么划分stage

      • spark应用程序的task是以线程方式进行多任务计算

      • 避免抢夺计算资源导致计算不准确问题

1.7 RDD内核调度流程

  1. schedulerbackend

    • 申请计算资源

    • 创建executor进程

    • 将task任务分发给executor进程

  2. DAGscheduler

    • 根据宽依赖划分stage阶段

    • 分析stage中task描述, 保存到taskSet

  3. Taskscheduler

    • 分配计算资源给task

    • 维护task和executor进程对应关系

    • 保证task执行顺序

1.8 spark 的shuffle

  1. 概念

    • 数据进行传递的过程

    • map阶段的数据传递给reduce阶段

  2. 什么时候发生shuffle: rdd之间存在宽依赖关系

  3. 分类

    • hashshuffle

      • 未优化

      • 优化后

    • sortshuffle

      • 普通模式(sort)

      • bypass模式(hash)

  4. 调优

    • 设置shuffle参数

    • 交互式

      • spark-submit --master yarn --deploy-mode cluster --conf key=value   a.py

    • 脚本式

      • conf = SparkConf().set('key', 'value')

      • sc = SparkContext(conf=conf)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值