微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Spark编程模型

=============

RDD

MapReduce的不足:
计算之间数据共享只有一个办法,写入到文件系统如hdfs,引入了磁盘IO,序列化等开销,从而占据了大部分的执行时间。

RDD:

  • 更强的容错性,如通过数据集的血统,如通过两个父集join,map,filter出子集,可以快速恢复慢节点或某个分区的数据
  • 在并行阶段高效的进行数据共享,减少IO开销

RDD类型

  • 创建操作,从内存或外部系统创建,或转换操作生成新的rdd
  • 转换操作,惰性操作,只是定义了一个新的RDD,并没有立即执行
  • 控制操作,进行RDD持久化,保存在内存或磁盘中,避免二次计算
  • 行动操作,触发Spark运行的操作,如collect,count,或将rdd保存到外部文件系统或数据库

RDD实现

1)作业调度

  • 当对RDD进行转换操作时,调度器会根据RDD的血统来构建若干调度阶段(Stage)组成有向无环图(DAG),每个调度阶段包含尽可能多的连续窄依赖转换。
  • 延时调度机制,分配任务时根据数据存储位置来把任务分配给较佳位置的节点,如需要处理的某个分区刚好存储在某个节点的内存中,则该任务会分配给该节点。
  • 以宽依赖划分Stage

    dataset1 = a group by a.biz_code 【group宽依赖】
    dataset2 = b.map(_.*) union c 【b map 操作为窄依赖, union 也是窄依赖】
    finaldataset = dataset1 join dataset2 on id 【join操作为宽依赖】

判断是宽依赖还是窄依赖:子集数据的分区仅从父集数据的某一个分区而来就是窄依赖,否则为宽依赖,如map操作,将一行数据 进行转换操作,生成一行新的数据,这就是窄依赖

上述代码可以划分为3个阶段

stage1: group by
stage2: map + union,虽然这两个操作都是窄依赖,但是结果将与stage1进行join,因此单独一个stage
stage3: join 

只要父数据集还在,就可以快速、并行的计算出丢失的分区

内存管理

3种存储策略

  • 未序列化Java对象在内存中
  • 序列化的数据存于内存中
  • 存储在磁盘中

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐