运行一个MapReduce的JOB

本文详细指导如何在Hadoop环境中使用MapReduce处理wordcount任务,包括创建本地文件、上传至HDFS,配置mapred-site.xml,解决环境变量问题,并验证输出。

1.在/data目录下创建一个文件

vim wordcount.txt

放入一些词

2.返回hadoop文件夹,在hdfs上创建一个文件夹

bin/hdfs dfs -mkdir -p /wordcount/input

3.将/data目录下刚创建的文件放到hdfs的这个文件夹下

bin/hdfs dfs -put /home/<username>/data/wordcount.txt /wordcount/input

执行命令

bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar <jobname> /wordcount/input /wordcount/output

发现有报错,查看报错信息

Please check whether your etc/hadoop/mapred-site.xml contains the below configuration:
<property>
  <name>yarn.app.mapreduce.am.env</name>
  <value>HADOOP_MAPRED_HOME=${full path of your hadoop distribution directory}</value>
</property>
<property>
  <name>mapreduce.map.env</name>
  <value>HADOOP_MAPRED_HOME=${full path of your hadoop distribution directory}</value>
</property>
<property>
  <name>mapreduce.reduce.env</name>
  <value>HADOOP_MAPRED_HOME=${full path of your hadoop distribution directory}</value>
</property>

在etc/hadoop/mapred-site.xml中添加报错中需要的信息

配置完成后,重启服务

然后重新运行

4.查看生成的文件是否正确

bin/hdfs dfs -cat /wordcount/output/*

Flink 和 MapReduce执行模型上有显著差异,这些差异主要体现在任务调度、执行模式、资源管理以及对流处理的支持等方面。 ### Flink 作业执行模型 Flink 的执行模型基于流处理引擎,支持 **流处理(STREAMING)** 和 **批处理(BATCH)** 两种语义模式,也可以根据数据源的边界自动选择执行模式(AUTOMATIC)[^4]。Flink 的 Driver 程序会将用户代码构建成一个 **Program Dataflow**,其中包括数据源(Source)、操作算子(Operator)和数据汇(Sink)等组件。随后,Graph Builder 会将该 Dataflow 转换为一个 DAG(有向无环图)形式的 Dataflow Graph,并进一步划分为多个 **Task 和 Subtask**。 在提交作业时,Client 会将构建好的 Job 提交给 JobManager。JobManager 负责任务调度,将 Subtask 分配到不同的 TaskManager 上执行。每个 TaskManager 拥有多个 **TaskSlot**,用于执行具体的任务。JobManager 与 TaskManager 之间通过 Actor System 进行通信,处理任务状态更新、Checkpoints 触发、心跳检测等[^2]。 Flink 支持两种主要的作业运行模式: 1. **Session 模式**:多个作业共享一个集群,适合小作业。 2. **Job 模式**:为每个作业单独启动一个 Flink 集群,完成后释放资源,适合大作业。例如: ```bash ./bin/flink run -m yarn-cluster ./path/to/job.jar ``` 在该模式下,资源按需申请,作业结束后集群关闭[^1]。 ### MapReduce 执行模型 MapReduce执行模型基于 **分治策略**,将计算任务划分为两个主要阶段:Map 阶段和 Reduce 阶段。每个 Map 任务处理输入数据的分片(Split),生成中间键值对;随后,Reduce 任务对中间结果进行归并处理。 MapReduce执行流程如下: 1. **作业提交**:用户提交作业后,JobTracker(在 Hadoop 1.x 中)或 ResourceManager(在 Hadoop 2.x+ YARN 中)负责调度。 2. **任务分配**:根据数据本地性原则,将 Map 任务分配到数据所在的节点上执行。 3. **Shuffle 阶段**:Map 输出的中间结果被分区、排序并传输到对应的 Reduce 节点。 4. **Reduce 阶段**:Reduce 任务对来自多个 Map 的数据进行合并和处理。 5. **容错机制**:通过任务重试、推测执行等方式保证作业的可靠性。 MapReduce 的资源调度和任务管理由 YARN 框架统一负责,作业执行过程中资源是静态分配的,作业完成后资源释放。 ### 对比分析 | 特性 | Flink | MapReduce | |------|-------|-----------| | **执行模式** | 支持流处理(Streaming)和批处理(BATCH) | 仅支持批处理 | | **任务调度** | 动态调度 Subtask 到 TaskManager 执行[^2] | 静态调度 Map/Reduce 任务 | | **资源管理** | 支持按需分配(Job 模式)或共享(Session 模式) | 资源在作业开始时静态分配 | | **状态管理** | 支持 Checkpoint 机制,实现状态一致性[^2] | 无内置状态一致性机制 | | **延迟与吞吐** | 支持低延迟、高吞吐量的流处理 | 高延迟,适合大规模离线处理 | | **编程模型** | 基于 Dataflow 模型,支持复杂 DAG | 固定的 Map-Reduce 两阶段模型 | | **容错机制** | Checkpoint + State Backend 实现精确一次语义 | 基于任务重试实现容错 | ### 代码示例(Flink 批处理 WordCount) ```java public class BatchWordCount { public static void main(String[] args) throws Exception { final ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment(); env.setRuntimeMode(RuntimeExecutionMode.BATCH); // 设置为批处理模式[^4] DataSet<String> text = env.readTextFile("input.txt"); DataSet<Tuple2<String, Integer>> counts = text .flatMap((String line, Collector<Tuple2<String, Integer>> out) -> { for (String word : line.split(" ")) { out.collect(new Tuple2<>(word, 1)); } }) .groupBy(0) .sum(1); counts.writeAsCsv("output.csv"); env.execute("Batch WordCount"); } } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值