当我们实现了一个Hadoop MapReduce Job以后,而这个Job可能又依赖很多外部的jar文件,在Hadoop集群上运行时,有时会出现找不到具体Class的异常。出现这种问题,基本上就是在Hadoop Job执行过程中,没有从执行的上下文中找到对应的jar文件(实际是unjar的目录,目录里面是对应的Class文件)。所以,我们自然而然想到,正确配置好对应的classpath,MapReduce Job运行时就能够找到。
解决方法:
一、设置HADOOP_CLASSPATH,将Job所依赖的jar文件加载HADOOP_CLASSPATH;
此方法需要将依赖的jar包,上传到各hadoop的分布式节点;
二、运用distributedcach将jar包上传到各节点;
DistributedCache.addFileToClassPath(new Path(conf.get("roaring.bitmap")),conf);
三、将第三方依赖jar包和mapreduce程序打包在一起
解决场景:运行依赖bitmap包的mapreduce时,报BitMap相关的包找不到。
解决办法:用maven将此依赖的第三方jar与mapreduce程序一起打包:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <configuration> <finalName>${project.artifactId}-${project.version}</finalName> <descriptors> <descriptor>src/main/assembly/assembly.xml</descriptor> </descriptors> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin>
四、TableMapReduceUtil.addDependencyJars(job)
应用场景:将hdfs数据导入hbase时,报ClassNotFoundException:org.apache.hadoop.hbase.client.HTable
/** * Add the HBase dependency jars as well as jars for any of the configured * job classes to the job configuration, so that JobClient will ship them * to the cluster and add them to the DistributedCache. */
解决办法:TableMapReduceUtil.addDependencyJars(job)
见org.apache.hadoop.hbase.mapreduce.HFileOutputFormat2源码