spark序列化及MapOutputTracker解析
本文主要打算对spark内部的序列化机制以及在shuffle map中起衔接作用的MapOutputTracker做一下剖析。主要涉及具体实现原理以及宏观设计的一些思路。
1,spark序列化
任何一个分布式框架,序列化都是其必不可少并且很重要一部分,spark也不例外。spark设计序列化的主要类以及之间的依赖包含关系如下图:
上图中,虚线表示依赖关系,而实线表示继承关系。各个类的解释如下:
a,SerializerManager可以认为是入口类,提供相关实现供外部序列化和反序列化时调用。
b,Serializer主要用来创建SerializerInstance,此类存在的作用主要是处理序列化过程中的多线程问题。
c,SerializationStream/DeSerializationStream具体做序列化,反序列化的抽象类。
此外,还包括以上抽象类的具体的两种序列化方式,java默认的序列化方式以及第三方library的kyro方式。spark默认采用java内生的序列化方式,但是kyro序列化方式能够提供更高的性能(有测试说10倍),所以建议修改序列化方式以优化性能。
2,MapOutputTracker解析
至于为什么要分析这个类,主要是因为在调研一个spark shuffledRDD的的prefer location的问题时碰到了,所以就决定深究一下。
在driver和executor端,MapOutputTracker对应的实现分别是MapOutputTrackerMaster和MapOutputTrackerWorker。总的来说,MapOutputTracker在spark shuffle过程中的map和reduce起着衔接作用。具体点就是:在shuffle map过程中,executor端MapOutputTrackerWorker会将task结束后产生的map状态上报给Driver端的MapOutputTrackerMaster,所以在MapOutputTrackerMaster端保存中spark在shuffle map过程中所有block的相关的详细(包括位置,block大小等信息)。在shuffle reduce的时候,通过读取MapOutputTrackerMaster中的这些位置大小信息,从而决定去远程或者本地fetch相关block数据。
下面就以上过程跟踪一下对应的源码。
a,在executor的任务结束以后,driver端的DAGSchuduler会进行相关处理,对应正常成功结束任务,其中要做的一个事情就是调用MapOutputTrackerMaster的registerMapOutputs方法,将当前shuffleId对应所有MapStatus保存到mapStatuses中。
b,在ShuffledRDD中,调用getPreferredLocations时,会调用MapOutputTracker中的getLocationsWithLargestOutputs函数,在函数中根据每个partition所在位置以及大小信息以及相关参数来决定当前shuffled RDD的perfer location。
此外,在shuffle reduce fetch数据时,也需要想MapOutputTrackerMaster发送GetMapOutputMessage消息,获取当前shuffle对应的map信息,这时driver端会将这些信息序列化以后发送给executor端。
3,小结
本文主要分析了一下spark中序列化的相关设计及主要类的作用。此外,还多shuffle过程中进行信息交互的MapOutTracker做了一下简要分析。尤其是序列化的设计,值得思考和借鉴。
spark序列化及MapOutputTracker解析的更多相关文章
- 大数据技术之_19_Spark学习_03_Spark SQL 应用解析 + Spark SQL 概述、解析 、数据源、实战 + 执行 Spark SQL 查询 + JDBC/ODBC 服务器
第1章 Spark SQL 概述1.1 什么是 Spark SQL1.2 RDD vs DataFrames vs DataSet1.2.1 RDD1.2.2 DataFrame1.2.3 DataS ...
- Spark Streaming揭秘 Day34 解析UI监听模式
Spark Streaming揭秘 Day34 解析UI监听模式 今天分享下SparkStreaming中的UI部分,和所有的UI系统一样,SparkStreaming中的UI系统使用的是监听器模式. ...
- Android中XML文件的序列化生成与解析
xml文件是非常常用的,在android中json和xml是非常常用的两种封装数据的形式,从服务器中获取数据也经常是这两种形式的,所以学会生成和解析xml和json是非常有用的,json相对来说是比较 ...
- Spark 序列化问题
在Spark应用开发中,很容易出现如下报错: org.apache.spark.SparkException: Task not serializable at org.apache.spark.ut ...
- Android学习记录(1)—Android中XML文件的序列化生成与解析
xml文件是非常常用的,在android中json和xml是非常常用的两种封装数据的形式,从服务器中获取数据也经常是这两种形式的,所以学会生成和解析xml和json是非常有用的,json相对来说是比较 ...
- Spark MLlib LDA 源代码解析
1.Spark MLlib LDA源代码解析 http://blog.csdn.net/sunbow0 Spark MLlib LDA 应该算是比較难理解的,当中涉及到大量的概率与统计的相关知识,并且 ...
- Spark SQL源码解析(三)Analysis阶段分析
Spark SQL原理解析前言: Spark SQL源码剖析(一)SQL解析框架Catalyst流程概述 Spark SQL源码解析(二)Antlr4解析Sql并生成树 Analysis阶段概述 首先 ...
- Spark SQL源码解析(四)Optimization和Physical Planning阶段解析
Spark SQL原理解析前言: Spark SQL源码剖析(一)SQL解析框架Catalyst流程概述 Spark SQL源码解析(二)Antlr4解析Sql并生成树 Spark SQL源码解析(三 ...
- Spark SQL源码解析(五)SparkPlan准备和执行阶段
Spark SQL原理解析前言: Spark SQL源码剖析(一)SQL解析框架Catalyst流程概述 Spark SQL源码解析(二)Antlr4解析Sql并生成树 Spark SQL源码解析(三 ...
随机推荐
- 小程序 swiper banner 图片 居中
var imgUrlApp = getApp().globalData.imgUrlApp; Page({ /** * 页面的初始数据 */ data: { indicatorDots: true, ...
- iframe 框架中 父子界面的JS调用
子界面调用父界面 window.parent.hello(); 父界面调用子界面 window.frmaes[i].hello();
- Linux Linker
文章原文:http://zhidao.baidu.com/link?url=U2Mtcc6BKi4vuQ1MO8U6s9gNm4y9Epphz03veA2lVpRWMozyVdj0PYvw1ZU9qj ...
- Spring Boot 整合Filter
两种方法 方法一: 正常创建好Filter类,配置完成 package clc.user.filter; import javax.servlet.Filter; import javax.servl ...
- linux 解决 Device eth0 does not seem to be present
在虚拟机中安装cent os系统,然后配置网络 执行命令ifconfig 没有看到eth0的信息: 重启网卡报错: service network restart Shutting down loop ...
- DEDE内容页调用栏目的SEO标题、描述、关键字的方法
上篇写了<dedecms栏目页调用栏目关键词.描述的方法>,本章雨田SEOER讲述DEDE内容页调用栏目的SEO标题.描述.关键字的方法内容页调用SEO标题:在<title>& ...
- 无限轮播器的bug修复
前言:上一回实现了轮播器的自动滚动,但是有两个需要处理的bug. 1.增加需求:当用手拖拽控制轮播器的时候,停止自动滚动. 2.当同一个页面中有tableView,textView或scrollvie ...
- 【扬中集训Day6T1】 白日梦
[题目描述] 白日梦 (daydream.c/cpp/pas) 时间限制: 1 s 空间限制: 256 MB 题目描述 SR需要相当大的睡眠量 某日,他做了一个奇怪的梦,他梦见自己成为了怪物猎人,为 ...
- .NETFramework:HttpContext
ylbtech-.NETFramework:HttpContext 1.返回顶部 1. #region 程序集 System.Web, Version=4.0.0.0, Culture=neutral ...
- webpack 工作方式
把你的项目当做一个整体,通过一个给定的主文件(如index.js),webpack将从这个文件开始找到你的项目的所有依赖文件,使用loaders处理它们,最后打包为一个或多个 浏览器可识别额javas ...