java:MapReduce原理及入门实例:wordcount

简介: java:MapReduce原理及入门实例:wordcount

image.png

MapReduce原理

MapperTask -> Shuffle(分区排序分组) -> ReducerTask

image.png

MapReduce执行步骤

  1. Map处理任务
  1. 读取文件每一行,解析成,调用map函数
  2. 处理逻辑对key、value处理,行成新的key、value
  3. 数据分区
  1. Reduce处理任务
  1. 拷贝map任务输出到reduce节点,对map任务输出合并,排序
  2. 处理逻辑处理key、value,行成新的key、value
  3. 保存到文件中

wordcount示例

  1. 准备文件

vim word.txt

hello Jack
hello Tom
hello Jimi
hello Mili
hello Make
  1. 上传文件
hadoop fs -put word.txt /word.txt
hadoop fs -ls /   # 查看
  1. 运行任务
cd hadoop-2.8.5/share/hadoop/mapreduce
hadoop jar hadoop-mapreduce-examples-2.8.5.jar wordcount /word.txt /wcout
  1. 查看任务结果
hadoop fs -ls /wcout
hadoop fs -cat /wcout/part-r-00000
Jack    1
Jimi    1
Make    1
Mili    1
Tom     1
hello   5

java示例

  1. mapper
package mr;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;
/**
 * 继承Mapper 实现map计算
 * 传递的参数需要实现序列化,通过网络传输
 */
public class MapDemo extends Mapper<LongWritable, Text, Text, LongWritable>{
    protected void map(LongWritable key, Text value, Context context)
            throws IOException, InterruptedException
    {
        // 接收数据
        String line = value.toString();
        // 切分单词
        String[] words = line.split(" ");
        // 将每个单词转为数字
       for(String word: words)
       {
           context.write(new Text(word), new LongWritable(1));
       }
    }
}
  1. reducer
package mr;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;
/**
 * 继承Reducer,实现reduce计算
 */
public class ReduceDemo extends Reducer<Text, LongWritable, Text, LongWritable> {
    @Override
    protected void reduce(Text key, Iterable<LongWritable> values, Context context)
            throws IOException, InterruptedException
    {
        // 定义计数器
        long count = 0;
        // 统计
        for (LongWritable counter : values)
        {
            count += counter.get();
        }
        // 输出结果
        context.write(key, new LongWritable(count));
    }
}
  1. job
package mr;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import java.io.IOException;
/**
 * 统计单词个数
 * 运行:hadoop jar hdfsdemo.jar
 * 根据实际路径指定输入输出文件 
 */
public class WordCount {
    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
        // 构建Job对象
        Job job = Job.getInstance(new Configuration());
        // 注意:main方法所在类
        job.setJarByClass(WordCount.class);
        // 设置输入文件路径
        FileInputFormat.setInputPaths(job, new Path(args[0]));
        // 设置Mapper属性
        job.setMapperClass(MapDemo.class);
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(LongWritable.class);
        // 设置Reducer属性
        job.setReducerClass(ReduceDemo.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(LongWritable.class);
        // 设置输出文件路径
        FileOutputFormat.setOutputPath(job, new Path(args[1]));
        // 提交任务
        job.waitForCompletion(true);
    }
}

WordCount类的打包为jar,上传至服务器,运行

hadoop jar hdfsdemo.jar /word.txt /out

查看输出文件,和haoop中自带的wordcount输出一致

Jack  1
Jimi  1
Make  1
Mili  1
Tom     1
hello 5

总结

导入依赖jar包

hadoop-2.8.5/share/hadoop/mapreduce/

自定义任务

  1. 分析业务逻辑,确定输入输出样式
  2. 继承Mapper
  3. 继承Reducer
  4. 通过job对象组装Mapper和Reducer
相关文章
|
5月前
|
监控 Java API
现代 Java IO 高性能实践从原理到落地的高效实现路径与实战指南
本文深入解析现代Java高性能IO实践,涵盖异步非阻塞IO、操作系统优化、大文件处理、响应式网络编程与数据库访问,结合Netty、Reactor等技术落地高并发应用,助力构建高效可扩展的IO系统。
175 0
|
5月前
|
存储 缓存 安全
深入讲解 Java 并发编程核心原理与应用案例
本教程全面讲解Java并发编程,涵盖并发基础、线程安全、同步机制、并发工具类、线程池及实际应用案例,助你掌握多线程开发核心技术,提升程序性能与响应能力。
248 0
|
5月前
|
人工智能 安全 Java
Go与Java泛型原理简介
本文介绍了Go与Java泛型的实现原理。Go通过单态化为不同类型生成函数副本,提升运行效率;而Java则采用类型擦除,将泛型转为Object类型处理,保持兼容性但牺牲部分类型安全。两种机制各有优劣,适用于不同场景。
203 24
|
6月前
|
存储 缓存 Java
我们来详细讲一讲 Java NIO 底层原理
我是小假 期待与你的下一次相遇 ~
229 2
|
6月前
|
XML JSON Java
Java 反射:从原理到实战的全面解析与应用指南
本文深度解析Java反射机制,从原理到实战应用全覆盖。首先讲解反射的概念与核心原理,包括类加载过程和`Class`对象的作用;接着详细分析反射的核心API用法,如`Class`、`Constructor`、`Method`和`Field`的操作方法;最后通过动态代理和注解驱动配置解析等实战场景,帮助读者掌握反射技术的实际应用。内容翔实,适合希望深入理解Java反射机制的开发者。
591 13
|
6月前
|
算法 Java 索引
说一说 Java 并发队列原理剖析
我是小假 期待与你的下一次相遇 ~
|
6月前
|
安全 Java 编译器
JD-GUI,java反编译工具及原理: JavaDecompiler一个Java反编译器
Java Decompiler (JD-GUI) 是一款由 Pavel Kouznetsov 开发的图形化 Java 反编译工具,支持 Windows、Linux 和 Mac Os。它能将 `.class` 文件反编译为 Java 源代码,支持多文件标签浏览、高亮显示,并兼容 Java 5 及以上版本。JD-GUI 支持对整个 Jar 文件进行反编译,可跳转源码,适用于多种 JDK 和编译器。其原理基于将字节码转换为抽象语法树 (AST),再通过反编译生成代码。尽管程序可能带来安全风险,但可通过代码混淆降低可读性。最新版修复了多项识别错误并优化了内存管理。
3496 1
|
6月前
|
存储 算法 安全
Java中的对称加密算法的原理与实现
本文详细解析了Java中三种常用对称加密算法(AES、DES、3DES)的实现原理及应用。对称加密使用相同密钥进行加解密,适合数据安全传输与存储。AES作为现代标准,支持128/192/256位密钥,安全性高;DES采用56位密钥,现已不够安全;3DES通过三重加密增强安全性,但性能较低。文章提供了各算法的具体Java代码示例,便于快速上手实现加密解密操作,帮助用户根据需求选择合适的加密方案保护数据安全。
440 58