为了账号安全,请及时绑定邮箱和手机立即绑定

HDFS拼凑文件读取器抛出分布式文件系统.class使用java反射运行时找不到

HDFS拼凑文件读取器抛出分布式文件系统.class使用java反射运行时找不到

慕仙森 2022-09-14 09:44:25
我正在尝试使用Java从远程HDFS文件系统读取镶木地板文件。我为此使用了镶木地板库。这就是我的代码的样子,public Map run( Map inputs ){...            final Configuration conf = new Configuration();            conf.set("fs.hdfs.impl", org.apache.hadoop.hdfs.DistributedFileSystem.class.getName());            conf.set("fs.file.impl", org.apache.hadoop.fs.LocalFileSystem.class.getName());            conf.set("fs.defaultFS", "hdfs://" + connHostName + ":" + connPort);            conf.set("ipc.client.connect.timeout", "10000");            conf.set("ipc.client.connect.max.retries.on.timeouts", "3");            System.setProperty("hadoop.home.dir", "/");            Path path = new Path(filePath);            ParquetMetadata readFooter = ParquetFileReader.readFooter(conf, path, ParquetMetadataConverter.NO_FILTER);            MessageType schema = readFooter.getFileMetaData().getSchema();...}以下是我正在使用的专家依赖项,<dependency>   <groupId>org.apache.parquet</groupId>   <artifactId>parquet-hadoop</artifactId>   <version>1.9.0</version></dependency><dependency>   <groupId>org.apache.hadoop</groupId>   <artifactId>hadoop-client</artifactId>   <version>3.1.0</version></dependency>另外,我尝试添加2个依赖,hadoop核心和hadoop hdfs当我在上面运行镶木地板阅读器代码时,它的工作正常,我面临的问题是当我作为反射运行时。我用它创建了一个胖罐,并向其他程序提供类名以及jar,该程序将使用反射运行。反射代码如下所示,String packageName = "com.mycompany.hdfs.parquet.Parquet";String jarPath = "/Users/.../hdfs-parquet-reader/target/hdfs-parquet-reader-0.0.1-jar-with-dependencies.jar";ClassLoader child = new URLClassLoader(new URL[] { new URL("file://" + jarPath)}, ClassLoader.getSystemClassLoader());Class classToLoad = Class.forName(packageName, true, child);String inputParamsString = "{}";Object obj = classToLoad.newInstance();当我运行上面的代码时,我得到分布式文件系统.class找不到在行,ParquetMetadata readFooter = ParquetFileReader.readFooter(conf, path, ParquetMetadataConverter.NO_FILTER);我构建了胖罐,验证的罐子包含类组织.apache.hdfs.分布式文件系统.class存在于罐子中。另外,我验证了java -cp.jar类名.class是否按预期工作。
查看完整描述

1 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

我自己找到了解决这个问题的方法,

问题出在这里

ClassLoader child = new URLClassLoader(new URL[] { new URL("file://" + jarPath)}, ClassLoader.getSystemClassLoader());

在这里,我正在加载系统类加载器,这导致从最终的类路径中删除依赖库,

我把它改成了

ClassLoader child = new URLClassLoader(new URL[] { new URL("file://" + jarPath)}, Thread.currentThread().getContextClassLoader());

这对我有用。


查看完整回答
反对 回复 2022-09-14
  • 1 回答
  • 0 关注
  • 83 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号