Spark Tungsten揭秘 Day2 Tungsten-sort Based Shuffle
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的更多相关文章
- Spark技术内幕:Sort Based Shuffle实现解析
在Spark 1.2.0中,Spark Core的一个重要的升级就是将默认的Hash Based Shuffle换成了Sort Based Shuffle,即spark.shuffle.manager ...
- Spark Sort Based Shuffle内存分析
分布式系统里的Shuffle 阶段往往是非常复杂的,而且分支条件也多,我只能按着我关注的线去描述.肯定会有不少谬误之处,我会根据自己理解的深入,不断更新这篇文章. 前言 借用和董神的一段对话说下背景: ...
- Spark-1.6.0中的Sort Based Shuffle源码解读
从Spark-1.2.0开始,Spark的Shuffle由Hash Based Shuffle升级成了Sort Based Shuffle.即Spark.shuffle.manager从Hash换成了 ...
- Spark Streaming揭秘 Day2-五大核心特征
Spark Streaming揭秘 Day2 五大核心特征 引子 书接上回,Streaming更像Spark上的一个应用程序,会有多个Job的配合,是最复杂的Spark应用程序.让我们先从特征角度进行 ...
- Spark Tungsten揭秘 Day4 内存和CPU优化使用
Spark Tungsten揭秘 Day4 内存和CPU优化使用 今天聚焦于内存和CPU的优化使用,这是Spark2.0提供的关于执行时的非常大的优化部分. 对过去的代码研究,我们会发现,抽象的提高, ...
- Spark Tungsten揭秘 Day3 内存分配和管理内幕
Spark Tungsten揭秘 Day3 内存分配和管理内幕 恭喜Spark2.0发布,今天会看一下2.0的源码. 今天会讲下Tungsten内存分配和管理的内幕.Tungsten想要工作,要有数据 ...
- Spark Tungsten揭秘 Day1 jvm下的性能优化
Spark Tungsten揭秘 Day1 jvm下的性能优化 今天开始谈下Tungsten,首先我们需要了解下其背后是符合了什么样的规律. jvm对分布式天生支持 整个Spark分布式系统是建立在分 ...
- Spark Streaming揭秘 Day29 深入理解Spark2.x中的Structured Streaming
Spark Streaming揭秘 Day29 深入理解Spark2.x中的Structured Streaming 在Spark2.x中,Spark Streaming获得了比较全面的升级,称为St ...
- Spark Streaming揭秘 Day35 Spark core思考
Spark Streaming揭秘 Day35 Spark core思考 Spark上的子框架,都是后来加上去的.都是在Spark core上完成的,所有框架一切的实现最终还是由Spark core来 ...
随机推荐
- Linux Bash命令关于程序调试详解
转载:http://os.51cto.com/art/201006/207230.htm 参考:<Linux shell 脚本攻略>Page22-23 Linux bash程序在程序员的使 ...
- 深入研究Block用weakSelf、strongSelf、@weakify、@strongify解决循环引用(上)
深入研究Block捕获外部变量和__block实现原理 前言 在上篇中,仔细分析了一下Block的实现原理以及__block捕获外部变量的原理.然而实际使用Block过程中,还是会遇到一些问题,比如R ...
- 使用socket实现信用卡程序和迷你购物商城
#-*- coding:utf-8 -*- from moudle import * import socketserver import json import os import time imp ...
- Java设计模式13:常用设计模式之桥接模式(结构型模式)
1. Java之桥接模式(Bridge Pattern) (1)概述: 首先我们说一个生活中的例子: 就拿汽车在路上行驶的来说.即有小汽车又有公共汽车,它们都不但能在市区中的公路上行驶,也 ...
- scope重定义
.directive('myAttr', function() { return { restrict: 'E', scope: { customerInfo: '=info' }, template ...
- vb.net 使用 Regex Replace 正则 替换 Html字串的table中tbody第一个tr下的td为th
本次示例效果如下: TextBox1中输入如下字符串: 12<table><tbody><tr><td>1<br/>11</td> ...
- 【组合数的唯一分解定理】Uva1635
给出n.m,求得最终求和数列an=C(n-1,0)*x1 + C(n-1,1)*x2+...+C(n-1,n-1)*xn; 若xi与m无关,则an除以m的余数与xi无关,即余数不含xi的项: 输入:n ...
- 为什么Java byte 类型的取值范围是-128~127 (转)
概念:负数的补码是该 数 绝 对 值 的 原 码 按 位 取 反 ,然 后 对 整个数 加 1 步骤: 1.确定byte是1个字节,也就是8位 2.最大的应该是0111 1111,因为第一位是符号位, ...
- 一行代码解决各种IE兼容问题,IE6,IE7,IE8,IE9,IE10(转)
在网站开发中不免因为各种兼容问题苦恼,针对兼容问题,其实IE给出了解决方案Google也给出了解决方案百度也应用了这种方案去解决IE的兼容问题 百度源代码如下 <!Doctype html&g ...
- Linux内核开发基础
1.Linux内核简介 1.1.Linux系统如何构成 内核空间(Kernel Space)+用户空间(User Space) 用户空间 = 用户程序 + C语言库(例如:GNC C Library) ...