多个类加载器和Hadoop API

时间:2019-02-01 21:31:55

标签: java hadoop classloader

我们的应用程序具有多个类加载器。这是为了避免各种API之间的依赖关系的冲突,我们的软件访问,包括但不限于Hadoop的。如果不使用多类加载器策略(或Java 9个模块,我们还不能支持),我们遇到了很多Hadoop的罐子和其他一切之间的依赖关系的冲突。所以,我只想说,我们对所有Hadoop的罐子其他两组库的URLClassLoader的,和其他的类加载器。

问题是这样的:系统类加载器(JVM用来启动的类加载器)没有Hadoop jar。这意味着线程上下文类加载器(默认情况下是系统类加载器)没有Hadoop jar。不幸的是,各种Hadoop API似乎隐式使用了线程上下文的类加载器,这导致了各种形式的ClassNotFound错误,ServiceLoader返回空列表,工厂未找到实现等。这使我们慢慢发狂,因为新的“未找到” ”问题偶尔会突然出现在现场为我们的客户发现新的安全选项和其他配置变种,从而导致下跌的代码路径是无法找到的接口的类或实现。

您可能会发现一个明显的事实:始终将线程上下文类加载器设置为Hadoop类加载器。不幸的是,这似乎不是解决方案。首先,生成具有默认系统类加载器作为线程上下文类加载器的线程,而我无法控制所有这些线程。其次,在每个可能的Hadoop入口点保存和还原线程上下文类加载器很容易出错,并且可能太昂贵了。

我找到的唯一答案是通过反复试验来了解哪些类是由线程上下文类加载器(或ServiceLoader)加载的,并强制它们在我设置线程的位置预加载-上下文类加载器。有没有更好的办法?会出现这种类别的列表?

这是示例堆栈跟踪:

Error:ProcessNode(PSOutput16): org/apache/hadoop/fs/FileSystem.create:java.io.IOException: org.apache.hadoop.yarn.exceptions.YarnRuntimeException: Failed to load class: [org.apache.hadoop.yarn.api.records.impl.pb.ApplicationIdPBImpl]
org.apache.hadoop.crypto.key.kms.KMSClientProvider.createConnection(KMSClientProvider.java:468)
org.apache.hadoop.crypto.key.kms.KMSClientProvider.decryptEncryptedKey(KMSClientProvider.java:754)
org.apache.hadoop.crypto.key.kms.LoadBalancingKMSClientProvider$5.call(LoadBalancingKMSClientProvider.java:287)
org.apache.hadoop.crypto.key.kms.LoadBalancingKMSClientProvider$5.call(LoadBalancingKMSClientProvider.java:283)
org.apache.hadoop.crypto.key.kms.LoadBalancingKMSClientProvider.doOp(LoadBalancingKMSClientProvider.java:123)
org.apache.hadoop.crypto.key.kms.LoadBalancingKMSClientProvider.decryptEncryptedKey(LoadBalancingKMSClientProvider.java:283)
org.apache.hadoop.crypto.key.KeyProviderCryptoExtension.decryptEncryptedKey(KeyProviderCryptoExtension.java:528)
org.apache.hadoop.hdfs.DFSClient.decryptEncryptedDataEncryptionKey(DFSClient.java:1484)
org.apache.hadoop.hdfs.DFSClient.createWrappedOutputStream(DFSClient.java:1586)
org.apache.hadoop.hdfs.DFSClient.createWrappedOutputStream(DFSClient.java:1571)
org.apache.hadoop.hdfs.DistributedFileSystem$7.doCall(DistributedFileSystem.java:440)
org.apache.hadoop.hdfs.DistributedFileSystem$7.doCall(DistributedFileSystem.java:433)
org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81)
org.apache.hadoop.hdfs.DistributedFileSystem.create(DistributedFileSystem.java:433)
org.apache.hadoop.hdfs.DistributedFileSystem.create(DistributedFileSystem.java:374)
org.apache.hadoop.fs.FileSystem.create(FileSystem.java:926)
org.apache.hadoop.fs.FileSystem.create(FileSystem.java:907)
Caused by: org.apache.hadoop.yarn.exceptions.YarnRuntimeException: Failed to load class: [org.apache.hadoop.yarn.api.records.impl.pb.ApplicationIdPBImpl]
org.apache.hadoop.yarn.factories.impl.pb.RecordFactoryPBImpl.newRecordInstance(RecordFactoryPBImpl.java:58)
org.apache.hadoop.yarn.util.Records.newRecord(Records.java:36)
org.apache.hadoop.yarn.api.records.ApplicationId.newInstance(ApplicationId.java:49)
org.apache.hadoop.yarn.security.AMRMTokenIdentifier.readFields(AMRMTokenIdentifier.java:83)
org.apache.hadoop.security.token.Token.decodeIdentifier(Token.java:145)
org.apache.hadoop.security.token.Token.identifierToString(Token.java:349)
org.apache.hadoop.security.token.Token.toString(Token.java:369)
java.lang.String.valueOf(String.java:2994)
java.lang.StringBuilder.append(StringBuilder.java:131)
org.apache.hadoop.security.UserGroupInformation.logAllUserInfo(UserGroupInformation.java:1959)
org.apache.hadoop.crypto.key.kms.KMSClientProvider.getActualUgi(KMSClientProvider.java:1056)
org.apache.hadoop.crypto.key.kms.KMSClientProvider.createConnection(KMSClientProvider.java:451)
org.apache.hadoop.crypto.key.kms.KMSClientProvider.decryptEncryptedKey(KMSClientProvider.java:754)
org.apache.hadoop.crypto.key.kms.LoadBalancingKMSClientProvider$5.call(LoadBalancingKMSClientProvider.java:287)
org.apache.hadoop.crypto.key.kms.LoadBalancingKMSClientProvider$5.call(LoadBalancingKMSClientProvider.java:283)
org.apache.hadoop.crypto.key.kms.LoadBalancingKMSClientProvider.doOp(LoadBalancingKMSClientProvider.java:123)
org.apache.hadoop.crypto.key.kms.LoadBalancingKMSClientProvider.decryptEncryptedKey(LoadBalancingKMSClientProvider.java:283)
org.apache.hadoop.crypto.key.KeyProviderCryptoExtension.decryptEncryptedKey(KeyProviderCryptoExtension.java:528)
org.apache.hadoop.hdfs.DFSClient.decryptEncryptedDataEncryptionKey(DFSClient.java:1484)
org.apache.hadoop.hdfs.DFSClient.createWrappedOutputStream(DFSClient.java:1586)
org.apache.hadoop.hdfs.DFSClient.createWrappedOutputStream(DFSClient.java:1571)
org.apache.hadoop.hdfs.DistributedFileSystem$7.doCall(DistributedFileSystem.java:440)
org.apache.hadoop.hdfs.DistributedFileSystem$7.doCall(DistributedFileSystem.java:433)
org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81)
org.apache.hadoop.hdfs.DistributedFileSystem.create(DistributedFileSystem.java:433)
org.apache.hadoop.hdfs.DistributedFileSystem.create(DistributedFileSystem.java:374)
org.apache.hadoop.fs.FileSystem.create(FileSystem.java:926)
org.apache.hadoop.fs.FileSystem.create(FileSystem.java:907)
Caused by: java.lang.ClassNotFoundException: Class org.apache.hadoop.yarn.api.records.impl.pb.ApplicationIdPBImpl not found
org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:2255)
org.apache.hadoop.yarn.factories.impl.pb.RecordFactoryPBImpl.newRecordInstance(RecordFactoryPBImpl.java:56)
org.apache.hadoop.yarn.util.Records.newRecord(Records.java:36)
org.apache.hadoop.yarn.api.records.ApplicationId.newInstance(ApplicationId.java:49)
org.apache.hadoop.yarn.security.AMRMTokenIdentifier.readFields(AMRMTokenIdentifier.java:83)

0 个答案:

没有答案