Spark SizeTrackingAppendOnlyMap 相关源代码分析

SizeTrackingAppendOnlyMap 在 ExternalAppendOnlyMap 中使用,当 map 中对象占用的内存大小超过一定阈值时,把 数据 spill 到磁盘。所以 SizeTrackingAppendOnlyMap extends AppendOnlyMap[K, V] with SizeTracker

AppendOnlyMap

AppendOnlyMap 是只能增加和修改元素的 Map,不能删除元素。key 可以为 null, key 为 null 的 value 专门用一个字段 nullValue 存储. 用一个字段 haveNullValue 标识是否包含 key 为 null 的 value. 其他数据用一个数组 data 存储。

AppendOnlyMap capacity 默认是 64。mask 为 catacity - 1. data 容量为 (2 * capacity),因为同时存储 key 和 value。 LOAD_FACTOR=0.7。当存储了 capacity * 0.7个元素时,构建新的 data 数组,capacity 翻倍。然后读取原来 data 中的内容,安照新的容量重新计算对应位置,然后放到新的数组里。

插入数据时,先计算 var pos = rehash(k.hashCode) & mask,key 存储在 data[2pos], value 存储在 data[2pos + 1]。如果已经有数据存在,则 pos + 1.

AppendOnlyMap 最多存储 375809638 个元素。

  • destructiveSortedIterator() 方法,提供按 key 排序的 Iterator,可以按原址排序,不需要额外的内存空间, 但是破坏了数据在 data 中的索引, 不能再插入数据。

SizeTracker

SizeTracker 跟踪估计的内存使用量。使用以下字段。

numUpdates: Map 总共插入和修改的次数。
nextSampleNum: 当 numUpdates 等于时,计算
SAMPLE_GROWTH_RATE: 1.1, 计算内存计算量后, nextSampleNum = nextSampleNum * SAMPLE_GROWTH_RATE
samples: 存储最后两次评估的数据。Sample 有两个字段 size: Long(占用内存), numUpdates: Long(更新次数)
bytesPerUpdate: 最后两次 samples 的每次 update 平均字节数。(latest.size - previous.size).toDouble / (latest.numUpdates - previous.numUpdates)

SizeEstimator.estimate 估计对象占用内存

评估一个 class 实例占用的内存,如果字段是基本类型,占用的内存大小如下表。

private val BYTE_SIZE = 1
private val BOOLEAN_SIZE = 1
private val CHAR_SIZE = 2
private val SHORT_SIZE = 2
private val INT_SIZE = 4
private val LONG_SIZE = 8
private val FLOAT_SIZE = 4
private val DOUBLE_SIZE = 8

如果字段是 object, 则最小是 8,根据是否64位系统和是否开启指针压缩,可能为 12 或者 16.

  • estimate 过程
    使用广度优先算法,需要遍历的 class 对象放到队列里。依次从队列里取 class 对象,
    先获取本 class 的 classInfo。拿到本对象的 fileds 的大小,然后把所有对象类型的字段,都放到队列里。
    基本数据类型的字段不需要。
val classInfo = getClassInfo(cls)
state.size += alignSize(classInfo.shellSize)
for (field <- classInfo.pointerFields) {
 state.enqueue(field.get(obj))
}

相关推荐

  1. Spark SizeTrackingAppendOnlyMap 相关源代码分析

    2024-03-27 06:52:02       38 阅读
  2. EmmyLuaDebugger介绍与源代码分析

    2024-03-27 06:52:02       33 阅读
  3. 典型相关分析

    2024-03-27 06:52:02       57 阅读
  4. 渗透相关面试+流量分析

    2024-03-27 06:52:02       26 阅读
  5. 源代码防泄露方案的两类对比分析

    2024-03-27 06:52:02       37 阅读
  6. 源代码防泄密--沙盒技术安全风险分析

    2024-03-27 06:52:02       28 阅读
  7. 分享相关知识

    2024-03-27 06:52:02       46 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-27 06:52:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-27 06:52:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-27 06:52:02       82 阅读
  4. Python语言-面向对象

    2024-03-27 06:52:02       91 阅读

热门阅读

  1. Stable Diffusion XL之核心基础内容

    2024-03-27 06:52:02       38 阅读
  2. k8s 的资源清单

    2024-03-27 06:52:02       36 阅读
  3. 图论相关代码(matlab)

    2024-03-27 06:52:02       40 阅读
  4. Mac OS中Git版本更新(亲测有效)

    2024-03-27 06:52:02       41 阅读
  5. Odoo自动化动作

    2024-03-27 06:52:02       38 阅读
  6. spring boot3 解决跨域几种方式

    2024-03-27 06:52:02       43 阅读
  7. caffe | undefined reference to google protobuf

    2024-03-27 06:52:02       38 阅读
  8. Flink SQL填坑记3:两个kafka数据关联查询

    2024-03-27 06:52:02       33 阅读
  9. react native hooks 如何避免重复请求

    2024-03-27 06:52:02       34 阅读
  10. AI绘画自动生成器平台有哪些

    2024-03-27 06:52:02       41 阅读
  11. python数据解析xpath

    2024-03-27 06:52:02       40 阅读
  12. 微信小程序 第四节课

    2024-03-27 06:52:02       42 阅读