文章目录
- 一. flink的内存管理
- 1.Jobmanager的内存模型
- 2.TaskManager的内存模型
- 2.1. 模型说明
- 2.2. 通讯、数据传输方面
- 2.3. 框架、任务堆外内存
- 2.4. 托管内存
- 3.任务分析
- 二. 单个节点的带宽瓶颈
- 1. 带宽相关理论
- 2. 使用speedtest-cli 测试带宽
- 3. 任务分析
- 3. 其他工具使用介绍
本文相关讨论
任务说明:
使用local模式运行flink sql任务,任务为:从hdfs解析数据到hdfs中的离线任务,其中数据量有4亿,文件数有13个,初始运行参数为:堆内存设为3g、并发设为13,其中运行命令如下:
java -XX:NativeMemoryTracking=summary -Xms3096m -Xmx3096m -cp $FLINK_HOME/lib/chunjun-core.jar:$FLINKX_HOME/bin/:$FLINK_HOME/lib/*:$HADOOP_CLASSPATH \
$CLASS_NAME -job hdfs-hdfs.sql -mode local -jobType sql \
-flinkConfDir $FLINK_HOME/conf \
-flinkLibDir $FLINK_HOME/lib \
-hadoopConfDir $HADOOP_CONF_DIR \
-confProp "{ \"taskmanager.numberOfTaskSlots\":13}"
一. flink的内存管理
1.Jobmanager的内存模型
组成部分 | 配置参数 | 描述 |
---|---|---|
JVM 堆内存 | jobmanager.memory.heap.size | JobManager 的 JVM 堆内存。框架内存、特殊批处理source、cp、akka通讯(java api实现)。 |
堆外内存 | jobmanager.memory.off-heap.size | JobManager 的_堆外内存(直接内存或本地内存)_。 |
JVM Metaspace | jobmanager.memory.jvm-metaspace.size | Flink JVM 进程的 Metaspace。 |
JVM 开销 | jobmanager.memory.jvm-overhead.min jobmanager.memory.jvm-overhead.max jobmanager.memory.jvm-overhead.fraction | 用于其他 JVM 开销的本地内存,例如栈空间、垃圾回收空间等。该内存部分为基于进程总内存的受限的等比内存部分。 |
2.TaskManager的内存模型
2.1. 模型说明
内存分类 | 解释 |
---|---|
一. 堆内存 | |
1. 框架堆内存 | 启动TM所需内存 |
2. Task堆内存 | 存放、执行Flink算子及用户代码 |
二.堆外内存 | |
3. 框架堆外内存* | 用于 Flink 框架的堆外内存(直接内存或本地内存) |
4. 任务堆外内存* | 用于 Flink 应用的算子及用户代码的堆外内存(直接内存或本地内存)(比如用户代码使用netty进行数据传输)。 |
5. 网络内存* | 用户任务之间数据传输的直接内存 |
6. 托管内存 | 用于存放Flink的中间结果和RocksDB State Backend 的本地内存 |
7. JVM Metaspace和Overhead内存 | 用于JVM存储类元数据;JVM的例如栈空间、垃圾回收空间等开销 |
*代表直接内存。
2.2. 通讯、数据传输方面
TaskManager和JobManager之间的通讯
主要依赖JVM堆内存,网络缓冲器内存在数据传输方面也起到了一定的作用。具体来说:
TaskManager之间的通信
TaskManager之间的通信主要使用的是网络缓冲器内存(Network Memory)。当两个TaskManager之间需要交换数据时,会使用网络缓冲器内存来存储待发送的数据以及接收到的数据。
2.3. 框架、任务堆外内存
2.4. 托管内存
托管内存(Managed Memory)主要用于数据处理和中间结果的存储,被用于以下几个主要的用途:
状态后端存储
3.任务分析
任务为local模式,任务为从hdfs读到hdfs写,hdfs的源数据有13个文件,总共有4亿的数据,每条数据98byte。下面从flink内存模型的角度分析下任务对各内存的使用情况
所以总体分析下来,local模式下我们需要调控的是堆内存,因为数据传输主要存在于用户代码中。
二. 单个节点的带宽瓶颈
根据拿到的带宽,与任务消费数据速度,我们大概可以测试出任务的并发度。
1. 带宽相关理论
网络带宽是指在一个固定的时间内(1秒),能通过的最大位数据,是个峰值数据, 单位是Mbps
。
上行带宽/下行带宽
带宽的上行和下行分别指的是网络传输中数据的上传和下载方向。
流量单位/存储单位
带宽速度计算:
实际带宽速率的损失
吞吐量
吞吐量是指在没有帧丢失的情况下,设备能够接收并转发的最大数据速率实际带宽,单位Mbps, 通常用来描述一个系统的性能。
与带宽的关系:吞吐量即在规定时间、空间及数据在网络中所走的路径(网络路径)的前提下,下载文件时实际获得的带宽值。由于多方面的原因,实际上吞吐量往往比传输介质所标称的最大带宽小得多
例如: 带宽为10Mbps的链路连接的一对节点可能只达到2Mbps的吞吐量。这样就意味着,一个主机上的应用能够以2Mbps的速度向另外的一个主机发送数据。
2. 使用speedtest-cli 测试带宽
# 安装
$ sudo yum install -y speedtest-cli
# 测试
$ speedtest-cli
Retrieving speedtest.net configuration...
Testing from China Unicom (111.206.170.119)...
Retrieving speedtest.net server list...
Selecting best server based on ping...
Hosted by China Telecom TianJin-5G (TianJin) [123.83 km]: 65.213 ms
Testing download speed................................................................................
Download: 143.51 Mbit/s
Testing upload speed......................................................................................................
Upload: 456.74 Mbit/s
3. 任务分析
实际在测试过程中,有如下瓶颈:
也就是说每秒处理2.43MB/s数据是机器带宽瓶颈,目前最佳内存为2G,并发减小时处理时间会比例减小,当并发减小到4时,处理速度达到快,3秒处理完,但总体算下来小于每秒处理2.43MB/s数据,也就是说并发根据文件数设置可以达到最佳性能。
3. 其他工具使用介绍
测试任务占用内存: jps + top
# 1. 找到指定进程
jps -l
2900 com.dtstack.chunjun.Main
3645 sun.tools.jps.Jps
# 2. 查看一个进程占用内存
top -p <pid>
按e会转换内存为byte->m->g等单位,较为人性化的展示。