大数据Flink内存管理


1 内存管理问题引入

Flink本身基本是以Java语言完成的,理论上说,直接使用JVM的虚拟机的内存管理就应该更简单方便,但Flink还是单独抽象出了自己的内存管理因为Flink是为大数据而产生的,而大数据使用会消耗大量的内存,而JVM的内存管理管理设计是兼顾平衡的,不可能单独为了大数据而修改,这对于Flink来说,非常的不灵活,而且频繁GC会导致长时间的机器暂停应用,这对于大数据的应用场景来说也是无法忍受的。JVM在大数据环境下存在的问题:
1.Java 对象存储密度低。在HotSpot JVM中,每个对象占用的内存空间必须是8的倍数,那么一个只包含 boolean 属性的对象就要占用了16个字节内存:对象头占了8个,boolean 属性占了
1个,对齐填充占了7个。而实际上我们只想让它占用1个bit。
2.在处理大量数据尤其是几十甚至上百G的内存应用时会生成大量对象,Java GC可能会被反复触发,其中Full GC或Major GC的开销是非常大的,GC 会达到秒级甚至分钟级。
3.OOM 问题影响稳定性。OutOfMemoryError是分布式计算框架经常会遇到的问题,当JVM中所有对象大小超过分配给JVM的内存大小时,就会发生OutOfMemoryError错误,导致JVM崩溃,分布式框架的健壮性和性能都会受到影响。

2 内存划分

在这里插入图片描述
注意:Flink的内存管理是在JVM的基础之上,自己进行的管理,但是还没有逃脱的JVM,具体怎么实现,
现阶段我们搞不定

  1. 网络缓冲区Network Buffers:这个是在TaskManager启动的时候分配的,这是一组用于缓存网络数据的内存,每个块是32K,默认分配2048个,可以通过
    “taskmanager.network.numberOfBuffers”修改
  2. 内存池Memory Manage pool:大量的Memory Segment块,用于运行时的算法(Sort/Join/Shufflt等),这部分启动的时候就会分配。默认情况下,占堆内存的70% 的大小。
  3. 用户使用内存Remaining (Free) Heap: 这部分的内存是留给用户代码以及 TaskManager的数据使用的。

3 堆外内存

除了JVM之上封装的内存管理,还会有个一个很大的堆外内存,用来执行一些IO操作启动超大内存(上百GB)的JVM需要很长时间,GC停留时间也会很长(分钟级)。使用堆外内存可以极大地减小堆内存(只需要分配Remaining Heap),使得 TaskManager扩展到上百GB内存不是问题。进行IO操作时,使用堆外内存(可以理解为使用操作系统内存)可以zero-copy,使用堆内JVM内存至少要复制一次(需要在操作系统和JVM直接进行拷贝)。堆外内存在进程间是共享的。
⚫ 总结:
Flink相对于Spark,堆外内存该用还是用, 堆内内存管理做了自己的封装,不受JVM的GC影响

4 序列化与反序列化

Flink除了对堆内内存做了封装之外,还实现了自己的序列化和反序列化机制序列化与反序列化可以理解为编码与解码的过程。序列化以后的数据希望占用比较小的空间,而且数据能够被正确地反序列化出来。为了能正确反序列化,序列化时仅存储二进制数据本身肯定不够,需要增加一些辅助的描述信息。此处可以采用不同的策略,因而产生了很多不同的序列化方法。Java本身自带的序列化和反序列化的功能,但是辅助信息占用空间比较大,在序列化对象时记录了过多的类信息。Flink实现了自己的序列化框架,使用TypeInformation表示每种数据类型,所以可以只保存一份对象Schema信息,节省存储空间。又因为对象类型固定,所以可以通过偏移量存取。
⚫ TypeInformation 支持以下几种类型:
BasicTypeInfo: 任意Java 基本类型或 String 类型。
BasicArrayTypeInfo: 任意Java基本类型数组或 String 数组。
WritableTypeInfo: 任意 Hadoop Writable 接口的实现类。
TupleTypeInfo: 任意的 Flink Tuple 类型(支持Tuple1 to Tuple25)。Flink tuples 是固定长度固定类型的Java Tuple实现。
CaseClassTypeInfo: 任意的 Scala CaseClass(包括 Scala tuples)。
PojoTypeInfo: 任意的 POJO (Java or Scala),例如,Java对象的所有成员变量,要么是
public 修饰符定义,要么有 getter/setter 方法。
GenericTypeInfo: 任意无法匹配之前几种类型的类。(除了该数据使用kyro序列化.上面的其他的都是用二进制)在这里插入图片描述
针对前六种类型数据集,Flink皆可以自动生成对应的TypeSerializer,能非常高效地对数据集进行序列化和反序列化。对于最后一种数据类型,Flink会使用Kryo进行序列化和反序列化。每个TypeInformation中,都包含了serializer,类型会自动通过serializer进行序列化,然后用JavaUnsafe接口(具有像C语言一样的操作内存空间的能力)写入MemorySegments。在这里插入图片描述
在这里插入图片描述
Flink通过自己的序列化和反序列化,可以将数据进行高效的存储,不浪费内存空间

5 操纵二进制数据

Flink中的group、sort、join 等操作可能需要访问海量数据。以sort为例。首先,Flink 会从 MemoryManager 中申请一批 MemorySegment,用来存放排序的数据。这些内存会分为两部分:
一个区域是用来存放所有对象完整的二进制数据。另一个区域用来存放指向完整二进制数据的指针以及定长的序列化后的key(key+pointer)。将实际的数据和point+key分开存放有两个目的:
第一,交换定长块(key+pointer)更高效,不用交换真实的数据也不用移动其他key和pointer。
第二,这样做是缓存友好的,因为key都是连续存储在内存中的,可以增加cache命中。 排序会先比较 key 大小,这样就可以直接用二进制的 key 比较而不需要反序列化出整个对象。访问排序后的数据,可以沿着排好序的key+pointer顺序访问,通过 pointer 找到对应的真实数据。在交换过程中,只需要比较key就可以完成sort的过程,只有key1 == key2的情况,才需要反序列化拿出实际的对象做比较,而比较之后只需要交换对应的key而不需要交换实际的对象在这里插入图片描述

6 总结-面试

  1. 减少full gc时间:因为所有常用数据都在Memory Manager里,这部分内存的生命周期是伴随TaskManager管理的而不会被GC回收。其他的常用数据对象都是用户定义的数据对象,这部分会快速的被GC回收
  2. 减少OOM:所有的运行时的内存应用都从池化的内存中获取,而且运行时的算法可以在内存不足的时候将数据写到堆外内存
  3. 节约空间:由于Flink自定序列化/反序列化的方法,所有的对象都以二进制的形式存储,降
    低消耗
  4. 高效的二进制操作和缓存友好:二进制数据以定义好的格式存储,可以高效地比较与操作。另外,该二进制形式可以把相关的值,以及hash值,键值和指针等相邻地放进内存中。这使得数据结构可以对CPU高速缓存更友好,可以从CPU的 L1/L2/L3 缓存获得性能的提升,也就是Flink的数据存储二进制格式符合CPU缓存的标准,非常方便被CPU的L1/L2/L3各级别缓存利用,比内存还要快!
### 回答1: Flink是现在最为流行的数据流处理引擎之一,被广泛应用于大数据领域中的实时数据处理、分布式计算、批量数据处理、流与批的混合处理等各个方面。Flink的灵活性、高可用性和可扩展性都得到了业内的高度评价,因此得到了越来越多工程团队的选择与信任。 Flink的处理引擎采用的是基于数据流的模型,对数据进行实时的处理操作,而不是采用基于批处理的模式。这种模式的优势在于实时性更好,处理速度更快,能够应对更为复杂的数据处理任务,不仅对数据的延迟有更精细的控制,而且在可靠性上也表现出了更高的水平。 此外,Flink还具有强大的内存管理、计算优化和资源调度功能,这些特性为Flink的处理引擎提供了更高的效率和可靠性。尤其以Flink的计算优化能力为例,Flink内置的优化机制可以在不同的计算场景下,为用户提供合适的优化建议,从而提升处理效率和性能。因此,Flink被广泛应用于真正的实时数据处理任务,不论是实时数据仓库、业务监控、在线预测等场景都能得到应用。 综上所述,Flink是一个非常强大的数据处理引擎,其采用的基于数据流的处理模式具有更高的灵活性、可用性和可扩展性,迎合了大数据处理的需求。因此,Flink具有广泛的应用前景,在各个领域包括企业级应用、物联网、人工智能等领域都能展现出其优异的性能。 ### 回答2: 剑指大数据 Flink 是一种流处理引擎,易于使用且具有高度可扩展性。Flink 提供了对数据流的严格处理,能够以任何规模处理数据流,从而在数据处理和分析中提供了强大的支持。与其他流处理引擎不同,Flink 允许在同一应用程序中处理批处理和流处理数据Flink 的架构基于有向无环图 (DAG),将任务以节点和有向边的形式映射到物理计算资源上。Flink 提供了广泛的 API,包括基于 Java 和 Scala 的 API,还提供了适用于 SQL 和流程编排的 API。 Flink 还具有高度可扩展性,支持水平扩展和垂直扩展,并支持 Amazon Web Services、Google Cloud 和 Microsoft Azure 等云平台。Flink 提供了不同类型的计算模式,如批处理、迭代和流处理等,可以轻松地处理实时数据处理、跨批处理的计算和流式数据分析。此外,Flink 还提供了一些高级功能,如事件驱动的应用程序、弹性 RESTful API、基于状态的计算以及基于真实世界使用案例的运行时最佳实践。Flink 的这些功能使其成为大数据处理和实时流处理的理想选择,可广泛应用于广告、电子商务、金融、物联网等领域。 ### 回答3: 剑指大数据 flinkflink是一个开源流处理框架,是当前行业内最火热的技术之一。flink的出现填补了数据处理中的流式处理空白,使得大数据处理更加高效快捷。flink具有较高的扩展性和可伸缩性,可以应对高并发的数据处理任务,实现实时的数据处理和分析。与其他流处理框架相比,flink具有较高的容错性,能够在发生故障时自动恢复,确保数据处理过程的高可靠性。 flink支持多种数据处理模式,如批处理、流处理、迭代计算等,具有较强的通用性和适应性。同时,flink还支持数据流和状态的有机结合,可以存储和维护全局状态,实现更加复杂的计算任务。flink还具有灵活的部署方式,支持在各种环境中进行部署,包括本地机器、云平台等。因此,flink被广泛运用于实时流量分析、广告推荐、金融风控、电商推荐等各种大数据应用场景。 总之,flink是一个高效、可靠、灵活的大数据流处理框架,通过对分布式流式数据的处理和计算,为企业提供了更加高效的数据分析解决方案,对于当前大数据领域的发展具有重要的推动作用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赵广陆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值