内存不过是计算机分级存储系统中的靠近cpu的一个存储介质。
我们一起来解决这些问题
一、内存模型
远古大神曾告诉我们这个神秘公式:程序=算法+数据。
1.1 什么是内存模型
内存模型就是告诉我们怎么划分内存、怎么合理利用我们的内存。
首先我们要存什么,根据大神的公式,我们这样来分析:
这下我们就可以把我们需要储存的东西分为数据区和执行区。
二、spark内存模型
2.1 spark为啥快
我们都知道spark之所以比mapreduce计算的快,是因为他是基于内存的,不用每次计算完都写磁盘,再读取出来进行下一次计算,spark直接把内存作为数据的临时储存介质。所以mapreduce就没有强调内存管理,而spark需要管理内存。
2.2 spark管理的内存
系统区:spark运行自身的代码需要一定的空间。
用户区:我们自己写的一些udf之类的代码也需要一定的空间来运行。
存储区:spark的任务就是操作数据,spark为了快可能把数据存内存,而这些数据也需要占用空间。
执行区:spark操作数据的单元是partition,spark在执行一些shuffle、join、sort、aggregation之类的操作,需要把partition加载到内存进行运算,这也会运用到部分内存。
2.3 spark内存模型
spark内存
上图就是spark内存划分的图了
我们从下到上一层一层的解释:
三、源码层面
3.1 整体架构
内存管理
3.2 如何实现内存申请释放。
spark是用scala和java实现的,印象中没有管理内存申请释放的api,spark是如何利用这些jvm语言管理内存的呢。
我们来看看源码片段
- //HeapMemoryAllocator.scala
- private final Map<Long, LinkedList<WeakReference<long[]>>> bufferPoolsBySize = new HashMap<>();
- ……
- public MemoryBlock allocate(long size) throws OutOfMemoryError {
- …… 上面是些内存的判断 ……
- long[] array = new long[numWords];
- //上面这就很关键了
- MemoryBlock memory = new MemoryBlock(array, Platform.LONG_ARRAY_OFFSET, size);
- if (MemoryAllocator.MEMORY_DEBUG_FILL_ENABLED) {
- memory.fill(MemoryAllocator.MEMORY_DEBUG_FILL_CLEAN_VALUE);
- }
- return memory;
- }
HeapMemoryAllocator可以看到上面的源码片段,实际的内存申请是这个代码:new long[numWords]; 就是new了个数组来占着内存,用MemoryBlock 包装了一下。bufferPoolsBySize这个是为了防止内存频繁申请和释放做的buffer。
接下来看看off-heap是怎么申请内存的。
- //UnsafeMemoryAllocator
- public MemoryBlock allocate(long size) throws OutOfMemoryError {
- long address = Platform.allocateMemory(size);
- MemoryBlock memory = new MemoryBlock(null, address, size);
- if (MemoryAllocator.MEMORY_DEBUG_FILL_ENABLED) {
- memory.fill(MemoryAllocator.MEMORY_DEBUG_FILL_CLEAN_VALUE);
- }
- return memory;
- }
offheap的就和C语言一样的了可以直接使用api来申请。这部分内存就需要自己进行管理了,没有jvm的控制,没有内存回收机制。
当然这也不意味了你能无限制的使用内存,在yarn的情况下,yarn是监测子进程的内存占用来看你是否超了内存,如果超了直接kill掉。
四、总结
我们能回答开头提出的几个问题了吗?还是又有了更多的问题呢。
随着服务器市场的发展,市场上很多服务器类型,而这么多服务器中,到底哪些服务...
背景:你知道SPC-1 IOPS 到底是由哪些I/O模型的负载组合而成? 2020年3月,存储性...
要说近几年存储这条街最靓的仔,莫过于分布式存储了。 自诞生以来,分布式存储就...
随着越来越多的企业希望通过创新来提升利润,Liberty Mutual的技术团队做了额外...
香港服务器租赁,是指由香港IDC服务提供商出示硬件配置,依照客户的要求承担基础...
早期内存通过存储器总线和北桥相连,北桥通过前端总线与CPU通信。从Intel Nehale...
作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,...
根据2020年针对CIO进行的疫情大流行对业务的影响的调查,远程工作对许多组织来说...
伴随5G、AI、物联网等新型应用场景不断丰富,海量数据存储和创新需求与日俱增。...
在近期召开的中共中央政治局常务委员会会议上,中央明确提出要加快5G网络、数据...