本文主要打算对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. Writing a Discard Server

    Netty.docs: User guide for 4.x https://netty.io/wiki/user-guide-for-4.x.html

  2. JVM的CPU资源占用过高问题的排查

    互联网后端架构 https://mp.weixin.qq.com/s/LiqAy2DikbmZzqogb5XRdA JVM的CPU资源占用过高问题的排查 互联网后端架构  今天 上午线上某应用的一台J ...

  3. Hadoop_stack_cmd

    HDFS命令基本格式:Hadoop fs -cmd < args > HDFS命令基本格式:Hadoop fs -cmd < args > ls 命令 hadoop fs -l ...

  4. 武汉哪里有卖篮球架的 n-gram

    铜像雕塑哪里有加工厂华强北哪里可以解ID锁?我的苹果ipadmini2忘记屏幕密码了,刷机后需要原始appleID激活深圳小吃培训哪家好?东莞哪里有小吃培训的?禅城哪里有收纳箱专卖店?篷房就是帐篷吗? ...

  5. C++11 std::function、std::bind和lambda表达式

    参考博客: C++可调用对象详解-https://www.cnblogs.com/Philip-Tell-Truth/p/5814213.html 一.关于std::function与std::bin ...

  6. spark集成hivecontext配置

    spark版本:spark-1.6.0-bin-hadoop2.6hive版本:hive 1.2.1 1.hive-site.xml<property>  <name>hive ...

  7. 使用delphi 开发多层应用(十六)使用XMLRPC 实现basic4android 远程调用RTC服务(讲述了RTC的特点,其底层通讯协议是自己封装SOCK 库,与kbmmw 的适合场合不完全一样)

        RealThinClient (以下简称RTC) 也是一款delphi 多层开发的框架,由于其底层通讯协议是自己封装SOCK 库,抛弃了 大家诟病的indy,因此表现的非常稳定,效率也非常高, ...

  8. (C)strcpy ,strncpy和strlcpy的基本用法

    好多人已经知道利用strncpy替代strcpy来防止缓冲区越界. 但是如果还要考虑运行效率的话,也许strlcpy是一个更好的方式. 1. strcpy strcpy 是依据 /0 作为结束判断的, ...

  9. CentOS7.2编译GCC7.3

    1.环境 本文使用VMWare虚拟机进行实验. 4 核CPU, 4GB 内存,20GB 硬盘,CentOS 7.2 最小安装(CentOS-7-x86_64-Minimal-1511.iso) 2.需 ...

  10. ES6 数组的解构赋值

    数组的解构赋值 ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 以前,为变量赋值,只能直接指定值. let a = 1; let b = ...