Hi Kedar,

There is this section in the Flink docs: 
https://ci.apache.org/projects/flink/flink-docs-master/monitoring/debugging_classloading.html
 
<https://ci.apache.org/projects/flink/flink-docs-master/monitoring/debugging_classloading.html>

Best,
Aljoscha

> On 10. Mar 2018, at 05:53, kedar mhaswade <kedar.mhasw...@gmail.com> wrote:
> 
> This is an interesting question and it usually has consequences that are 
> far-reaching in user experience.
> 
> If a Flink app is supposed to be a "standalone app" that any Flink 
> installation should be able to run, then the child-first classloading makes 
> sense. This is how we build many of the Java application servers (e.g. 
> GlassFish, JBoss etc). Doing this makes the application "self-contained" and 
> perhaps portable. Of course, this increases the size of the Jar. The one 
> issue to watch out for is application using framework classes that are newer 
> than framework itself. For instance, should I expect my app with Flink 1.6 
> DataSet/DataStream classes to run smoothly on a Flink 1.5 installation?
> 
> If a Flink app depends on a particular (version of the) Flink installation, 
> then, if using parent-first classloading, the app can make use of the classes 
> that the installation itself uses. This makes the app (comparatively) less 
> self-contained, but this limits the size of the app's Jar. There are 
> advantages of doing this, but it poses problems especially in upgrades.
> 
> Whether one or the other should be the behavior largely depends on how the 
> applications are built, tested, and deployed. Application's build comes into 
> picture because in tools like Maven a dependency can be declared to be 
> "provided" which means if you know that your app's dependency is also your 
> framework's (i.e. Flink) dependency and you, as an app developer, are okay 
> with that Maven wouldn't bundle it in your app's Jar.
> 
> So, my recommendation is that since this appears like a backward incompatible 
> change, Flink should provide an option to go back to parent-first 
> classloading for a given app, at least for 1.5. Child-first classloading 
> seems like the right thing to do given how (unnecessarily) complicated the 
> deployments have become and given how frequently apps use library versions 
> that are different from the framework. 
> 
> ElasticSearch solution has merits too, but it is unclear if it helps at 
> deployment time merely to identify that there is a duplicate (without knowing 
> where it has come from). Ideally, when people build the so-called shadow Jar 
> (one Jar with all dependencies) the build script should warn of the 
> duplicates. Shadow Jars alleviate (but do not remove) the problems of "Jar 
> Hell". But it seems to me that till we move to a modular Java (that is Java 
> 9; I think this is way out in future), this is the preferred solution.
> 
> That said, I'd really like to see a classloading section in Flink docs 
> (somewhere in dev/best_practices.html). Is a JIRA in order?
> 
> Regards,
> Kedar
> 
> On Fri, Mar 9, 2018 at 1:52 PM, Stephan Ewen <ewenstep...@gmail.com 
> <mailto:ewenstep...@gmail.com>> wrote:
> @Ken very interesting thought.
> 
> One for have three options:
>   - forbid duplicate classes
>   - parent first conflict resolution
>   - child first conflict resolution
> 
> Having number one as the default and let the error message suggest options 
> two and three as options would definitely make users aware of the issue...
> 
> On Fri, Mar 9, 2018, 21:09 Ken Krugler <kkrugler_li...@transpac.com 
> <mailto:kkrugler_li...@transpac.com>> wrote:
> I can’t believe I’m suggesting this, but perhaps the Elasticsearch “Hammer of 
> Thor” (aka “jar hell”) approach would be appropriate here.
> 
> Basically they prevent a program from running if there are duplicate classes 
> on the classpath.
> 
> This causes headaches when you really need a different version of library X, 
> and that’s already on the class path.
> 
> See https://github.com/elastic/elasticsearch/issues/14348 
> <https://github.com/elastic/elasticsearch/issues/14348> for an example of the 
> issues it can cause.
> 
> But it definitely catches a lot of oops-ish mistakes in building the jars, 
> and makes debugging easier (they print out “class X jar1: <path to jar> jar2: 
> <path to jar>”).
> 
>> Caused by: java.lang.IllegalStateException: jar hell!
>> class: jdk.packager.services.UserJvmOptionsService
>> jar1: 
>> /Library/Java/JavaVirtualMachines/jdk1.8.0_66.jdk/Contents/Home/lib/ant-javafx.jar
>> jar2: 
>> /Library/Java/JavaVirtualMachines/jdk1.8.0_66.jdk/Contents/Home/lib/packager.jar
> 
> — Ken
> 
> 
>> On Mar 9, 2018, at 3:21 AM, Stephan Ewen <se...@apache.org 
>> <mailto:se...@apache.org>> wrote:
>> 
>> Hi all!
>> 
>> Flink 1.4 introduces child-first classloading by default, for the 
>> application libraries.
>> 
>> We added that, because it allows applications to use different versions of 
>> many libraries, compared to what Flink uses in its core, or compared to what 
>> other dependencies (like Hadoop) pull into the class path.
>> 
>> For example, applications can use different versions of akka, Avro, 
>> Protobuf, etc. Compared to what Flink / Hadoop / etc. uses.
>> 
>> Now, while that is nice, child-first classloading runs into trouble when the 
>> application jars are not properly built, meaning when the application JAR 
>> contains libraries that it should not (because they are already in the 
>> classpath / lib folder).
>> 
>> For example, when the class path has the Kafka Connector (connector is in 
>> the lib directory) and the application jar also contains Kafka, the we get 
>> nasty errors due to class duplication and impossible class casts (X cannot 
>> be cast to X).
>> 
>> 
>> What I would like to understand is how this change worked out for the users. 
>> Based on that, we can keep this or revert this change in the next release.
>> 
>> Please answer to this mail with:
>> 
>>   a. This was a great change, keep it and polish it.
>> 
>>   b. This caused in the end more problems than it solved, so please set the 
>> default back to "parent-first" in 1.5 and leave "child-first" as an optional 
>> flag.
>> 
>> 
>> Thanks a lot,
>> Stephan
>> 
> 
> --------------------------------------------
> http://about.me/kkrugler <http://about.me/kkrugler>
> +1 530-210-6378 <tel:(530)%20210-6378>
> 

Reply via email to