赞
踩
开源的大数据框架基本上大多数都是基于 JVM 运行的,如 Hadoop、Spark、 Storm,但是基于 JVM 的内存管理机制往往存在着类似于内存溢出等问题,主要 是因为创建的对象过多而超过 JVM 的最大堆内存限制,却没有被有效的回收掉, 仅仅靠 JVM 所提供的各种垃圾回收机制很难解决内存溢出等问题。尤其是几十 甚至上百 G 的内存应用时会生成大量对象,Java GC 可能会被反复触发,其中 Full GC 或 Major GC 的开销是非常大的,GC 会达到秒级甚至分钟级。 OOM 问题影响稳定性。OutOfMemoryError 是分布式计算框架经常会遇到的 问题,当 JVM 中所有对象大小超过分配给 JVM 的内存大小时,就会发生 OutOfMemoryError 错误,导致 JVM 崩溃,分布式框架的健壮性和性能都会受到 影响。所以 Flink 自身也实现了自己的内存管理。
Flink JVM 进程的进程总内存(Total Process Memory)包含了由 Flink 应用 使用的内存(Flink 总内存)以及由运行 Flink 的 JVM 使用的内存。 Flink 总内 存(Total Flink Memory)包括 JVM 堆内存(Heap Memory)和堆外内存(Off-Heap Memory)。 其中堆外内存包括直接内存(Direct Memory)和本地内存(NativeMemory)。
Flink on YARN 模式下,有 JobManager 和 TaskManager 两种进程。在任务调 度和运行的过程中,JobManager 和 TaskManager 承担了很大的责任。 因而 JobManager 和 TaskManager 的参数配置对 Flink 应用的执行有着很大的 影响意义。用户可通过如下操作对 Flink 集群性能做优化。
(1)配置 JobManager 内存 JobManager 负责任务的调度,以及 TaskManager、RM 之间的消息通信。当 任务数变多,任务平行度增大时,JobManager 内存都需要相应增大。您可以根 据实际任务数量的多少,为 JobManager 设置一个合适的内存。 在使用 yarn-session 命令时,添加“-jm MEM”参数设置内存。 在使用 yarn-cluster 命令时,添加“-yjm MEM”参数设置内存。 (2)配置 TaskManager 个数 每个 TaskManager 每个核同时能跑一个 task,所以增加了 TaskManager 的个 数相当于增大了任务的并发度。在资源充足的情况下,可以相应增加 TaskManager 的个数,以提高运行效率。 在使用 yarn-session 命令时,添加“-n NUM”参数设置 TaskManager 个数。 在使用 yarn-cluster 命令时,添加“-yn NUM”参数设置 TaskManager 个数。 (3)配置 TaskManager Slot 数 每个 TaskManager 多个核同时能跑多个 task,相当于增大了任务的并发度。 但是由于所有核共用 TaskManager 的内存,所以要在内存和核数之间做好平衡。 在使用 yarn-session 命令时,添加“-s NUM”参数设置 SLOT 数。 在使用 yarn-cluster 命令时,添加“-ys NUM”参数设置 SLOT 数。 (4)配置 TaskManager 内存 TaskManager 的内存主要用于任务执行、通信等。当一个任务很大的时候, 可能需要较多资源,因而内存也可以做相应的增加。 将在使用 yarn-sesion 命令时,添加“-tm MEM”参数设置内存。将在使用 yarn-cluster 命令时,添加“-ytm MEM”参数设置内存。
数据倾斜:
由于数据分布不均匀,数据集中在某些 SubTask 上,导致部分 SubTask 处理数据量特别大,执行时间过长,影响了整个应用程序的执行效率。 过多的数据集中在某些 JVM(TaskManager),使得 JVM 的内存资源短缺,导 致频繁 GC。严重情况下,过长的 GC 导致 TaskManager 失联,系统崩溃。
解决方式:
1、数据源的消费不均匀:调整并发度。 对于数据源消费不均匀,比如 Kafka 数据
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。