You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@flink.apache.org by Puneet Duggal <pu...@gmail.com> on 2021/09/13 11:49:37 UTC

JVM Metaspace capacity planning

Hi,

So on going through multiple resources, got basic idea that JVM Metaspace is used by flink class loader to load class metadata which is used to create objects in heap. Also this is a one time activity since all the objects of single class require single class metadata object in JVM Metaspace. 

But while deploying multiple jobs on task manager, i saw almost linear increase in consumption of metaspace (irrespective of parallelism). Even if those multiple jobs have exactly same implementation. So wanted to confirm if each job in flink has its own class loader which loads required classes in Task Manager JVM Metaspace.

PS: Any documentation for this will be of great help.

Thanks,
Puneet

Re: JVM Metaspace capacity planning

Posted by Puneet Duggal <pu...@gmail.com>.
Thank you guys, this documentation exactly lists out the issues that i am facing. 

> On 14-Sep-2021, at 2:14 PM, Guowei Ma <gu...@gmail.com> wrote:
> 
> Hi, Puneet
> In general every job  has its own classloader. You could find more detailed information from doc [1].
> You could put some common jar into the "/lib" to avoid this [2].
> 
> [1] https://nightlies.apache.org/flink/flink-docs-release-1.13/docs/ops/debugging/debugging_classloading/ <https://nightlies.apache.org/flink/flink-docs-release-1.13/docs/ops/debugging/debugging_classloading/>
> [2] https://nightlies.apache.org/flink/flink-docs-release-1.13/docs/ops/debugging/debugging_classloading/#avoiding-dynamic-classloading-for-user-code <https://nightlies.apache.org/flink/flink-docs-release-1.13/docs/ops/debugging/debugging_classloading/#avoiding-dynamic-classloading-for-user-code>
> 
> Best,
> Guowei
> 
> 
> On Mon, Sep 13, 2021 at 10:06 PM Puneet Duggal <puneetduggal1795@gmail.com <ma...@gmail.com>> wrote:
> Hi,
> 
> Thank you for quick reply. So in my case i am using Datastream Apis.Each job is a real time processing engine which consumes data from kafka and performs some processing on top of it before ingesting into sink.
> 
> JVM Metaspace size earlier set was around 256MB (default) which i had to increase to 3GB so that ~30 parallel jobs can run simultaneously on single task manager.
> 
> Regards,
> Puneet
> 
>> On 13-Sep-2021, at 5:46 PM, Caizhi Weng <tsreaper96@gmail.com <ma...@gmail.com>> wrote:
>> 
>> Hi!
>> 
>> Which API are you using? The datastream API or the Table / SQL API? If it is the Table / SQL API then some Java classes for some operators (for example aggregations, projection, filter, etc.) will be generated when compiling user code to executable Java code. These Java classes are new to the JVM. So if you're running too many jobs in the same Flink cluster a metaspace OOM might occur. There is already a JIRA ticket for this [1].
>> 
>> I don't know much about the behavior of class loaders, so I'll wait for others to apply in this aspect.
>> 
>> [1] https://issues.apache.org/jira/browse/FLINK-15024 <https://issues.apache.org/jira/browse/FLINK-15024>
>> Puneet Duggal <puneetduggal1795@gmail.com <ma...@gmail.com>> 于2021年9月13日周一 下午7:49写道:
>> Hi,
>> 
>> So on going through multiple resources, got basic idea that JVM Metaspace is used by flink class loader to load class metadata which is used to create objects in heap. Also this is a one time activity since all the objects of single class require single class metadata object in JVM Metaspace. 
>> 
>> But while deploying multiple jobs on task manager, i saw almost linear increase in consumption of metaspace (irrespective of parallelism). Even if those multiple jobs have exactly same implementation. So wanted to confirm if each job in flink has its own class loader which loads required classes in Task Manager JVM Metaspace.
>> 
>> PS: Any documentation for this will be of great help.
>> 
>> Thanks,
>> Puneet
> 


Re: JVM Metaspace capacity planning

Posted by Guowei Ma <gu...@gmail.com>.
Hi, Puneet
In general every job  has its own classloader. You could find more detailed
information from doc [1].
You could put some common jar into the "/lib" to avoid this [2].

[1]
https://nightlies.apache.org/flink/flink-docs-release-1.13/docs/ops/debugging/debugging_classloading/
[2]
https://nightlies.apache.org/flink/flink-docs-release-1.13/docs/ops/debugging/debugging_classloading/#avoiding-dynamic-classloading-for-user-code

Best,
Guowei


On Mon, Sep 13, 2021 at 10:06 PM Puneet Duggal <pu...@gmail.com>
wrote:

> Hi,
>
> Thank you for quick reply. So in my case i am using Datastream Apis.Each
> job is a real time processing engine which consumes data from kafka and
> performs some processing on top of it before ingesting into sink.
>
> JVM Metaspace size earlier set was around 256MB (default) which i had to
> increase to 3GB so that ~30 parallel jobs can run simultaneously on single
> task manager.
>
> Regards,
> Puneet
>
> On 13-Sep-2021, at 5:46 PM, Caizhi Weng <ts...@gmail.com> wrote:
>
> Hi!
>
> Which API are you using? The datastream API or the Table / SQL API? If it
> is the Table / SQL API then some Java classes for some operators (for
> example aggregations, projection, filter, etc.) will be generated when
> compiling user code to executable Java code. These Java classes are new to
> the JVM. So if you're running too many jobs in the same Flink cluster a
> metaspace OOM might occur. There is already a JIRA ticket for this [1].
>
> I don't know much about the behavior of class loaders, so I'll wait for
> others to apply in this aspect.
>
> [1] https://issues.apache.org/jira/browse/FLINK-15024
>
> Puneet Duggal <pu...@gmail.com> 于2021年9月13日周一 下午7:49写道:
>
>> Hi,
>>
>> So on going through multiple resources, got basic idea that JVM Metaspace
>> is used by flink class loader to load class metadata which is used to
>> create objects in heap. Also this is a one time activity since all the
>> objects of single class require single class metadata object in JVM
>> Metaspace.
>>
>> But while deploying multiple jobs on task manager, i saw almost linear
>> increase in consumption of metaspace (irrespective of parallelism). Even if
>> those multiple jobs have exactly same implementation. So wanted to confirm
>> if each job in flink has its own class loader which loads required classes
>> in Task Manager JVM Metaspace.
>>
>> PS: Any documentation for this will be of great help.
>>
>> Thanks,
>> Puneet
>
>
>

Re: JVM Metaspace capacity planning

Posted by Puneet Duggal <pu...@gmail.com>.
Hi,

Thank you for quick reply. So in my case i am using Datastream Apis.Each job is a real time processing engine which consumes data from kafka and performs some processing on top of it before ingesting into sink.

JVM Metaspace size earlier set was around 256MB (default) which i had to increase to 3GB so that ~30 parallel jobs can run simultaneously on single task manager.

Regards,
Puneet

> On 13-Sep-2021, at 5:46 PM, Caizhi Weng <ts...@gmail.com> wrote:
> 
> Hi!
> 
> Which API are you using? The datastream API or the Table / SQL API? If it is the Table / SQL API then some Java classes for some operators (for example aggregations, projection, filter, etc.) will be generated when compiling user code to executable Java code. These Java classes are new to the JVM. So if you're running too many jobs in the same Flink cluster a metaspace OOM might occur. There is already a JIRA ticket for this [1].
> 
> I don't know much about the behavior of class loaders, so I'll wait for others to apply in this aspect.
> 
> [1] https://issues.apache.org/jira/browse/FLINK-15024 <https://issues.apache.org/jira/browse/FLINK-15024>
> Puneet Duggal <puneetduggal1795@gmail.com <ma...@gmail.com>> 于2021年9月13日周一 下午7:49写道:
> Hi,
> 
> So on going through multiple resources, got basic idea that JVM Metaspace is used by flink class loader to load class metadata which is used to create objects in heap. Also this is a one time activity since all the objects of single class require single class metadata object in JVM Metaspace. 
> 
> But while deploying multiple jobs on task manager, i saw almost linear increase in consumption of metaspace (irrespective of parallelism). Even if those multiple jobs have exactly same implementation. So wanted to confirm if each job in flink has its own class loader which loads required classes in Task Manager JVM Metaspace.
> 
> PS: Any documentation for this will be of great help.
> 
> Thanks,
> Puneet


Re: JVM Metaspace capacity planning

Posted by Caizhi Weng <ts...@gmail.com>.
Hi!

Which API are you using? The datastream API or the Table / SQL API? If it
is the Table / SQL API then some Java classes for some operators (for
example aggregations, projection, filter, etc.) will be generated when
compiling user code to executable Java code. These Java classes are new to
the JVM. So if you're running too many jobs in the same Flink cluster a
metaspace OOM might occur. There is already a JIRA ticket for this [1].

I don't know much about the behavior of class loaders, so I'll wait for
others to apply in this aspect.

[1] https://issues.apache.org/jira/browse/FLINK-15024

Puneet Duggal <pu...@gmail.com> 于2021年9月13日周一 下午7:49写道:

> Hi,
>
> So on going through multiple resources, got basic idea that JVM Metaspace
> is used by flink class loader to load class metadata which is used to
> create objects in heap. Also this is a one time activity since all the
> objects of single class require single class metadata object in JVM
> Metaspace.
>
> But while deploying multiple jobs on task manager, i saw almost linear
> increase in consumption of metaspace (irrespective of parallelism). Even if
> those multiple jobs have exactly same implementation. So wanted to confirm
> if each job in flink has its own class loader which loads required classes
> in Task Manager JVM Metaspace.
>
> PS: Any documentation for this will be of great help.
>
> Thanks,
> Puneet