flink1.10 在yarn上运行job报内存超出

./bin/flink run -m yarn-cluster -yjm 1024 -ytm 1024 -s hdfs://master:9000/flink/checkpoints/d15750eebe118cccb93b4450a008e4d3/chk-158/_metadata -c stream.TestKafkaCheckpoint /var/flink/data/jars/flink-1.0-SNAPSHOT.jar

可以看到,我给jobmanager和taskmanager分别分配了1g内存。

但是运行时报了下面的错。 

意思是说那几项内存总和(372m)超过了配置的total flink memory(132m)。

org.apache.flink.client.program.ProgramInvocationException: The main method caused an error: Sum of configured Framework Heap Memory (128.000mb (134217728 bytes)), Framework Off-Heap Memory (128.000mb (134217728 bytes)), Task Off-Heap Memory (0 bytes), Managed Memory (52.800mb (55364813 bytes)) and Network Memory (64.000mb (67108864 bytes)) exceed configured Total Flink Memory (132.000mb (138412032 bytes)).
        at org.apache.flink.client.program.PackagedProgram.callMainMethod(PackagedProgram.java:335)
        at org.apache.flink.client.program.PackagedProgram.invokeInteractiveModeForExecution(PackagedProgram.java:205)
        at org.apache.flink.client.ClientUtils.executeProgram(ClientUtils.java:138)
        at org.apache.flink.client.cli.CliFrontend.executeProgram(CliFrontend.java:664)
        at org.apache.flink.client.cli.CliFrontend.run(CliFrontend.java:213)
        at org.apache.flink.client.cli.CliFrontend.parseParameters(CliFrontend.java:895)
        at org.apache.flink.client.cli.CliFrontend.lambda$main$10(CliFrontend.java:968)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:422)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1692)
        at org.apache.flink.runtime.security.HadoopSecurityContext.runSecured(HadoopSecurityContext.java:41)
        at org.apache.flink.client.cli.CliFrontend.main(CliFrontend.java:968)
Caused by: org.apache.flink.configuration.IllegalConfigurationException: Sum of configured Framework Heap Memory (128.000mb (134217728 bytes)), Framework Off-Heap Memory (128.000mb (134217728 bytes)), Task Off-Heap Memory (0 bytes), Managed Memory (52.800mb (55364813 bytes)) and Network Memory (64.000mb (67108864 bytes)) exceed configured Total Flink Memory (132.000mb (138412032 bytes)).

当我调低jobmanager和taskmanager的内存为100m时,又报下面的错。

意思是配置的JVM Metaspace为700m,JVM Overhead为192m,超过了total process memory配置的200m(ytm)。

./bin/flink run -m yarn-cluster -yjm 500 -ytm 200 -s hdfs://master:9000/flink/checkpoints/d15750eebe118cccb93b4450a008e4d3/chk-158/_metadata -c stream.TestKafkaCheckpoint /var/flink/data/jars/flink-1.0-SNAPSHOT.jar

org.apache.flink.client.program.ProgramInvocationException: The main method caused an error: Sum of configured JVM Metaspace (700.000mb (734003200 bytes)) and JVM Overhead (192.000mb (201326592 bytes)) exceed configured Total Process Memory (200.000mb (104857600 bytes)).
        at org.apache.flink.client.program.PackagedProgram.callMainMethod(PackagedProgram.java:335)
        at org.apache.flink.client.program.PackagedProgram.invokeInteractiveModeForExecution(PackagedProgram.java:205)
        at org.apache.flink.client.ClientUtils.executeProgram(ClientUtils.java:138)
        at org.apache.flink.client.cli.CliFrontend.executeProgram(CliFrontend.java:664)
        at org.apache.flink.client.cli.CliFrontend.run(CliFrontend.java:213)
        at org.apache.flink.client.cli.CliFrontend.parseParameters(CliFrontend.java:895)
        at org.apache.flink.client.cli.CliFrontend.lambda$main$10(CliFrontend.java:968)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:422)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1692)
        at org.apache.flink.runtime.security.HadoopSecurityContext.runSecured(HadoopSecurityContext.java:41)
        at org.apache.flink.client.cli.CliFrontend.main(CliFrontend.java:968)
Caused by: org.apache.flink.configuration.IllegalConfigurationException: Sum of configured JVM Metaspace (700.000mb (734003200 bytes)) and JVM Overhead (192.000mb (201326592 bytes)) exceed configured Total Process Memory (200.000mb (104857600 bytes)).

应该是flink1.10内存模型的原因,查看官网https://ci.apache.org/projects/flink/flink-docs-release-1.10/ops/config.html

可以看到,taskmanager.memory.processor.size配置的是total process memory的大小,而taskmanager.memory.flink.size配置的是total flink memory的大小。其中前者包含后者,以及jvm metaspace和jvm overhead。当使用容器化启动时,应该将前者设置为容器内存大小。

前面的都好理解,关键是最后这一句:“当使用容器化启动时,应该将前者设置为容器内存大小”。on yarn模式,容器即为container,而container的大小和个数由几个参数控制:

yarn.scheduler.minimum-allocation-mb #申请container的最小内存(默认是1G)
yarn.scheduler.maximum-allocation-mb #申请container的最大内存(默认是8G)
yarn.nodemanager.resource.memory-mb #resourcemanager内存(默认是8G,与第一条配置的比值即为最大容器数)

我一开始是没有配置这两个参数的,使用的是默认值。后来想是不是因为我机器可以内存只剩4g,而容器数默认为8,导致每个容器的大小为512m不够我默认配置的taskmanager.memory.process.size:1568m,进而产生影响。但是不确定,因为申请的容器不够用时会自动扩容,只有低于最大值就行,所以应该不会有影响才对。不管,先试试再说,于是修改了resourcemanager内存为4g,容器最小容量为2g,然后重启Hadoop使其生效:

flink的默认配置为

再次运行:

./bin/flink run -m yarn-cluster -yjm 1024 -ytm 1024 -s hdfs://master:9000/flink/checkpoints/d15750eebe118cccb93b4450a008e4d3/chk-158/_metadata -c stream.TestKafkaCheckpoint /var/flink/data/jars/flink-1.0-SNAPSHOT.jar

发现还是报错:

org.apache.flink.client.program.ProgramInvocationException: The main method caused an error: Sum of configured Framework Heap Memory (128.000mb (134217728 bytes)), Framework Off-Heap Memory (128.000mb (134217728 bytes)), Task Off-Heap Memory (0 bytes), Managed Memory (52.800mb (55364813 bytes)) and Network Memory (64.000mb (67108864 bytes)) exceed configured Total Flink Memory (132.000mb (138412032 bytes)).
        at org.apache.flink.client.program.PackagedProgram.callMainMethod(PackagedProgram.java:335)
        at org.apache.flink.client.program.PackagedProgram.invokeInteractiveModeForExecution(PackagedProgram.java:205)
        at org.apache.flink.client.ClientUtils.executeProgram(ClientUtils.java:138)
        at org.apache.flink.client.cli.CliFrontend.executeProgram(CliFrontend.java:664)
        at org.apache.flink.client.cli.CliFrontend.run(CliFrontend.java:213)
        at org.apache.flink.client.cli.CliFrontend.parseParameters(CliFrontend.java:895)
        at org.apache.flink.client.cli.CliFrontend.lambda$main$10(CliFrontend.java:968)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:422)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1692)
        at org.apache.flink.runtime.security.HadoopSecurityContext.runSecured(HadoopSecurityContext.java:41)
        at org.apache.flink.client.cli.CliFrontend.main(CliFrontend.java:968)
Caused by: org.apache.flink.configuration.IllegalConfigurationException: Sum of configured Framework Heap Memory (128.000mb (134217728 bytes)), Framework Off-Heap Memory (128.000mb (134217728 bytes)), Task Off-Heap Memory (0 bytes), Managed Memory (52.800mb (55364813 bytes)) and Network Memory (64.000mb (67108864 bytes)) exceed configured Total Flink Memory (132.000mb (138412032 bytes)).

说明不是这个原因。

那么这个132到底是怎么算出来的呢???

不知道。但是看到total flink size是taskmanager.memory.flink.size指定的。而默认配置没有单独配,因此试着修改了一下配置:

再次运行:

org.apache.flink.client.program.ProgramInvocationException: The main method caused an error: bytes must be >= 0
        at org.apache.flink.client.program.PackagedProgram.callMainMethod(PackagedProgram.java:335)
        at org.apache.flink.client.program.PackagedProgram.invokeInteractiveModeForExecution(PackagedProgram.java:205)
        at org.apache.flink.client.ClientUtils.executeProgram(ClientUtils.java:138)
        at org.apache.flink.client.cli.CliFrontend.executeProgram(CliFrontend.java:664)
        at org.apache.flink.client.cli.CliFrontend.run(CliFrontend.java:213)
        at org.apache.flink.client.cli.CliFrontend.parseParameters(CliFrontend.java:895)
        at org.apache.flink.client.cli.CliFrontend.lambda$main$10(CliFrontend.java:968)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:422)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1692)
        at org.apache.flink.runtime.security.HadoopSecurityContext.runSecured(HadoopSecurityContext.java:41)
        at org.apache.flink.client.cli.CliFrontend.main(CliFrontend.java:968)
Caused by: java.lang.IllegalArgumentException: bytes must be >= 0

发现报了另一个错,并且好像也是因为内存的原因!

 

这时,看到官网的内存模型图:

可以看到,total process memory = total flink memory + jvm metaspace + jvm overhead。

我在命令中指定的jtm=1024m,根据报错知道JVM Metaspace为700m,JVM Overhead为192m,total flink memory为132m。这三项加起来刚好是1024m。与设置的值相符合。

因此,说明设置的jtm太小了!!!根据第一条报错,知道最少还需要240m。这里直接再加1g,总共分片2g给taskmanager,再次运行:

./bin/flink run -m yarn-cluster -yjm 1024 -ytm 2048 -s hdfs://master:9000/flink/checkpoints/d15750eebe118cccb93b4450a008e4d3/chk-158/_metadata -c stream.TestKafkaCheckpoint /var/flink/data/jars/flink-1.0-SNAPSHOT.jar

2020-05-27 14:06:54,099 INFO  org.apache.hadoop.yarn.client.RMProxy                         - Connecting to ResourceManager at master/xxx:8032
2020-05-27 14:06:54,200 INFO  org.apache.flink.yarn.YarnClusterDescriptor                   - No path for the flink jar passed. Using the location of class org.apache.flink.yarn.YarnClusterDescriptor to locate the jar
2020-05-27 14:06:54,396 WARN  org.apache.flink.yarn.YarnClusterDescriptor                   - The JobManager or TaskManager memory is below the smallest possible YARN Container size. The value of 'yarn.scheduler.minimum-allocation-mb' is '2048'. Please increase the memory size.YARN will allocate the smaller containers but the scheduler will account for the minimum-allocation-mb, maybe not all instances you requested will start.
2020-05-27 14:06:54,396 INFO  org.apache.flink.yarn.YarnClusterDescriptor                   - Cluster specification: ClusterSpecification{masterMemoryMB=2048, taskManagerMemoryMB=2048, slotsPerTaskManager=8}
2020-05-27 14:06:57,925 INFO  org.apache.flink.yarn.YarnClusterDescriptor                   - Submitting application master application_1590554685223_0001
2020-05-27 14:06:58,063 INFO  org.apache.hadoop.yarn.client.api.impl.YarnClientImpl         - Submitted application application_1590554685223_0001
2020-05-27 14:06:58,063 INFO  org.apache.flink.yarn.YarnClusterDescriptor                   - Waiting for the cluster to be allocated
2020-05-27 14:06:58,070 INFO  org.apache.flink.yarn.YarnClusterDescriptor                   - Deploying cluster, current state ACCEPTED
2020-05-27 14:07:04,905 INFO  org.apache.flink.yarn.YarnClusterDescriptor                   - YARN application has been deployed successfully.
2020-05-27 14:07:04,906 INFO  org.apache.flink.yarn.YarnClusterDescriptor                   - Found Web Interface master:5804 of application 'application_1590554685223_0001'.
Job has been submitted with JobID 770dda740247c797287fc22d88ad3319

可以看到成功运行了!

同时还可以发现,日志中说了jobmanager或taskmanager的内存小于yarn container的最小内存。 The value of 'yarn.scheduler.minimum-allocation-mb' is '2048'。也就是之前修改的yarn-site.xml文件中指定的。日志中建议提高jobmanager和taskmanager的内存,不然可能会出现启动失败的情况。

 

<think>好的,我现在需要回答用户关于在启动Flink任务时如何指定容器的大小和CPU核数的问题。首先,我要确保自己理解用户的问题。他们想知道在启动Flink任务时,如何配置容器(container)的资源,比如内存和CPU核数。这可能涉及到Flink的资源配置参数,尤其是在YARN或Kubernetes这样的集群管理平台上运行的情况。 接下来,我需要回忆Flink的相关配置选项。Flink任务的资源分配通常通过配置参数来设置,例如在YARN模式下,可以通过`-yjm`设置JobManager的内存,`-ytm`设置TaskManager的内存。而对于CPU核数,可能涉及到`yarn.containers.vcores`这样的参数,或者使用Kubernetes的资源配置。 用户可能是在使用YARN或Kubernetes部署Flink,所以需要分别考虑这两种情况。另外,如果是独立部署(Standalone),资源管理可能有所不同,但用户可能更关心的是集群管理器如YARN或K8s的情况。 需要确认的关键点包括: 1. 如何为JobManager和TaskManager配置内存大小。 2. 如何设置CPU核数,尤其是在YARN或Kubernetes环境中。 3. 是否有一些特定的参数或配置示例可以提供给用户。 还需要注意,Flink1.10版本之后对Kubernetes的支持更加完善,而YARN则是传统的部署方式。不同的部署方式可能有不同的配置方式,需要分别说明。 另外,用户可能对容器(container)的理解是YARN中的容器或Kubernetes中的Pod,需要明确说明这两种情况下的配置方法。 可能还需要提到Flink的资源配置参数,例如`taskmanager.memory.process.size`、`jobmanager.memory.process.size`,以及CPU相关的参数如`taskmanager.numberOfTaskSlots`,不过这个参数更多是关于任务槽的数量,可能与CPU核数有关联,但不直接设置CPU核数。在YARN或K8s中,CPU核数可能需要通过集群管理器的参数来指定,例如YARN的`yarn.containers.vcores`或K8s的资源配置。 需要确保给出的配置示例正确,并且参数适用于用户使用的Flink版本。例如,旧版本的Flink可能使用不同的参数名,而新版本可能有所调整。 最后,要组织回答的结构,先介绍总体思路,然后分部署模式(YARN、Kubernetes、Standalone)详细说明配置方法,给出具体的配置示例,并提醒用户注意版本差异和常见问题。</think>在 Flink 任务中指定容器(Container)的大小(内存)和 CPU 核数,需要根据 **部署模式**(如 YARN、Kubernetes、Standalone)通过配置参数实现。以下是具体配置方法和原理说明: --- ### 一、核心概念 - **容器资源**:在分布式集群中(如 YARN/Kubernetes),每个 TaskManager/JobManager 运行在一个容器内,资源分配需通过集群管理器控制。 - **关键参数**: - **内存**:包括 JVM 堆内存、堆外内存、网络缓存等。 - **CPU 核数**:直接决定算子的并行计算能力。 --- ### 二、配置方法(按部署模式) #### 1. **YARN 部署模式** Flink on YARN 时,容器资源由 YARN 分配,需通过 Flink 配置和 YARN 参数共同控制。 - **指定容器内存**: - **JobManager 内存**: ```bash ./bin/flink run \ -yjm <memory> \ # 例如 -yjm 2048m 或 -yjm 2g ... ``` - **TaskManager 内存**: ```bash ./bin/flink run \ -ytm <memory> \ # 例如 -ytm 4096m 或 -ytm 4g ... ``` - **指定 CPU 核数**: - **全局配置**(`flink-conf.yaml`): ```yaml # 每个 TaskManager 的 vCore 数 yarn.containers.vcores: 2 ``` - **命令行覆盖**: ```bash ./bin/flink run \ -Dyarn.containers.vcores=2 \ ... ``` #### 2. **Kubernetes 部署模式** Flink on Kubernetes 时,资源通过 Pod 的 `resources` 字段定义。 - **自定义资源配置文件**(如 `kubernetes.yaml`): ```yaml apiVersion: flink.apache.org/v1beta1 kind: FlinkDeployment metadata: name: flink-job spec: taskManager: resource: memory: "4096Mi" cpu: 2 # 指定 TaskManager 的 CPU 核数 jobManager: resource: memory: "2048Mi" cpu: 1 # 指定 JobManager 的 CPU 核数 ``` - **命令行启动**: ```bash kubectl apply -f kubernetes.yaml ``` #### 3. **Standalone 模式** 在独立集群中,资源通过 Flink 配置文件直接分配。 - **配置 `flink-conf.yaml`**: ```yaml # JobManager 内存 jobmanager.memory.process.size: 2048m # TaskManager 内存 taskmanager.memory.process.size: 4096m # TaskManager 的 Slot 数量(间接影响 CPU 使用) taskmanager.numberOfTaskSlots: 2 ``` --- ### 三、配置验证与调优 #### 1. **资源分配规则** - **YARN/Kubernetes**:实际分配的容器资源需满足 `内存Flink 配置值 + 系统开销`(通常额外预留 10%~20%)。 - **CPU 核数与 Slot 数**:一个 Slot 默认绑定一个线程,建议 `Slot 数 ≤ CPU 核数` 以避免过度竞争。 #### 2. **查看运行时资源** - **Flink Web UI**: - 进入 `Task Managers` 标签页,查看每个 TaskManager 的 `Allocated Resources`。 - 确认 `Total Process Memory` 和 `CPU Cores` 是否符合预期。 - **YARN 命令**: ```bash yarn application -status <ApplicationID> ``` #### 3. **常见问题与规避** - **问题 1**:容器因内存不足被 Kill。 - **解决**:增大容器内存并预留系统开销(如从 `4g` 调整为 `5g`)。 - **问题 2**:CPU 核数不足导致吞吐量低。 - **解决**:增加 `yarn.containers.vcores` 或 Kubernetes Pod 的 `cpu` 值,并确保 Slot 数匹配。 --- ### 四、完整配置示例(YARN 模式) ```bash ./bin/flink run \ -m yarn-cluster \ -yjm 2048m \ # JobManager 内存 2GB -ytm 4096m \ # TaskManager 内存 4GB -D yarn.containers.vcores=2 \ # 每个容器 2 个 vCore -c com.example.MainJob \ /path/to/job.jar ``` --- ### 五、总结 - **内存配置**:通过 `-yjm`/`-ytm`(YARN)或 `taskmanager.memory.process.size`(Standalone/K8s)控制。 - **CPU 核数**:在 YARN 中通过 `yarn.containers.vcores` 指定,在 Kubernetes 中通过 Pod 的 `cpu` 字段定义。 - **调优原则**:根据实际负载动态调整,避免资源不足或浪费。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值