运行mapreduce,报ClassNotFoundException

当我们实现了一个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源码

猜你喜欢

转载自oitebody.iteye.com/blog/2228868