标准的Flink任务提交脚本(Generic CLI 模式)
从1.11开始,增加了通用客户端模式,参数使用-D
bin/flink run \
-t yarn-per-job \
-d \
-p 3 \ 指定并行度
-Dyarn.application.queue=default \ 指定yarn队列
-Djobmanager.memory.process.size=1024mb \ 指定JM的总进程大小
-Dtaskmanager.memory.process.size=1024mb \ 指定每个TM的总进程大小
-Dtaskmanager.numberOfTaskSlots=2 \ 指定每个TM的slot数
-c com.atguigu.flink.tuning.UvDemo \
/opt/module/flink-1.13.6/myjars/flink-tuning-1.0-SNAPSHOT.jar
1.TaskManager内存模型
1.1、内存模型详解
JVM 特定内存:JVM本身使用的内存,包含JVM的metaspace和over-head
1)JVM metaspace:JVM元空间
taskmanager.memory.jvm-metaspace.size,默认256mb
2)JVM over-head执行开销:JVM执行时自身所需要的内容,包括线程堆栈、IO、编译缓存等所使用的内存。
taskmanager.memory.jvm-overhead.fraction,默认0.1
taskmanager.memory.jvm-overhead.min,默认192mb
taskmanager.memory.jvm-overhead.max,默认1gb
总进程内存*fraction,如果小于配置的min(或大于配置的max)大小,则使用min/max大小
框架内存:Flink框架,即TaskManager本身所占用的内存,不计入Slot的资源中。
堆内:taskmanager.memory.framework.heap.size,默认128MB
堆外:taskmanager.memory.framework.off-heap.size,默认128MB/
Task内存:Task执行用户代码时所使用的内存
堆内:taskmanager.memory.task.heap.size,默认none,由Flink内存扣除掉其他部分的内存得到。
堆外:taskmanager.memory.task.off-heap.size,默认0,表示不使用堆外内存
网络内存:网络数据交换所使用的堆外内存大小,如网络数据交换缓冲区
堆外:taskmanager.memory.network.fraction,默认0.1
taskmanager.memory.network.min,默认64mb
taskmanager.memory.network.max,默认1gb
Flink内存*fraction,如果小于配置的min(或大于配置的max)大小,则使用min/max大小
托管内存:用于RocksDB State Backend 的本地内存和批的排序、哈希表、缓存中间结果。
堆外:taskmanager.memory.managed.fraction,默认0.4
taskmanager.memory.managed.size,默认none
如果size没指定,则等于Flink内存*fraction
2.合理利用cpu资源
arn的容量调度器默认情况下是使用“DefaultResourceCalculator”分配策略,只根据内存调度资源,所以在Yarn的资源管理页面上看到每个容器的vcore个数还是1。
可以修改策略为 DominantResourceCalculator,该资源计算器在计算资源的时候会综合考虑cpu和内存的情况。在capacity-scheduler.xml 中修改属性:
使用DefaultResourceCalculator 策略
bin/flink run \
-t yarn-per-job \
-d \
-p 3 \
-Dyarn.application.queue=default \
-Djobmanager.memory.process.size=1024mb \
-Dtaskmanager.memory.process.size=4096mb \
-Dtaskmanager.numberOfTaskSlots=2 \
-c com.atguigu.flink.tuning.UvDemo \
/opt/module/flink-1.13.6/myjars/flin