Spark

Spark

主流框架比较

功能指标 Storm Spark Flink
处理模式 native micro-batching native
消息保障 至少一次 有且一次 有且一次
实时性 低延迟,亚秒级 高延迟,秒级 低延迟,亚秒级
吞吐量
流量控制 不支持 支持 支持
容错方式 record ack rdd based check point check point

主要原理

  • Apache Storm

    • 在Storm中,需要一个实时的计算结构,称为拓扑。
    • 拓扑结构提交给集群。
    • 主节点给工作节点分配代码,工作节点负责执行代码。
    • 拓扑结构包含spout和bolt:
      • spout发送tuple元组形式的数据流。
      • bolt负责转换数据流。
  • Apache Spark

    • Spark Stream,核心Spark API的扩展,按时间间隔对数据流进行分段切分。
    • Spark针对连续数据流的抽象称为DStream,是小批量处理的RDD。
    • RDD是弹性分布式数据集,可用通过任意函数和窗口计算进行转换,实现并行操作。
  • Apach Flink

    • 针对流数据+批处理的计算框架。
    • 批数据看作流数据的特例,延迟性较低,能够保证消息传输不丢失不重复。

Spark调度流程

  • SparkContext通过RDD对象构建DAG图。
  • DAGScheduler把DAG划分stage,stage以taskset为单位提交给TaskScheduler。
  • TaskScheduler把task发给集群中的Worker的Executor。
    • 哪个task先完成就用哪个task的结果。
    • TaskScheduler都会向DAGScheduler汇报状态,stage运行失败TaskScheduler可能会通知DAGScheduler重新提交数据。
  • Work接收到的是task,执行task的是进程中的线程,多个线程处理多个数据分片,执行task,读取或存储数据。

如何划分stage

  • 从当前job的最后一个算子往前推,遇到宽依赖就断开,划分为一个stage;遇到窄依赖就将这个RDD加入到该stage中。
  • 宽依赖:1个父RDD分区对应1个子RDD分区。
  • 窄依赖:1个父RDD分区对应N个子RDD分区。

Spark算子

  • 转换算子(延迟执行)
    • map
    • flatMap
    • ReduceByKey
  • 行动算子(触发执行)
    • count:返回数据集中的元素数。
    • take(n):返回数据集前n个元素的集合。
    • collect:将计算结果回收到Driver端。
  • 控制算子
    • cache:将RDD的数据持久化到内存中。
    • persist:指定持久化的级别。
    • checkpont:持久化RDD到磁盘,切断RDD之间的依赖关系。

数据倾斜

  • 后果
    • 分布式程序运行的速度由最慢的task决定。
    • 过多的数据在同一个task中执行,撑爆executor,造成OOM。
  • 原因
    • 数据问题
      • key本身分布不均匀
      • key的设置不合理
    • 使用问题
      • shuffle时的并发度不够
      • 计算方式有误
  • 解决方法
    • 数据问题
      • 过滤空值或无效数据
      • 异常数据过滤出来单独处理,最后与正常数据的处理结果union
      • key添加随机值,操作后去掉随机值
    • spark使用不当
      • 提高shuffle并行度
      • map join代替reduce join避免shuffle
posted @ 2020-09-05 21:48  樱空废宅  阅读(147)  评论(0)    收藏  举报