在将编写的MapReduce程序提交到Hadoop集群中运行时,往往需要导入第三方类库,否则很容易报出:Error: java.lang.ClassNotFoundException:异常,首先说一下以下四种解决方法:
(1) 将第三方jar包放在集群中每个节点$HADOOP_HOME/lib目录下或者JDK的ext目录下,其中$HAOOP_HOME为Hadoop的根目录。
这种方法在linux下还可以写一个shell脚本,用scp或者rcp命令来实现,这脱离了java范畴,依赖操作系统,不好。
(2) 将所有的jar包解压缩,然后把他和源程序的类文件打包到一个jar包中,这种方法比较笨重,可以用程序去实现。
(3) 用DistributedCache .addFileToClassPath(Path file, Configuration conf)或者
DistributedCache .addArchiveToClassPath(Path archive, Configuration conf)
,其中路径是HDFS上的一个路径,不要用HDFS://等类似的路径,而要用相对路径。
(4) 将第三方jar包和源程序类文件打包到一个jar包中,设置manifest.mf的classpath值,为jar包所在的路径,这个路径必须是相对应当前jar包的路径。
原理:
主要借鉴了在提交作业到Haodop中时,hadoop寻找classpath的方式,寻找的地方来解决的。