Hadoop ClassPath

编写实际生产用的hadoop mapreduce程序的时候,通常都会引用第三方库,也就会碰到ClassPath的问题,主要是两种情况:

  • 找不到类ClassNotFound
  • 库的加载顺序不对,就是第三库引用了一个比较通用的库,比如jackson-core-asl,而hadoop包含了这个库,但是版本稍低,默认情况下hadoop会优先加载自身包含的库,这样就会造成引用库的版本不对,从而出现找不到类会类中的方法的错误

一般会在两个阶段碰到,分别有不同的解决方法:

  • 作业提交阶段
  • task运行阶段

作业提交阶段

找不到类这种情况有两种解决方法:

  • 将第三方库和自己的程序代码打包到一个jar包中
  • 设置HADOOP_CLASSPATH环境变量

打包

使用maven打包,pom文件中打包插件设置如下:

<build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <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>
        </plugins>
    </build>

设置环境变量

假如要将jackson-core-asl-1.9.13.jar库添加到HADOOP_CLASSPATH中:

export HADOOP_CLASSPATH=jackson-core-asl-1.9.13.jar

库加载顺序不对这种情况,那就是要让hadoop优先加载用户指定的库,设置如下的环境变量:

export HADOOP_USER_CLASSPATH_FIRST=true

这样设置之后可以解决问题的原因是,hadoop jar命令启动的程序的时候,会通过hadoop-config.sh来设置classpath,其中有段这样的设置代码:

if [[ ( "$HADOOP_CLASSPATH" != "" ) && ( "$HADOOP_USE_CLIENT_CLASSLOADER" = "" ) ]]; then
  # Prefix it if its to be preceded
  if [ "$HADOOP_USER_CLASSPATH_FIRST" != "" ]; then
    CLASSPATH=${HADOOP_CLASSPATH}:${CLASSPATH}
  else
    CLASSPATH=${CLASSPATH}:${HADOOP_CLASSPATH}
  fi
fi

也就是说如果HADOOP_CLASSPATH不为空且HADOOP_USER_CLASSPATH_FIRST不为空的时候,会将HADOOP_CLASSPATH指定的类库优先加载。


task运行阶段

找不到类这种情况,通过-libjars指定引用的库,hadoop将这里指定的库上传到DistributedCache中,然后添加到task运行的classpath。

库加载顺序的问题,可以通过设置Configuration类解决。

conf.set("mapreduce.job.user.classpath.first","true");
conf.set("mapreduce.task.classpath.user.precedence","true");

或者

String cp = "$PWD/*:hadoop自身的类库目录";
            conf.set(YarnConfiguration.YARN_APPLICATION_CLASSPATH, cp);

这里hadoop自身的类库目录,是指你运行程序所在的hadoop集群的所有类库目录。

具体原因可以参考这篇文章:Hadoop程序JAR包冲突的分析及解决方法

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Hadoopclasspath配置主要包括以下几个方面: 1. Hadoop的核心库:包括hadoop-common.jar、hadoop-hdfs.jar、hadoop-mapreduce-client-core.jar等。 2. Hadoop的依赖库:包括commons-logging.jar、commons-cli.jar、log4j.jar等。 3. Hadoop的配置文件:包括core-site.xml、hdfs-site.xml、mapred-site.xml等。 4. 用户自定义的类和库:包括自己编写的MapReduce程序中用到的类和库。 在配置Hadoopclasspath时,需要将以上内容都包含进去。具体的配置方法可以参考Hadoop官方文档或者相关教程。一般来说,可以通过设置HADOOP_CLASSPATH环境 ### 回答2: Hadoop Classpath 配置指的是将相关的 Hadoop 相关 jar 文件加入到系统的 Classpath 中,以便在运行 Hadoop 程序的时候能够正确地访问这些 jar 文件。这里我们主要介绍在 Linux 操作系统上如何配置 Hadoop Classpath。 首先,在安装 Hadoop 的过程中通常已经将 Hadoop 提供的 jar 文件加入了系统的 Classpath 中,所以大多数情况下我们不需要手动配置 Classpath。但是如果在使用 Hadoop 开发程序时,我们需要自己编写的代码能够访问到 Hadoop 相关的 jar 文件,我们就需要手动配置 Classpath。 在在 Hadoop 安装目录下的 `etc/hadoop` 目录下,可以找到 `hadoop-env.sh` 文件,这个文件包含了 Hadoop 各种环境变量的设置。要配置 Hadoop Classpath,我们需要在这个文件中设置 CLASSPATH 变量,方法如下: 1. 打开 `hadoop-env.sh` 文件,找到下面这一行: ```bash # export HADOOP_CLASSPATH ``` 2. 在这一行之后添加以下代码: ```bash export HADOOP_CLASSPATH=/path/to/hadoop-jars/* ``` 把 `/path/to/hadoop-jars` 替换成你的 Hadoop 安装目录中的 `share/hadoop` 目录的绝对路径。 这个设置会将 Hadoop 安装目录下的所有 jar 文件都加入到 Classpath 中,以便在运行 Hadoop 时能够正常访问这些 jar 文件。 如果你只需要使用 Hadoop 某些子模块的类库,你也可以只将这个模块的 jar 文件加入到 Classpath 中,比如: ```bash export HADOOP_CLASSPATH=/path/to/hadoop-jars/hadoop-mapreduce-client-core-3.3.1.jar ``` 添加完以上代码后保存文件,再重新启动 Hadoop,配置就生效了。 需要注意的是,上述操作只是在当前终端窗口中设置了环境变量。如果需要在所有终端窗口中生效,可以将这些设置写入 `.bashrc` 或者 `.profile` 文件中。 总之,配置 Hadoop Classpath 是一个非常简单但是必要的操作,能够帮助你在 Hadoop 开发和运行过程中避免一些常见的错误。 ### 回答3: Hadoop是一个分布式计算框架,常用于大规模数据处理。在使用Hadoop时,需要进行classpath配置,来确保Hadoop能够正确地加载相关的类和库。 Hadoopclasspath配置主要包括以下几个步骤: 1. 设置JAVA_HOME环境变量。在Hadoop的安装目录下,打开conf/hadoop-env.sh文件,找到以下代码行: # The java implementation to use. Required. export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64 将JAVA_HOME设置为Java的安装路径。 2. 配置Hadoopclasspath。在Hadoop的安装目录下,打开conf/hadoop-env.sh文件,找到以下代码行: # Set Hadoop-specific environment variables here. # Example variables set below are only examples. Need to set HADOOP_HOME, # JAVA_HOME, and HADOOP_OPTS for a complete installation. 将HADOOP_CLASSPATH设置为需要加载的类和库的路径,多个路径之间使用冒号分隔。例如: export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/usr/share/java/mysql-connector-java.jar 这样,在运行Hadoop时,就可以将mysql的驱动加载到classpath中了。 3. 配置MapReduce的classpath。在Hadoop的安装目录下,打开conf/mapred-site.xml文件,添加以下代码块: <property> <name>mapreduce.job.classpath.files</name> <value>/path/to/files/</value> </property> 将/path/to/files/替换为需要加载的类和库的路径。 通过以上步骤,就可以配置Hadoopclasspath了。需要注意的是,配置好classpath后,需要重新启动Hadoop才能生效。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值