【Hadoop】14-MapReduce配置开发环境

本文介绍了如何使用Maven构建Hadoop MapReduce项目,并详细阐述了配置管理的方法,包括如何通过不同配置文件灵活切换本地和集群环境。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先新建一个项目,以便编译MapReduce程序并通过命令或在自己的IDE中以本地(独立,standalone)模式运行他们。在下面范例中的Maven POM项目对象模型(Project Object Model)说明了编译和测试Map-Reduce程序时需要的依赖项(dependency)。

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.hadoopbook</groupId>
    <artifactId>hadoop-book-mr-dev</artifactId>
    <version>4.0</version>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <hadoop.version>3.1.0</hadoop.version>
    </properties>
     <dependencies>
        <!--hadoop main client artifact-->
        <dependency>
            <groupId>org.apahce.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>${hadoop.version}</version>
        </dependency>
        <!--unit test artifacts-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.mrunit</groupId>
            <artifactId>mrunit</artifactId>
            <version>1.1.0</version>
            <classifier>hadoop2</classifier>
            <scope>test</scope>
        </dependency>

        <!--Hadoop test artifact for running mini clusters-->
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-minicluster</artifactId>
            <version>${hadoop.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <finalName>hadoop-examples</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.7.0</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.1.0</version>
                <configuration>
                    <outputDirectory>${basedir}</outputDirectory>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
 依赖关系是POM中有趣的一部分。(只要你使用此处定义的依赖关系,就可以直接使用其他的构建工具,例如Gradle或者Ant with Ivy。)要想构建MapReduce作业,你只需要有hadoop-client依赖关系,它包含了和HDFS及MapReduce交互所需要的所有Hadoop client-side类。当运行单元测试时,我们要使用junit类;当写MapReduce测试用例时,我们使用mrunit类。hadoop-minicluster库中包含了“mini-”集群,这有助于在一个单JVM中运行Hadoop集群进行测试。

        很多IDE可以直接读Maven POM,因此你只需要在包含pom.xml文件的目录中指向这些Maven POM,就可以开始写代码。也可以使用Maven为IDE生成配置文件。例如,如下创建Eclipse配置文件以便将项目导入Eclipse:

mvn eclipse:eclipse -DdownloadSources=true -DdownloadJavadocs=true

1.管理配置

开发Hadoop应用时,经常需要在本地运行和集群之间进行切换。事实上,可能在几个集群上工作,也可能在本地“伪集群”集群上测试。伪分布式集群是其守护进程运行在本机的集群。
应对这些变化的一种方法是使Hadoop配置文件包含每个集群的连接设置,并且在运行Hadoop引用或工具时指定使用哪一个连接设置。最好的做法是,把这些文件放在Hadoop安装目录树之外,以便于轻松地在Hadoop不同版本之间进行切换,从而避免重复或丢失设置信息。
为了方便,我们假设目录conf包含三个配置文件:hadoop-local.xml、hadoop-localhost.xml和hadoop-cluster.xml。注意,文件名没有特殊要求,这样命名只是为了方便打包配置的设置。

针对默认的文件系统和用于运行MapReduce作业的本地(指在JVM中的)框架,hadoop-local.xml包含默认的Hadoop配置:

<?xml version="1.0"?>
<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>file:///</value>
    </property>
    <property>
        <name>mapreduce.framework.name</name>
        <value>local</value>
    </property>
</configuration>

 hadoop-localhost.xml文件中的设置指向本地主机上运行的namenode和YARN资源管理器:

<?xml version="1.0"?>
<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://localhost/</value>
    </property>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <property>
        <name>yarn.resourcemanager.address</name>
        <value>localhost:8932</value>
    </propertY>
</configuration>

最后,hadoop-cluster.xml文件包含集群上namenode和YARN资源管理器地址的详细信息(事实上,我们会以集群的名称来命名这个文件,而不是这里显示的那样用cluster泛指):

<?xm lversion="1.0"?>
<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://namenode/</value>
    </property>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <property>
        <name>mapreduce.framework.name</name>
        <value>resourcemanager:8932</value>
    </property>
</configuration>
还可以根据需要为这些文件添加其他配置信息。

        有了这些设置,便可以轻松通过-conf命令行开关来使用各种配置。例如,下面的命令显示了一个在伪分布式模式下运行于本地主机上的HDFS服务器上的目录列表:

%hadoop fs -conf conf/hadoop-localhost.xml -ls .
Found 2 items
drwxr-xr-x-tom supergroup 0 2014-09-08 10:19 input
drwxr-xr-x-tom supergroup 0 2014-09-08 10:19 output

 如果省略-conf选项,可以从$HADOOP_HOME的etc/hadoop子目录中找到Hadoop的配置信息。或者如果已经设置了HADOOP_CONF_DIR,Hadoop的配置信息将从那个位置读取。

注意:这里介绍另一种管理配置设置的方法。将etc/hadoop目录从Hadoop的安装位置拷贝至另一个位置,将*-site.xml配置文件也放于该位置(文件中的各项设置应正确),再将HADOOP_CONF_DIR环境变量设置为指向该位置。该方法的主要优点是,不需要每个命令中都指定-conf。并且,由于HADOOP_CONF_DIR路径下有所有配置文件的拷贝,因此,对文件的修改可以与Hadoop XML 配置文件隔离开来(例如,log4j.properties)。

Hadoop自带的工具支持-conf选项,也可以直接用程序(例如运行MapReduce作业的程序)通过使用Tool接口来支持-conf选项。

2.辅助类GenericOptionsParser ,Tool和ToolRunner

为了简化命令行方式运行作业,Hadoop自带了一些辅助类。GenericOptionsParser是一个类,用来解释常用的Hadoop命令行选項,并根据需要,为Configuration对象设置相应的取值。通常不直接使用GenericOptionsparser.更方便的方式是实现Tool接口,通过ToolRunner来运行应用序。ToolRunner内部调用GenericOptionsParser:
package org.apache.hadoop.util;
import org.apache.hadoop.classification.InterfaceAudience.Public;
import org.apache.hadoop.classification.InterfaceStability.Stable;
import org.apache.hadoop.conf.Configurable;
@Public
@Stable
public interface Tool extends Configurable {
    int run(String[] var1) throws Exception;
}
如下范例给出了一个非常单的Tool的实现,用来打印Tool的Configuration对象中所有属性的键值对。
public class ConfigurationPrinter extends Configured implements Tool{
static{
    Configuration.addDefaultResource("hdfs-default.xml");
    Configuration.addDefaultResource("hdfs.site.xml");
    Configuration.addDefaultResource("yarn.default.xml");
    Configuration.addDefaultResource("yarn-site.xml");
    Configuration.addDefaultResource("mapred-default.xml");
    Configuration.addDefaultResource("mapred-site.xml");
    @Override
    public int run(String[] args)throws Exception{
        Configuration conf=getConf();
        for(Entry<String,String>entry:conf){
            System.out.printf("%s=%s\n", entry.getKey(),entry.getvalue());
        }
        return0;
    }
    public static void main(String[] args)throws Exception{
        int exitCode=ToolRunner.run(new ConfigurationPrinter(),args);
        System.exit(exitCode);
    }
}

我们把ConfigurationPrinter作为configured的一个子类,Configured是Configurable接冂的一个实现。Tool的所有实现都需要实现Configurable(因为Tool继承于configurable),Configured子类通常是一种最简单的实现方式。run()方法通过Configurable的getConf()方法获取Configuration,然后重复执行,将每个属性打印到标准输出。静态代码部分确保核心配置外的HDFS、YARN和MapReduce配置能够被获取(因为Configuration已经获取了核心配置)。

可以设置哪些属性?

作为一个有用的工具,ConfigurationPrinter可用于了解在环境中某个属性是如何进行设置的。对于运行中的守护进程,例如namenode,可以通过查看其网络服务器上的/页面来了解配置情况。

你也可以在Hadoop安装路径的share/doc目录中,查看所有公共属性的默认设置,相关文件包括core-default.xml,hdfs-demultxml,yam-default.xml和mapred-default.xml这几个文件·每个属性都有用来解释属性作用和取值范围的描述。

默认的配置文档可通过以下网址所链接的页面找到,http://hadoop.apahce.org/docs/current(在导航树中寻找"Configuration”标题)。通过用<version>替换前述URL中的current,可以找到一个特定Hadoop发行版本的默认配置,例如,http://hadoop.apahce.org/docs/r2.5.0。

注意,在客户端配置中设置某些属性,将不会产生影响·例如,如果在作业提交时想通过设置yarn.nodemanager.resource.memory-mb来改变运行作业的节点管理器能够得到的内存数量,结果会让你失望的,因为这个属性只能在节点管理器的yarn-sitexml文件中进行设置·一般情况下,我们可以通过属性名的组成部分来获知该属性应该在哪里进行设置。由于yarn.nodemanager.resource.menory-mb以yarn.nodemanager.resource.memory-mb以yarn.nodemanager开头,因此,我们知道它只能为节点管理器守护进程进行设置·但是,这不是硬性的,在有些情况下,我们需要进行尝试,甚至去阅读源代码。

在Hadoop2中,为了让命名结构看着更常规一些,对配置属性名称进行了修改。例如,namenode相关的HDFS属性名称都改为带一个dfs.namenode前缀,这样原先的dfs.name·dir现在称为dfs.namenode.name.dir。类似的,MapReduce属性用mapreduce前缀代替了较早的mapred前缀,因此,原先的mapred.job.name现在称为mapreduce.jab.name。

        ConfigurationPrinter的main()方法没有直接调用自身的run()方法,而是调用ToolRunner的静态run()方法,该方法负责在调用自身的run()方法之前,为Tool建立一个Configuration对象。ToolRunner还使用了Generic0ptionsParser来获取在命令行方式中指定所有标准的选项,然后,在Configuration实例上进行设置。运行下列代码,可以看到在conf/hadoop-localhost.xml中设置的属性。

mvn compile
export HADOOP_CLASSPATH:target/classes
hadoop ConfigurationPrinter -conf conf/hadoop-localhost.xml \n
     grep yarn.resourcemanager.address=yarn.resourcemanager.address=localhost:8032
GenericOptionsParser也允许设置个别属性。例如:
hadoop ConfigurationPrinter-D color=yellow | grep color 
color=yellow

-D选项用于将键color的配置属性值设置为yellow。设置为-D的选项优先级要高于配置文件里的其他属性。这一点很有用:可以把默认属性放人配置文件中,然后再在需要时用-D选项来覆盖。一个常见的例子是,通过-Dmapreduce.job.reduces=n来设置MapReduce作业中reducer的数量。这样会覆盖集群上或客户端配置属性文件中设置的reducer数量。

GenericOptionsParser和ToolRunner支持的其他选项可以参见下表。

GenericOptionsParser选项和ToolRunner 选项:

选项名称

描述

-D property=value

将指定值赋值给确定的Hadoop配置属性。覆盖配置文件里的默认属性或站点属性,或通过-conf选项设置的任何属性

-conf filename ...

将指定文件添加到配置的资源列表中。这是设置站点属性或同时设置一组属性的简便方法

-fs uri

用指定的URI设置默认文件系统。这是-D fs.default.name=uri的快捷方式

-jt host:port

用指定主机和端口设置jobtracker。这是-D mapred.job.tracker= host:port的快捷方式

-files file1,file2,...

从本地文件系统(或任何指定模式的文件系统)中复制指定文件到jobtracker所用的共享文件系统(通常是HDFS),确保在任务工作目录的MapReduce程序可以访问这些文件

-archives
archive1,archive2,..

从本地文件系统(或任何指定模式的文件系统)复制指定存档到jobtracker所用的共享文件系统(通常是HDFS),打开存档文件,确保任务工作目录的MapReduce程序可以访问这些存档



-libjars jar1,jar2,…

从本地文件系统(或任何指定模式的文件系统)复制指定JAR文件到被jobtracker 使用的共享文件系统(通常是HDFS),把它们加入MapReduce任务的类路径中。这个选项适用于传输作业需要的JAR文件

用-D property=value选项将Hadoop属性设置为GenericOptionsParser (和 ToolRunner),不同于用-Dproperty=value选项将JVM系统属性设置为Java命令。JVM系统属性的语法不允许D和属性名之间有任何空格,而GenericOptionsParser要求用空格来分隔D和属性名。
JVM系统属性来自于java.lang.System类,而Hadoop属性只能从Configuration对象中获取。所以,下面的命令行将没有任何输出,因为ConfigurationPrinter没有使用System类
hadoop -Dcolor=yellow ConfigurationPrinter | grep color 
如果希望通过系统属性进行配置,则需要在配置文件中反映相关的系统属性。

"C:\Program Files\Java\jdk-17\bin\java.exe" -Didea.launcher.port=54222 "-Didea.launcher.bin.path=D:\hadoop\IntelliJ IDEA Community Edition 2018.3.6\bin" -Dfile.encoding=UTF-8 -classpath "D:\hadoop\Hadoop\target\classes;D:\hadoop\hadoop-3.1.4\share\hadoop\client\hadoop-client-api-3.1.4.jar;D:\hadoop\hadoop-3.1.4\share\hadoop\client\hadoop-client-runtime-3.1.4.jar;D:\hadoop\hadoop-3.1.4\share\hadoop\client\hadoop-client-minicluster-3.1.4.jar;D:\hadoop\hadoop-3.1.4\share\hadoop\common\hadoop-kms-3.1.4.jar;D:\hadoop\hadoop-3.1.4\share\hadoop\common\hadoop-nfs-3.1.4.jar;D:\hadoop\hadoop-3.1.4\share\hadoop\common\hadoop-common-3.1.4.jar;D:\hadoop\hadoop-3.1.4\share\hadoop\common\hadoop-common-3.1.4-tests.jar;D:\hadoop\hadoop-3.1.4\share\hadoop\hdfs\hadoop-hdfs-3.1.4.jar;D:\hadoop\hadoop-3.1.4\share\hadoop\hdfs\hadoop-hdfs-nfs-3.1.4.jar;D:\hadoop\hadoop-3.1.4\share\hadoop\hdfs\hadoop-hdfs-rbf-3.1.4.jar;D:\hadoop\hadoop-3.1.4\share\hadoop\hdfs\hadoop-hdfs-3.1.4-tests.jar;D:\hadoop\hadoop-3.1.4\share\hadoop\hdfs\hadoop-hdfs-client-3.1.4.jar;D:\hadoop\hadoop-3.1.4\share\hadoop\hdfs\hadoop-hdfs-httpfs-3.1.4.jar;D:\hadoop\hadoop-3.1.4\share\hadoop\hdfs\hadoop-hdfs-rbf-3.1.4-tests.jar;D:\hadoop\hadoop-3.1.4\share\hadoop\hdfs\hadoop-hdfs-client-3.1.4-tests.jar;D:\hadoop\hadoop-3.1.4\share\hadoop\hdfs\hadoop-hdfs-native-client-3.1.4.jar;D:\hadoop\hadoop-3.1.4\share\hadoop\hdfs\hadoop-hdfs-native-client-3.1.4-tests.jar;D:\hadoop\hadoop-3.1.4\share\hadoop\mapreduce\hadoop-mapreduce-examples-3.1.4.jar;D:\hadoop\hadoop-3.1.4\share\hadoop\mapreduce\hadoop-mapreduce-client-hs-3.1.4.jar;D:\hadoop\hadoop-3.1.4\share\hadoop\mapreduce\hadoop-mapreduce-client-app-3.1.4.jar;D:\hadoop\hadoop-3.1.4\share\hadoop\mapreduce\hadoop-mapreduce-client-core-3.1.4.jar;D:\hadoop\hadoop-3.1.4\share\hadoop\mapreduce\hadoop-mapreduce-client-common-3.1.4.jar;D:\hadoop\hadoop-3.1.4\share\hadoop\mapreduce\hadoop-mapreduce-client-shuffle-3.1.4.jar;D:\hadoop\hadoop-3.1.4\share\hadoop\mapreduce\hadoop-mapreduce-c
05-07
<think>好的,我现在需要帮助用户解决Hadoop 3.1.4的启动命令配置问题,特别是关于JDK 17和IDEA Community Edition 2018.3.6的classpath路径分析。首先,我得回顾一下用户提供的引用内容和之前的问题。 用户提到了几个关键点:Hadoop运行配置问题、启动命令的构成,以及classpath路径分析。引用中提到了ClassNotFoundException,JAVA_HOME未设置的问题,还有修改hadoop-env.sh和yarn.application.classpath的配置。此外,用户还提到了完全分布式环境的搭建步骤,比如移动和解压安装包,配置workers文件和环境变量。 首先,ClassNotFoundException通常和类路径有关,可能是驱动类没找到,或者打包的jar文件没有正确包含所需的类。用户使用JDK 17,需要注意Hadoop版本是否兼容,因为Hadoop 3.1.4可能对JDK 17的支持有限,官方文档可能推荐的是JDK 8或11。这时候可能需要确认兼容性,或者调整JDK版本。 接下来是启动命令的配置Hadoop启动通常通过start-dfs.sh和start-yarn.sh,这些脚本会读取Hadoop配置文件,比如hadoop-env.sh,里面需要正确设置JAVA_HOME。用户提到使用JDK 17,所以必须确保hadoop-env.sh中的JAVA_HOME指向正确的JDK路径,例如export JAVA_HOME=/usr/lib/jvm/jdk-17。如果路径错误,会导致JAVA_HOME找不到,从而引发各种错误。 关于classpath,用户需要运行hadoop classpath命令获取路径,并将结果添加到yarn.application.classpath的配置中。这确保YARN能够找到所有的依赖库。同时,如果用户使用IDEA进行开发,需要确保项目中的classpath配置正确,包括Hadoop的库和JDK 17的版本。IDEA 2018.3.6可能较旧,可能需要检查是否支持JDK 17,或者是否需要升级插件。 另外,用户的环境变量配置在/etc/profile.d/my_env.sh中,需要确认Hadoop和JDK的路径是否正确设置,并且通过source命令使其生效。同时,workers文件中的节点名称是否正确,比如master、slave1、slave2是否与实际的主机名对应,SSH免密登录是否配置,这些都是启动分布式环境的关键步骤。 可能用户遇到的错误包括:ClassNotFoundException(类路径问题)、JAVA_HOME未设置(环境变量或配置文件错误)、或者节点通信问题(workers配置或SSH问题)。需要一步步检查这些方面,确认每个配置项的正确性。 最后,用户可能需要了解如何在IDEA中配置Hadoop项目,添加正确的依赖库,并设置运行参数,确保打包后的jar包含所有需要的类,并且Hadoop的classpath正确指向这些依赖。同时,考虑到JDK 17的新特性,比如模块化系统,可能需要调整Hadoop的启动脚本或依赖项,避免不兼容的问题。</think>### Hadoop 3.1.4 启动命令配置详解(JDK-17 + IDEA 2018.3.6) #### 一、核心配置项分析 1. **JAVA_HOME配置** 修改 `$HADOOP_HOME/etc/hadoop/hadoop-env.sh` 文件,明确指定JDK-17路径: ```bash export JAVA_HOME=/usr/lib/jvm/jdk-17 ``` 若未配置,会触发 `Error: JAVA_HOME is not set` 错误[^2]。 2. **Classpath动态获取** 运行 `hadoop classpath` 获取当前Hadoop类路径,输出结果需添加到 `yarn-site.xml` 的 `yarn.application.classpath` 配置项中: ```xml <property> <name>yarn.application.classpath</name> <value>/opt/module/hadoop-3.1.4/etc/hadoop:/opt/module/hadoop-3.1.4/share/hadoop/common/lib/*:...</value> </property> ``` 该路径包含Hadoop核心库和第三方依赖[^3]。 3. **IDEA项目配置要点** - 确保 `pom.xml` 中Hadoop依赖版本与集群版本一致(3.1.4) - 设置编译兼容性为JDK-17: ```xml <properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> </properties> ``` #### 二、典型启动命令结构 完整作业提交命令示例: ```bash hadoop jar your-job.jar com.example.MainClass \ -D mapreduce.job.queuename=default \ /input/path /output/path ``` - `hadoop jar`:Hadoop执行入口 - `-D` 参数:动态配置MapReduce参数 - 末尾参数:程序自定义输入输出路径 #### 三、JDK-17兼容性问题 需注意: 1. Hadoop 3.1.4 官方支持最高JDK11,使用JDK-17需重新编译Hadoop源码: ```bash mvn clean package -Pdist,native -DskipTests -Dmaven.javadoc.skip=true -Djava.version=17 ``` 2. 若出现 `UnsupportedClassVersionError`,需检查IDEA的编译输出目标版本设置 #### 四、调试技巧 1. **环境验证命令**: ```bash # 检查JAVA_HOME echo $JAVA_HOME # 验证Hadoop类路径 hadoop classpath ``` 2. **日志定位**: - NameNode日志:`$HADOOP_HOME/logs/hadoop-*-namenode-*.log` - YARN日志:通过 `yarn logs -applicationId <app_id>` 获取
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值