liupengcheng created FLINK-14876:
------------------------------------

             Summary: Putting xercesImpl related classes into 
alwaysParentFirstLoaderPatterns
                 Key: FLINK-14876
                 URL: https://issues.apache.org/jira/browse/FLINK-14876
             Project: Flink
          Issue Type: Improvement
          Components: Runtime / Configuration
    Affects Versions: 1.9.0
         Environment: hadoop2.6

 
            Reporter: liupengcheng


As mentioned in the [9683|[https://github.com/apache/flink/pull/9683]]  , There 
is a issue when running jobs when including flink-shaded-hadoop-2 package while 
changing the `hadoop.version` to our cluster hadoop version.

I reproducing this case, the following exception was reported:
{code:java}
javax.xml.parsers.FactoryConfigurationError: Provider for class 
javax.xml.parsers.DocumentBuilderFactory cannot be 
createdjavax.xml.parsers.FactoryConfigurationError: Provider for class 
javax.xml.parsers.DocumentBuilderFactory cannot be created at 
javax.xml.parsers.FactoryFinder.findServiceProvider(FactoryFinder.java:311) at 
javax.xml.parsers.FactoryFinder.find(FactoryFinder.java:267) at 
javax.xml.parsers.DocumentBuilderFactory.newInstance(DocumentBuilderFactory.java:120)
 at org.apache.hadoop.conf.Configuration.loadResource(Configuration.java:2412) 
at org.apache.hadoop.conf.Configuration.loadResources(Configuration.java:2375) 
at org.apache.hadoop.conf.Configuration.getProps(Configuration.java:2285) at 
org.apache.hadoop.conf.Configuration.get(Configuration.java:892) at 
org.apache.hadoop.mapred.JobConf.checkAndWarnDeprecation(JobConf.java:2010) at 
org.apache.hadoop.mapred.JobConf.<init>(JobConf.java:449) at 
org.apache.hadoop.mapreduce.Job.getInstance(Job.java:186) at 
org.apache.hadoop.mapreduce.Job.getInstance(Job.java:167) at 
org.apache.flink.hadoopcompatibility.scala.HadoopInputs$.readHadoopFile(HadoopInputs.scala:127)
 at 
com.github.ehiggs.spark.terasort.FlinkTeraSort$.main(FlinkTeraSort.scala:76) at 
com.github.ehiggs.spark.terasort.FlinkTeraSort.main(FlinkTeraSort.scala) at 
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 at java.lang.reflect.Method.invoke(Method.java:498) at 
org.apache.flink.client.program.PackagedProgram.callMainMethod(PackagedProgram.java:586)
 at 
org.apache.flink.client.program.PackagedProgram.invokeInteractiveModeForExecution(PackagedProgram.java:448)
 at org.apache.flink.client.program.ClusterClient.run(ClusterClient.java:274) 
at org.apache.flink.client.cli.CliFrontend.executeProgram(CliFrontend.java:746) 
at org.apache.flink.client.cli.CliFrontend.runProgram(CliFrontend.java:273) at 
org.apache.flink.client.cli.CliFrontend.run(CliFrontend.java:205) at 
org.apache.flink.client.cli.CliFrontend.parseParameters(CliFrontend.java:1009) 
at 
org.apache.flink.client.cli.CliFrontend.lambda$main$10(CliFrontend.java:1082) 
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:1886)
 at 
org.apache.flink.runtime.security.HadoopSecurityContext.runSecured(HadoopSecurityContext.java:41)
 at org.apache.flink.client.cli.CliFrontend.main(CliFrontend.java:1082)Caused 
by: java.lang.RuntimeException: Provider for class 
javax.xml.parsers.DocumentBuilderFactory cannot be created at 
javax.xml.parsers.FactoryFinder.findServiceProvider(FactoryFinder.java:308) ... 
30 moreCaused by: java.util.ServiceConfigurationError: 
javax.xml.parsers.DocumentBuilderFactory: Provider 
org.apache.xerces.jaxp.DocumentBuilderFactoryImpl not a subtype at 
java.util.ServiceLoader.fail(ServiceLoader.java:239) at 
java.util.ServiceLoader.access$300(ServiceLoader.java:185) at 
java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:376) at 
java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:404) at 
java.util.ServiceLoader$1.next(ServiceLoader.java:480) at 
javax.xml.parsers.FactoryFinder$1.run(FactoryFinder.java:294) at 
java.security.AccessController.doPrivileged(Native Method) at 
javax.xml.parsers.FactoryFinder.findServiceProvider(FactoryFinder.java:289) ... 
30 more
{code}
I enabled `-vebose:class` for client, and find out that the 
`DocumentBuilderFactoryImpl` class was loaded twice. The first time it was 
loaded is because the flink app starts and initialize the configuration and 
print something, the second time it was loaded is because the calling of 
`HadoopInputs.readHadoopFile` in the user code.
{code:java}
[Loaded javax.xml.parsers.DocumentBuilderFactory from 
/opt/soft/openjdk8u202-b08/jre/lib/rt.jar]
[Loaded org.apache.xerces.jaxp.DocumentBuilderFactoryImpl from 
file:/home/liupengcheng/git/infra-client/bin/packages/common-infra_client-pack-zjyprc-hadoop/bin/packages/zjyprc-hadoop-flink1.9-hadoop-pack-2.6.0-mdh2.6.0.4/share/hadoop/hdfs/lib/xercesImpl-2.9.1.jar]

[Loaded javax.xml.parsers.DocumentBuilderFactory from 
file:/home/liupengcheng/git/infra-client/bin/packages/common-infra_client-pack-zjyprc-hadoop/bin/packages/flink-1.9.0-mdh1.9.0.0-SNAPSHOT/../benchmark-test-1.1-SNAPSHOT-shaded.jar]
[Loaded org.apache.xerces.jaxp.DocumentBuilderFactoryImpl from 
file:/home/liupengcheng/git/infra-client/bin/packages/common-infra_client-pack-zjyprc-hadoop/bin/packages/flink-1.9.0-mdh1.9.0.0-SNAPSHOT/../benchmark-test-1.1-SNAPSHOT-shaded.jar]
{code}
{code:java}
val dataSet = env.createInput(HadoopInputs.readHadoopFile(
  new TeraInputFormat, classOf[Array[Byte]], classOf[Array[Byte]], inputFile))
  .partitionCustom(new FlinkTeraSortPartitioner(new 
TeraSortPartitioner(partitions)), 0)
  .sortPartition(0, Order.ASCENDING)
{code}
when calling `HadoopInputs.readhadoopFile`, it will instantiate `jobConf` and 
call it's `get` method, thus will finally causing the loading of 
`DocumentBuilderFactoryImpl`.

After loading `DocumentBuilderFactoryImpl`, it will try to check whether it's 
subtype of `DocumentBuilderFactory`. Here, it' will report error due to that 
the `DocumentBuilderFacotory` is loaded from `HADOOP_CLASSPATH`, not the user 
code.
{code:java}
public static DocumentBuilderFactory newInstance() {
    return FactoryFinder.find(
            /* The default property name according to the JAXP spec */
            DocumentBuilderFactory.class, // 
"javax.xml.parsers.DocumentBuilderFactory"
            /* The fallback implementation class name */
            
"com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl");
}
{code}
I found that  the `xercesImpl` package was introduced by the 
`flink-shaded-hadoop-2`, because it shaded in `xercesImpl` from hadoop-hdfs 
deps.

 

Moreover, this `xcercesImpl` is included in hadoop-hdfs for all 2.6 ~ 3.0 
versions, I think we can add it to the `alwaysParentFirstPatterns` to avoid 
this problem. 

cc [~aljoscha]



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to