Hi Yun,

Yes, I will check how these classes are getting included. 

I do see the below coming in from a Kafka-Streams dependency being used for 
another module.

org.rocksdb:rocksdbjni:jar:5.18.4:compile

Thanks,
Sandip


> On 10-Aug-2021, at 8:22 AM, Yun Tang <myas...@live.com> wrote:
> 
> Hi Sandeep,
> 
> I'm afraid that it's because the configuration of your maven plugins like 
> maven-assembly or maven-shaded to include the classes.
> 
> Best
> Yun Tang
> From: Sandeep khanzode <sand...@shiftright.ai>
> Sent: Saturday, August 7, 2021 10:20
> To: Yun Tang <myas...@live.com>
> Cc: Stephan Ewen <se...@apache.org>; user <user@flink.apache.org>
> Subject: Re: Bloom Filter - RocksDB - LinkageError Classloading
>  
> Hi Yun,
> 
> You are right. This is what I see in my application JAR … 
> 
> Does this mean that the Rocks DB dependency is still getting packaged in my 
> application JAR and this is what is causing the issue?
> 
> I have made the scope as Provided for that dependency. Is it being 
> transitively pulled in? All my Flink dependencies are set to Provided in 
> Maven.
> 
> <Screenshot 2021-08-07 at 7.47.58 AM.png>
> 
> <Screenshot 2021-08-07 at 7.48.42 AM.png>
> 
>> On 06-Aug-2021, at 7:58 AM, Yun Tang <myas...@live.com 
>> <mailto:myas...@live.com>> wrote:
>> 
>> Hi Sandeep,
>> 
>> If you set the flink-statebackend-rocksdb as provided scope, it should not 
>> include the org.rocksdb classes, have you ever checked your application jar 
>> package directly just as what I described?
>> 
>> 
>> Best
>> Yun Tang
>> From: Sandeep khanzode <sand...@shiftright.ai <mailto:sand...@shiftright.ai>>
>> Sent: Friday, August 6, 2021 2:04
>> To: Stephan Ewen <se...@apache.org <mailto:se...@apache.org>>
>> Cc: user <user@flink.apache.org <mailto:user@flink.apache.org>>; Yun Tang 
>> <myas...@live.com <mailto:myas...@live.com>>
>> Subject: Re: Bloom Filter - RocksDB - LinkageError Classloading
>>  
>> Hello Stephan, Yun,
>> 
>> Thanks for your insights.
>> 
>> All I have added is this:
>> <dependency>
>>     <groupId>org.apache.flink</groupId>
>>     <artifactId>flink-statebackend-rocksdb_2.12</artifactId>
>>     <version>${flink.version}</version>
>>     <scope>provided</scope>
>> </dependency>
>> 
>> No other library explicitly added. I am assuming, as mentioned, is that the 
>> flink-dist.jar already contains the relevant classes and the App or parent 
>> class loader loads the Rocks DB classes. All other Flink dependencies are 
>> packaged as Maven - Provided.
>> 
>> Moving to parent-first gives the Spring Framework serialisation issues … I 
>> will take a look at that …
>> 
>> I thought it would be simpler to simply specify Bloom Filters as an option … 
>> 
>> Maybe, I will have to remove Spring dependency … 
>> 
>> 
>> Thanks,
>> Sandip
>> 
>> 
>> 
>>> On 05-Aug-2021, at 5:55 PM, Stephan Ewen <se...@apache.org 
>>> <mailto:se...@apache.org>> wrote:
>>> 
>>> @Yun Tang
>>> 
>>> Our FRocksDB has the same java package names (org.rocksdb.). Adding 
>>> 'org.rocksdb' to parent-first patterns ensures it will be loaded only once, 
>>> and not accidentally multiple times (as Child-first classloading does).
>>> 
>>> The RocksDB code here is a bit like Flink internal components, which we 
>>> always force parent-first (everything that starts with "org.apache.fink.").
>>> 
>>> To use RocksDB from the application jar, I think you would need to remove 
>>> the RocksDB state backend from the classpath (lib folder), or you get 
>>> exactly the error reported above.
>>> 
>>> I cannot think of a downside to add RocksDB to the parent first patterns.
>>> 
>>> On Thu, Aug 5, 2021 at 10:04 AM Yun Tang <myas...@live.com 
>>> <mailto:myas...@live.com>> wrote:
>>> Hi Stephan,
>>> 
>>> Since we use our own FRocksDB instead of the original RocksDB as 
>>> dependency, I am not sure whether this problem has relationship with this. 
>>> From my knowledge, more customers would include Flink classes within the 
>>> application jar package, and it might cause problems if the client has 
>>> different flink version with servers.
>>> 
>>> 
>>> Best,
>>> Yun Tang
>>> From: Stephan Ewen <se...@apache.org <mailto:se...@apache.org>>
>>> Sent: Wednesday, August 4, 2021 19:10
>>> To: Yun Tang <myas...@live.com <mailto:myas...@live.com>>
>>> Cc: Sandeep khanzode <sand...@shiftright.ai 
>>> <mailto:sand...@shiftright.ai>>; user <user@flink.apache.org 
>>> <mailto:user@flink.apache.org>>
>>> Subject: Re: Bloom Filter - RocksDB - LinkageError Classloading
>>>  
>>> @Yun Tang Does it make sense to add RocksDB to the "always parent-first 
>>> options" to avoid these kind of errors when users package apps incorrectly?
>>> My feeling is that these packaging errors occur very frequently.
>>> 
>>> 
>>> On Wed, Aug 4, 2021 at 10:41 AM Yun Tang <myas...@live.com 
>>> <mailto:myas...@live.com>> wrote:
>>> Hi Sandeep,
>>> 
>>> Did you include the RocksDB classes in the application jar package? You can 
>>> unpark your jar package to check whether them existed.
>>> If so, since RocksDB classes are already included in the flink-dist 
>>> package, you don't need to include them in your jar package (maybe you 
>>> explicitly added the dependency of org.rocksdb:rocksdbjni in your pom).
>>> 
>>> Best
>>> Yun Tang
>>> From: Sandeep khanzode <sand...@shiftright.ai 
>>> <mailto:sand...@shiftright.ai>>
>>> Sent: Wednesday, August 4, 2021 11:54
>>> To: user <user@flink.apache.org <mailto:user@flink.apache.org>>
>>> Subject: Bloom Filter - RocksDB - LinkageError Classloading
>>>  
>>> Hello,
>>> 
>>> I tried to add the bloom filter functionality as mentioned here:
>>> https://ci.apache.org/projects/flink/flink-docs-release-1.11/api/java/org/apache/flink/contrib/streaming/state/RocksDBOptionsFactory.html
>>>  
>>> <https://ci.apache.org/projects/flink/flink-docs-release-1.11/api/java/org/apache/flink/contrib/streaming/state/RocksDBOptionsFactory.html>
>>> 
>>>  rocksDbBackend.setRocksDBOptions(new RocksDBOptionsFactory() {
>>> 
>>>     public DBOptions createDBOptions(DBOptions currentOptions, 
>>> Collection<AutoCloseable> handlesToClose) {
>>>             return currentOptions.setMaxOpenFiles(1024);
>>>     }
>>> 
>>>     public ColumnFamilyOptions createColumnOptions(ColumnFamilyOptions 
>>> currentOptions, Collection<AutoCloseable> handlesToClose) {
>>>             BloomFilter bloomFilter = new BloomFilter();
>>>                     handlesToClose.add(bloomFilter);
>>> 
>>>                     return currentOptions
>>>                                     .setTableFormatConfig(
>>>                                                     new 
>>> BlockBasedTableConfig().setFilter(bloomFilter));
>>>     }
>>>  });
>>> 
>>> This is in the main class where we setup in the StreamExecutionEnvironment …
>>> 
>>> I get ClassLoading errors due to that ...
>>> Caused by: java.lang.LinkageError: loader constraint violation: loader 
>>> org.apache.flink.util.ChildFirstClassLoader @1169afe1 wants to load class 
>>> org.rocksdb.ColumnFamilyOptions. A different class with the same name was 
>>> previously loaded by 'app'. (org.rocksdb.ColumnFamilyOptions is in unnamed 
>>> module of loader 'app')
>>> 
>>> 
>>> What is documented is to change the order to parent-first in the 
>>> flink-conf.yaml … but then I get different issues for the basic/core Spring 
>>> Framework classes not being serializable …
>>> 
>>> Any help will be appreciated.
>>> 
>>> Thanks,
>>> Sandip

Reply via email to