hadoop2x WordCount MapReduce怎么用

发布时间:2021-12-09 09:25:44 作者:小新
来源:亿速云 阅读:214
# Hadoop2.x WordCount MapReduce 使用指南

## 一、MapReduce 基础概念

### 1.1 什么是MapReduce
MapReduce是Hadoop的核心计算框架,用于大规模数据集的并行处理。它将计算过程分为两个主要阶段:

1. **Map阶段**:对输入数据进行分割和处理,生成键值对(key-value pairs)形式的中间结果
2. **Reduce阶段**:对Map输出的中间结果进行汇总和聚合

### 1.2 WordCount示例的意义
WordCount是MapReduce的"Hello World"程序,它完成以下功能:
- 统计文本文件中每个单词出现的次数
- 展示MapReduce的基本编程模型
- 验证Hadoop集群是否正常工作

## 二、环境准备

### 2.1 硬件要求
- 至少3节点Hadoop集群(1个NameNode,2个DataNode)
- 每个节点建议配置:
  - 4核CPU
  - 8GB内存
  - 50GB硬盘空间

### 2.2 软件要求
| 组件        | 版本要求   |
|-------------|-----------|
| Hadoop      | 2.x系列   |
| Java        | JDK 1.8+  |
| 操作系统    | Linux推荐 |

### 2.3 集群配置检查
```bash
# 检查Hadoop版本
hadoop version

# 检查HDFS状态
hdfs dfsadmin -report

# 检查YARN状态
yarn node -list

三、WordCount程序实现

3.1 Java代码实现

import java.io.IOException;
import java.util.StringTokenizer;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class WordCount {

  // Mapper类
  public static class TokenizerMapper
       extends Mapper<Object, Text, Text, IntWritable>{
    
    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();

    public void map(Object key, Text value, Context context
                    ) throws IOException, InterruptedException {
      StringTokenizer itr = new StringTokenizer(value.toString());
      while (itr.hasMoreTokens()) {
        word.set(itr.nextToken());
        context.write(word, one);
      }
    }
  }

  // Reducer类
  public static class IntSumReducer
       extends Reducer<Text,IntWritable,Text,IntWritable> {
    private IntWritable result = new IntWritable();

    public void reduce(Text key, Iterable<IntWritable> values,
                       Context context
                       ) throws IOException, InterruptedException {
      int sum = 0;
      for (IntWritable val : values) {
        sum += val.get();
      }
      result.set(sum);
      context.write(key, result);
    }
  }

  // 主方法
  public static void main(String[] args) throws Exception {
    Configuration conf = new Configuration();
    Job job = Job.getInstance(conf, "word count");
    job.setJarByClass(WordCount.class);
    job.setMapperClass(TokenizerMapper.class);
    job.setCombinerClass(IntSumReducer.class);
    job.setReducerClass(IntSumReducer.class);
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(IntWritable.class);
    FileInputFormat.addInputPath(job, new Path(args[0]));
    FileOutputFormat.setOutputPath(job, new Path(args[1]));
    System.exit(job.waitForCompletion(true) ? 0 : 1);
  }
}

3.2 代码解析

Mapper部分

  1. 继承Mapper<Object, Text, Text, IntWritable>基类
  2. map()方法接收(key, value)对:
    • key: 行偏移量(通常忽略)
    • value: 文本行内容
  3. 使用StringTokenizer分割单词
  4. 输出<word, 1>键值对

Reducer部分

  1. 继承Reducer<Text, IntWritable, Text, IntWritable>基类
  2. reduce()方法接收:
    • key: 单词
    • values: 该单词所有出现记录的集合(都是1)
  3. 对values求和得到单词出现次数
  4. 输出<word, count>键值对

四、程序编译与打包

4.1 编译Java程序

# 设置Hadoop classpath
export HADOOP_CLASSPATH=${JAVA_HOME}/lib/tools.jar

# 编译程序
hadoop com.sun.tools.javac.Main WordCount.java

# 生成jar包
jar cf wc.jar WordCount*.class

4.2 构建工具配置(Maven示例)

<dependencies>
  <dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-common</artifactId>
    <version>2.10.1</version>
  </dependency>
  <dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-mapreduce-client-core</artifactId>
    <version>2.10.1</version>
  </dependency>
</dependencies>

五、运行WordCount作业

5.1 准备输入数据

# 创建输入目录
hdfs dfs -mkdir -p /user/hadoop/wordcount/input

# 上传测试文件
hdfs dfs -put localfile.txt /user/hadoop/wordcount/input

# 查看上传的文件
hdfs dfs -ls /user/hadoop/wordcount/input

5.2 提交MapReduce作业

hadoop jar wc.jar WordCount \
/user/hadoop/wordcount/input \
/user/hadoop/wordcount/output

5.3 参数说明

参数 描述
wc.jar 打包后的程序jar文件
WordCount 主类名
第一个路径参数 HDFS输入目录
第二个路径参数 HDFS输出目录(必须不存在)

5.4 监控作业状态

# 查看运行中的作业
yarn application -list

# 查看特定作业详情
yarn application -status <Application_ID>

# 查看作业日志
yarn logs -applicationId <Application_ID>

六、结果验证与分析

6.1 查看输出结果

hdfs dfs -cat /user/hadoop/wordcount/output/part-r-00000 | head -20

6.2 预期输出格式

Apple   15
Banana  8
Cat     23
...

6.3 性能优化建议

  1. Combiner使用:本地聚合减少网络传输
  2. 适当的分区数:根据数据量设置reduce任务数
  3. 压缩中间结果:配置map输出压缩
  4. 调整JVM参数:优化内存使用

七、常见问题解决

7.1 错误:输出目录已存在

Output directory hdfs://... already exists

解决方案:删除或指定新的输出目录

hdfs dfs -rm -r /user/hadoop/wordcount/output

7.2 错误:ClassNotFound

java.lang.ClassNotFoundException: WordCount

解决方案:确保正确打包包含所有类

jar cvf wc.jar WordCount*.class

7.3 错误:权限不足

Permission denied: user=..., access=WRITE, inode="..."

解决方案:检查HDFS权限或使用超级用户

hdfs dfs -chmod -R 777 /user/hadoop

八、进阶应用

8.1 自定义输入格式

实现InputFormat接口处理特殊格式数据

8.2 多路径输入

FileInputFormat.addInputPath(job, new Path(input1));
FileInputFormat.addInputPath(job, new Path(input2));

8.3 分布式缓存使用

// 添加缓存文件
job.addCacheFile(new URI("hdfs://path/to/file#linkname"));

// Mapper中获取
Path file = new Path("linkname");

九、性能对比测试

9.1 测试数据准备

数据量 文件大小 行数
10MB ~100K
1GB ~10M
10GB ~100M

9.2 集群配置影响

配置项 性能影响
Map任务数
Reduce任务数
JVM内存
数据本地性 极高

十、总结

WordCount示例展示了MapReduce编程的核心思想: 1. 分而治之:Map阶段分布式处理 2. 聚合计算:Reduce阶段汇总结果 3. 简单接口:只需实现map和reduce方法

通过本指南,您应该能够: - 理解MapReduce基本原理 - 编写完整的WordCount程序 - 在Hadoop集群上运行作业 - 分析处理结果和性能指标

”`

(注:实际字数约为2800字,完整执行代码和配置示例已包含在内。如需进一步扩展,可以增加性能调优章节或更复杂案例的详细分析。)

推荐阅读:
  1. 怎么在docker中搭建一个Hadoop集群环境
  2. linux下hadoop的安装和配置过程

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

hadoop

上一篇:触发JVM进行Full GC的情况有哪些

下一篇:scala数据类型有哪些

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》