解决 Hadoop 集群执行包含 third-part lib 的 jar包的 ClassNotFoundException 问题

来源:互联网 发布:东三环java培训 编辑:程序博客网 时间:2024/05/02 04:19

1 异常信息

WordCount 的 maven 工程包含一些第三方的 lib,打包 package 之后的 jar 包放到 Hadoop 集群执行时报如下异常Class/File NotFoundException:

这里写图片描述

使用 jd-gui 反编译生成的 jar 包,也可发现没有包含 guava:

这里写图片描述

但 maven工程的 External Libraries 里包含 guava 的依赖:

这里写图片描述

所以,问题出在 maven 打包的时候由于有的第三方包相互依赖而导致没有包含进来。

2 解决方案

pom.xml 文件中添加如下插件:

<build>        <plugins>            <!--指定主函数和各个依赖-->            <plugin>                <artifactId>maven-assembly-plugin</artifactId>                <version>2.2</version>                <configuration>                    <archive>                        <manifest>                        <!-- 指定 main 函数的类 -->                            <mainClass>com.markliu.hadoop.mapreduce.WordCount</mainClass>                        </manifest>                    </archive>                    <descriptorRefs>                        <descriptorRef>jar-with-dependencies</descriptorRef>                    </descriptorRefs>                </configuration>                <executions>                    <execution>                        <id>make-assembly</id>                        <phase>package</phase>                        <goals>                            <!-- 不是 shade -->                            <goal>single</goal>                        </goals>                    </execution>                </executions>            </plugin>        </plugins>    </build>

maven 重新 clean、package,可发现已经添加过得包自动跳过:

这里写图片描述

上传到集群执行的结果:

这里写图片描述

Done!

0 0
原创粉丝点击