本文主要打算对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解析的更多相关文章

  1. 大数据技术之_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 ...

  2. Spark Streaming揭秘 Day34 解析UI监听模式

    Spark Streaming揭秘 Day34 解析UI监听模式 今天分享下SparkStreaming中的UI部分,和所有的UI系统一样,SparkStreaming中的UI系统使用的是监听器模式. ...

  3. Android中XML文件的序列化生成与解析

    xml文件是非常常用的,在android中json和xml是非常常用的两种封装数据的形式,从服务器中获取数据也经常是这两种形式的,所以学会生成和解析xml和json是非常有用的,json相对来说是比较 ...

  4. Spark 序列化问题

    在Spark应用开发中,很容易出现如下报错: org.apache.spark.SparkException: Task not serializable at org.apache.spark.ut ...

  5. Android学习记录(1)—Android中XML文件的序列化生成与解析

    xml文件是非常常用的,在android中json和xml是非常常用的两种封装数据的形式,从服务器中获取数据也经常是这两种形式的,所以学会生成和解析xml和json是非常有用的,json相对来说是比较 ...

  6. Spark MLlib LDA 源代码解析

    1.Spark MLlib LDA源代码解析 http://blog.csdn.net/sunbow0 Spark MLlib LDA 应该算是比較难理解的,当中涉及到大量的概率与统计的相关知识,并且 ...

  7. Spark SQL源码解析(三)Analysis阶段分析

    Spark SQL原理解析前言: Spark SQL源码剖析(一)SQL解析框架Catalyst流程概述 Spark SQL源码解析(二)Antlr4解析Sql并生成树 Analysis阶段概述 首先 ...

  8. Spark SQL源码解析(四)Optimization和Physical Planning阶段解析

    Spark SQL原理解析前言: Spark SQL源码剖析(一)SQL解析框架Catalyst流程概述 Spark SQL源码解析(二)Antlr4解析Sql并生成树 Spark SQL源码解析(三 ...

  9. Spark SQL源码解析(五)SparkPlan准备和执行阶段

    Spark SQL原理解析前言: Spark SQL源码剖析(一)SQL解析框架Catalyst流程概述 Spark SQL源码解析(二)Antlr4解析Sql并生成树 Spark SQL源码解析(三 ...

随机推荐

  1. NameNode和JobTracker的网络接口

    Hadoop快速入门 http://hadoop.apache.org/docs/r1.0.4/cn/quickstart.html

  2. js对table操作(添加删除交换上下TR)

    <table width="100%" border="0" cellpadding="2" cellspacing="1& ...

  3. SyntaxError:Strict mode does not allow function declaration in a lexically nested statement.

    问题描述   使用react-native init创建了一个新项目,在package.json中使用的react-native的版本如下: "dependencies": { & ...

  4. Random 类生成随机数

    Random类 (java.util) Random类中实现的随机算法是伪随机,也就是有规则的随机.在进行随机时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要 ...

  5. html 常用转译空格字符

    本人有时候做表格强迫症,字段有的是3个字有的是4个字,也有两个字的,所有不对齐感觉看着难受, 因此需要用空格来让表头文字对齐,找到了下面几个常用的转译字符. 1.  &160#;不断行的空白( ...

  6. fuse的write过程到底是怎么样的,128KB的buffer怎么用?

    1. 在fuse/lib/fuse_kern_chan.c中有一个buffer设置 #define MIN_BUFSIZE 0x21000 //十进制132×1024  //为何不是128? 下面有一 ...

  7. 自定义android 音乐通知栏 ——可伸缩扩展

    Android custom notification for music player Example   In this tutorial, you will learn how to creat ...

  8. python利用mongodb上传图片数据 : GridFS 与 bson两种方式

    利用mongodb保存图片通常有两种方法,一种是将图片数据转化为二进制作为字典的键值对进行保存,另一种是利用mongodb提供的GridFS进行保存,两者各有利弊.性能方面的优劣未曾测试,无法进行评价 ...

  9. 在Ubuntu下获取Android4.0源代码并编译(一)

    搞了几个月的Android应用开发,勉强算是个Android开发者了吧,Android本就是开源的,还是把源代码下载下来自己编译一下,看看是个什么东西,出于好奇,和以后的职业发展,开始了无休止的And ...

  10. bzoj 1098 办公楼biu —— 链表+栈

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1098 首先,没有连边的人一定得在一个连通块里: 先把所有人连成一个链表,然后从第一个人开始, ...