主页 > 新闻资讯 > 大数据学习:Apache Flink如何管理内存

大数据学习:Apache Flink如何管理内存

作者:张老师 浏览次数: 2021-02-04 17:24
Apache Flink的流计算,在实际的运行过程当中,对于内存的管理和调优,是非常关键的一环。今天的大数据学习分享,我们来讲讲,Apache Flink如何管理内存?

Apache Flink内存管理,涉及到自定义序列化与反序列化机制,以及它是如何操作二进制数据的。

大数据学习:Apache Flink如何管理内存

数据对象直接放在堆内存中

在JVM中处理大量数据最直接的方式就是将这些数据做为对象存储在堆内存中,然后直接在内存中操作这些数据,如果想进行排序则就是对对象列表进行排序。然而这种方法有一些明显的缺点,首先,在频繁的创建和销毁大量对象的时候,监视和控制堆内存的使用并不是一件很简单的事情。如果对象分配过多的话,那么会导致内存过度使用,从而触发OutOfMemoryError,导致JVM进程直接被杀死。

另一个方面就是因为这些对象大都是生存在新生代,当JVM进行垃圾回收时,垃圾收集的开销很容易达到50%甚至更多。最后就是Java对象具有一定的空间开销(具体取决于JVM和平台)。对于具有许多小对象的数据集,这可以显著减少有效可用的内存量。如果你精通系统设计和系统调优,你可以根据系统进行特定的参数调整,可以或多或少的控制出现OutOfMemoryError的次数和避免堆内存的过多使用,但是这种设置和调优的作用有限,尤其是在数据量较大和执行环境发生变化的情况下。

Flink是怎么管理内存的?

Flink将对象序列化为固定数量的预先分配的内存段,而不是直接把对象放在堆内存上。它的DBMS风格的排序和连接算法尽可能多地对这个二进制数据进行操作,以此将序列化和反序列化开销降到最低。如果需要处理的数据多于可以保存在内存中的数据,Flink的运算符会将部分数据溢出到磁盘。事实上,很多Flink的内部实现看起来更像是C/C++,而不是普通的Java。

Flink的主动内存管理和操作二进制数据有几个好处:

1、内存安全执行和高效的核外算法

由于分配的内存段的数量是固定的,因此监控剩余的内存资源是非常简单的。在内存不足的情况下,处理操作符可以有效地将更大批的内存段写入磁盘,后面再将它们读回到内存。因此,OutOfMemoryError就有效的防止了。

2、减少垃圾收集压力

因为所有长生命周期的数据都是在Flink的管理内存中以二进制表示的,所以所有数据对象都是短暂的,甚至是可变的,并且可以重用。短生命周期的对象可以更有效地进行垃圾收集,这大大降低了垃圾收集的压力。

现在,预先分配的内存段是JVM堆上的长期存在的对象,为了降低垃圾收集的压力,Flink社区正在积极地将其分配到堆外内存。这种努力将使得JVM堆变得更小,垃圾收集所消耗的时间将更少。

3、节省空间的数据存储

Java对象具有存储开销,如果数据以二进制的形式存储,则可以避免这种开销。

4、高效的二进制操作和缓存敏感性在给定合适的二进制表示的情况下,可以有效地比较和操作二进制数据。

此外,二进制表示可以将相关值、哈希码、键和指针等相邻地存储在内存中。这使得数据结构通常具有更高效的缓存访问模式。

主动内存管理的这些特性在用于大规模数据分析的数据处理系统中是非常可取的,但是要实现这些功能的代价也是高昂的。要实现对二进制数据的自动内存管理和操作并非易事,使用java.util.HashMap比实现一个可溢出的hash-table(由字节数组和自定义序列化支持)。

关于大数据学习,Apache Flink如何管理内存,以上就为大家做了简单的介绍了。Apache Flink在流计算领域,实力不容小觑,Flink的内部运行机制,也值得深入学习和掌握。成都加米谷大数据,专业大数据培训机构,大数据开发,数据分析与挖掘,零基础班本月正在招生中,课程大纲及学习视频,可联系客服领取!
热点排行
推荐文章
立即申请>>