HSSFWorkbook写入HDFS时报IOUtils类NoSuchMethodError如何解决?
问题根因
该报错属于典型的依赖版本冲突问题:
- 你当前使用的Apache POI版本依赖
commons-io 2.7及以上版本,只有该版本范围的commons-io才提供IOUtils.byteArray(int)方法 - Hadoop、Oozie运行环境默认内置了低版本的commons-io(通常为2.4及以下),Java类加载时会优先加载环境内置的低版本依赖,缺失POI需要的方法,因此触发报错。该问题和你写入HDFS的代码逻辑无关,两种写入方式触发同样报错也验证了这一点。
解决方案
下面三种方案可根据实际场景选择:
方案1:调整Oozie任务类加载优先级(最适配当前场景)
在Oozie工作流的配置节点中添加以下配置,让任务优先加载你自己打包的依赖,覆盖集群内置的旧版本:
<configuration> <property> <name>mapreduce.job.user.classpath.first</name> <value>true</value> </property> <property> <name>oozie.launcher.mapreduce.job.user.classpath.first</name> <value>true</value> </property> </configuration>
同时需要用Maven的assembly或shade插件将对应版本的commons-io打进你的提交jar包中。
方案2:降级POI版本适配集群依赖
如果不想修改集群任务配置,可以将POI版本降级到4.1.2,该版本POI兼容commons-io 2.4,不会调用高版本专属方法,可直接适配多数Hadoop集群内置的commons-io版本。
方案3:shade重定向依赖包(无侵入通用方案)
如果不想调整POI版本也不想修改集群配置,可以用Maven shade插件将你工程依赖的commons-io包重命名,彻底避免和集群内置的同名包冲突,配置示例如下:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <relocations> <relocation> <pattern>org.apache.commons.io</pattern> <shadedPattern>my.shaded.org.apache.commons.io</shadedPattern> </relocation> </relocations> </configuration> </execution> </executions> </plugin>
内容的提问来源于stack exchange,提问作者gjin
相关产品推荐
相关产品推荐

