Spark Tungsten揭秘 Day2

Tungsten-sort Based Shuffle

今天在对钨丝计划思考的基础上,讲解下基于Tungsten的shuffle。

首先解释下概念,Tungsten-sort是对普通sort的一种优化,排序的不是内容本身,而是内容序列化后字节数组的指针(元数据),把数据的排序转变为了指针数组的排序,实现了直接对序列化后的二进制数据进行排序。由于直接基于二进制数据进行操作,所以在这里面没有序列化和反序列化的过程。内存的消耗大大降低,相应的,会极大的减少的gc的开销。

Page的管理

要做到这种,jvm的内存管理结构无法完成,所以提出了Page的概念。

Page是由block组成的,我们先看一下Block的结构,可以看到,除了记录page编号外,Block内部组成是MemoryLocation。

在MemoryLocation中,重要的就是记录了对象及初始位置的定位offset。实际运行可以onheap或者offheap(用NIO或者Tachyon管理)。

在shuffle角度,都是统一在SortShuffleManager中进行构造。可以看到,在如下位置构造了UnsafeShuffleWriter,但没有UnsafeShuffleReader,从Tungsten角度讲,reader使用的是HashShuffleReader。

从注释中,可以看到数据一旦进来,就使用shuffle write进行序列化,在序列化的二进制基础上进行排序,这样就可以减少内存的GC。这种优化需要我们的序列化器可以在不反序列化的情况下重新排序。

数据写入

让我们进入UnsafeShuffleWriter

会通过MyByteArrayOutputStream直接对内存操作

在write方法中,会循环记录,写入Sorter。

其中,serBuffle默认大小是1M,而且已经是序列化之后的数据了。

在插入前,首先会分配内存,之后会根据每条数据,采用游标的方式进行遍历,并计算找到recordAddress,完成插入操作。

在内存分配时,会有两种分配方式UNSAFE和HEAP,内部各有一套自己的内存评估机制

此外,recordAddress是有一套自己的编解码方式。

最终在插入时,仅仅是存放了一个RecordPointer,也就是数据指针。

小结

在具体插入操作的时候,以Page为核心单位,从Page角度讲,插入记录的时候,本身也有location和大小,需要找到page中指针的位置。在整个内存中有多个Page,每个Page有限定的大小,满了之后会分配下一个Page。从jvm角度讲,最底层的数据结构是字节数组,所以outputStream和序列化都是对字节数组来操作的。进行shuffle操作的时候,实际是对指针进行操作,这是没有序列化和反序列化的关键。数据量也少,所以内存使用率低,大大减少了GC。

最后,说明下,即使配置了Tungsten shuffle,在一些情况也会自动变成sort-based shuffle,从数据结构角度讲,限制蛮多,记录不能太大,单条记录不能超过128M,shuffle的时候中间过程不能产生太多的小文件,不能超过160W,aggregation或者输出后需要排序的操作也不可以。

欲知后事如何,且听下回分解!

DT大数据每天晚上20:00YY频道现场授课频道68917580

Spark Tungsten揭秘 Day2 Tungsten-sort Based Shuffle的更多相关文章

  1. Spark技术内幕:Sort Based Shuffle实现解析

    在Spark 1.2.0中,Spark Core的一个重要的升级就是将默认的Hash Based Shuffle换成了Sort Based Shuffle,即spark.shuffle.manager ...

  2. Spark Sort Based Shuffle内存分析

    分布式系统里的Shuffle 阶段往往是非常复杂的,而且分支条件也多,我只能按着我关注的线去描述.肯定会有不少谬误之处,我会根据自己理解的深入,不断更新这篇文章. 前言 借用和董神的一段对话说下背景: ...

  3. Spark-1.6.0中的Sort Based Shuffle源码解读

    从Spark-1.2.0开始,Spark的Shuffle由Hash Based Shuffle升级成了Sort Based Shuffle.即Spark.shuffle.manager从Hash换成了 ...

  4. Spark Streaming揭秘 Day2-五大核心特征

    Spark Streaming揭秘 Day2 五大核心特征 引子 书接上回,Streaming更像Spark上的一个应用程序,会有多个Job的配合,是最复杂的Spark应用程序.让我们先从特征角度进行 ...

  5. Spark Tungsten揭秘 Day4 内存和CPU优化使用

    Spark Tungsten揭秘 Day4 内存和CPU优化使用 今天聚焦于内存和CPU的优化使用,这是Spark2.0提供的关于执行时的非常大的优化部分. 对过去的代码研究,我们会发现,抽象的提高, ...

  6. Spark Tungsten揭秘 Day3 内存分配和管理内幕

    Spark Tungsten揭秘 Day3 内存分配和管理内幕 恭喜Spark2.0发布,今天会看一下2.0的源码. 今天会讲下Tungsten内存分配和管理的内幕.Tungsten想要工作,要有数据 ...

  7. Spark Tungsten揭秘 Day1 jvm下的性能优化

    Spark Tungsten揭秘 Day1 jvm下的性能优化 今天开始谈下Tungsten,首先我们需要了解下其背后是符合了什么样的规律. jvm对分布式天生支持 整个Spark分布式系统是建立在分 ...

  8. Spark Streaming揭秘 Day29 深入理解Spark2.x中的Structured Streaming

    Spark Streaming揭秘 Day29 深入理解Spark2.x中的Structured Streaming 在Spark2.x中,Spark Streaming获得了比较全面的升级,称为St ...

  9. Spark Streaming揭秘 Day35 Spark core思考

    Spark Streaming揭秘 Day35 Spark core思考 Spark上的子框架,都是后来加上去的.都是在Spark core上完成的,所有框架一切的实现最终还是由Spark core来 ...

随机推荐

  1. 中兴电信光纤猫F612管理员密码获取方法

    1.telnet 192.168.1.1 账号:root 密码:Zte521 2.输入命令: sendcmd 1 DB p DevAuthInfo 得到管理员账号密码如下: <DM name=& ...

  2. jsp自定义标签分页

    第一步:建立分页实体page类 package com.soda.util; /** * @description 分页实体类 * @author line * @time 2016年8月28日11: ...

  3. 引用自定义的framework

    关于静态库引用文件 如果希望你的工程能在未来能导出成静态库,那么在你编写的时候要遵循静态库引用原则,使用这种方式. 注意:这种引用方式必须在你的Products下静态库成黑色时候,才能编译通过. 使用 ...

  4. xml版本学生管理系统

    一: 需求描述 学生成绩管理系统,使用xml存储学生信息,可以对学生信息进行增.删.删除操作. 主要目的:练习操作xml元素的增删改查 二:代码结构 1:xml存储数据如下 exam.xml < ...

  5. MSP430常见问题之FLASH存储类

    Q1:用IAR Embedded Workbench for MSP430 通过JTAG往MSP430上写程序.为了知道片内程序的版本,必须读出Flash 中内容.什么工具软件可以通过JTAG口实现这 ...

  6. [原创]centos6.5 dhcpd 服务一直failed状态

    因为要部署kickstart自动化系统分发,所以需要在上面配置dhcp服务器,之前也使用同样的机器进行配置,没是没有问题的,但是这次在配置了dhcpd.conf文件后,重启服务的时候却一直提示 [ro ...

  7. Lombok(1.14.8) - @NonNull

    @NonNull @NonNull,生成一个非空检查. package com.huey.lombok; import lombok.Getter; import lombok.NonNull; im ...

  8. 在Ubuntu中USB连接手机调试

    1.打开手机USB调试功能 显示“开发者选项”(开发者选项默认隐藏,一般需要进入到“设置”-->“关于手机”连续点击七次,可将“开发者选项显示出来”) 将“开发者选项”设置为“开启”状态 打开U ...

  9. jQuery之锚点带动画跳转特效

    背景图片为金木研,这是我最爱的一张图. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &quo ...

  10. 那万恶的ssh真是麻烦

    设置为允许某组远程ssh ,key也放入相应的服务器了,死活提示,Permission denied (publickey). 而偏偏另外的用户相同的配置却又可以,这里找到答案,原来是跟目录的权限有关 ...