大数据分析学习第六课 使用Java语言开发MapReduce实战

2023-05-16

   我们知道,从Hadoop官网下载的部署包里,提供了不少jar包示例,但是我们不了解内部的实现逻辑,今天我就给大家介绍下,在java开发环境下怎么实现一个MapReduce

   reduce Task 聚合操作,就是对key相同的一组数据进行处理,具体的聚合逻辑通过接口的方式暴露给用户,由用户来指定(同mapTask方式)。

   reduce Task处理结果,将最后的聚合结果写入hdfs中,每个reduce Task最终形成一个文件,文件名称默认是part-r+reduceTask的编号

   总结:

map阶段,我们只需要提供具体的业务类,对mapTask读到的一行数据进行处理

reduce阶段,仍然需要我们提供具体的逻辑,对reduce拿到的一组相同key的kv数据进行处理

处理结果的传递:无论是map阶段还是recude阶段,数据处理结果的后续流程无需我们关系,我们只需要将各个阶段的数据都交给人家提供好的context对象就好;map阶段会将数据存着,将来想方设法地将数据结果传递给reduceTask,而且保证同一个key只给同一个reduce,reduce阶段会将数据写入hdfs,只要有一个结果key:value,就会往文件中追加一行。

下面介绍具体示例代码的编写,这里我沿用 大数据分析学习第四课 使用Java idea开发hdfs的基本功能-增删改查 这节课的项目代码来做讲解

 

wordcount示例

注意点:mapreduce程序中,  map阶段的进、出数据,  reduce阶段的进、出数据,  类型都应该是实现了HADOOP序列化框架的类型,如:

  String对应Text

  Integer对应IntWritable

  Long对应LongWritable

编码实现

1、WordcountMapper类

package mapreduce;

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

public class WordcountMapper extends Mapper<LongWritable, Text, Text, IntWritable>{

  @Override
    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 IntWritable(1));
        }
    }
}

2、WordcountReducer类

package mapreduce;

import java.io.IOException;
import java.util.Iterator;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

public class WordcountReducer extends Reducer<Text, IntWritable, Text, IntWritable>{

    @Override
    protected void reduce(Text key, Iterable<IntWritable> values,Context context) throws IOException, InterruptedException {

        int count = 0;
        Iterator<IntWritable> iterator = values.iterator();
        while(iterator.hasNext()){
            IntWritable value = iterator.next();
            count += value.get();
        }
        context.write(key, new IntWritable(count));
    }
}

3、客户端类Submitter开发

package mapreduce;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
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;
import java.io.IOException;
import java.net.URI;
public class JobSubmitter {
    public static class MyMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
        Text k2 = new Text();
        IntWritable v2 = new IntWritable(1);

        @Override
        protected void map(LongWritable k1, Text v1, Context context) throws IOException, InterruptedException {
            String[] strs = v1.toString().split(" ");
            for (String s : strs) {
                k2.set(s);
                context.write(k2, v2);
            }

        }
    }
  public static class MyReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
        IntWritable v3 = new IntWritable();

        @Override
        protected void reduce(Text k2, Iterable<IntWritable> v2s, Context context) throws IOException, InterruptedException {
            int sum = 0;
            for (IntWritable i : v2s) {
                sum += i.get();
            }
            v3.set(sum);
            context.write(k2, v3);
        }
    }
 public static void main(String[] args) throws Exception {
        // 在代码中设置JVM系统参数,用于给job对象来获取访问HDFS的用户身份
        // 或者通过eclipse图形化界面来设置 -DHADOOP_USER_NAME=root
        System.setProperty("HADOOP_USER_NAME", "root") ;


        Configuration conf = new Configuration();
        // 1、设置job运行时要访问的默认文件系统, map阶段要去读数据,reduce阶段要写数据
        conf.set("fs.defaultFS", "hdfs://master105:9000");
        // 2、设置job提交到哪去运行:有本地模拟的方式local
        conf.set("mapreduce.framework.name", "yarn");
        conf.set("yarn.resourcemanager.hostname", "master105");
        // 3、如果要从windows系统上运行这个job提交客户端程序,则需要加这个跨平台提交的参数
        conf.set("mapreduce.app-submission.cross-platform","true");

        // job中还要封装个多的参数
        Job job = Job.getInstance(conf);

        // 1、封装参数:jar包所在的位置:因为job客户端将来要把jar包(整个工程)发给yarn
        //job.setJar("d:/wc.jar");
        job.setJarByClass(JobSubmitter.class);//动态获取方式

          // 2、封装参数: 本次job所要调用的Mapper实现类、Reducer实现类
        job.setMapperClass(WordcountMapper.class);
        job.setReducerClass(WordcountReducer.class);

        // 3、封装参数:本次job的Mapper实现类、Reducer实现类产生的结果数据的key、value类型
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);

        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);

        
        Path output = new Path("/wordcount/output");
        FileSystem fs = FileSystem.get(new URI("hdfs://master105:9000"),conf,"root");
        if(fs.exists(output)){
            fs.delete(output, true);
        }

        // 4、封装参数:本次job要处理的输入数据集所在路径、最终结果的输出路径
        FileInputFormat.setInputPaths(job, new Path("/test/words"));
        FileOutputFormat.setOutputPath(job, output);  // 注意:输出路径必须不存在

         // 5、封装参数:想要启动的reduce task的数量(默认1),map task不需要设定,会根据数据集的大小自动切片计算。
        job.setNumReduceTasks(2);

        // 6、提交job给yarn,等待集群完成,这是一个阻塞式方法
        // 返回true表示mapreduce程序正常运行,false表示mapreduce程序运行失败,可能是中间的某一步。
        boolean res = job.waitForCompletion(true);//true便是吧Resource manager(会不断的反馈信息)反馈回来的信息输出。
        //job.submit();//提交之后直接退出

        //控制退出码
        System.exit(res?0:-1);

    }
}

整个项目结构如下

pom.文件,注意红色框中部分

4、测试,我们把上面项目打包成ss-1.0.jar,然后上传到集群的master服务器,执行job

hadoop jar ss-1.0.jar com.ss.hdfs.mapreduce.JobSubmitter

可以看到以下内容

说明已经执行成功,我们读取结果文件 hdfs dfs -cat /wordcount/output/p*

到这里,我们就实现了java编码MapReduce

总结
        感谢能看到这里的朋友😉

        本次的分享就到这里,猫头鹰数据致力于为大家分享技术干货😎

        如果以上过程中出现了任何的纰漏错误,烦请大佬们指正😅

        受益的朋友或对技术感兴趣的伙伴记得点赞关注支持一波🙏

        也可以搜索关注我的微信公众号【猫头鹰数据分析】,留言交流🙏

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

大数据分析学习第六课 使用Java语言开发MapReduce实战 的相关文章

  • 如何做好项目经理

    我一直赞同这个观点 xff1a 项目经理是干出来的 xff0c 不是学出来的 xff1b 是带出来的 xff0c 不是教出来的 一个人要成长为一名合格的项目经理主要不是靠学 xff0c 而是靠干 xff0c 当然学也很重要 靠干 xff0c
  • Javascript进制转换

    介绍一个简单的用Javascript进行 进制 转换的方式 xff1a 将十进制转换为十六进制 xff1a var i 61 10 alert parseInt 10 10 toString 16 同样 xff0c 将十六进制转换为十进制
  • js实现进制变换 10->16

    进制变换 10 gt 16 function heTransform data var pattern 61 new RegExp 39 1 9 d 0 39 判断是否是10进制数字 if pattern test data var hex
  • 用Visual C#实现局域网点对点通讯

    用Visual C xff03 实现局域网点对点通讯 作者 xff1a 马金虎 日期 xff1a 2003 9 28 出处 xff1a P2P中国 PPcn net 点对点即Peer To Peer xff0c 通常简写为P2P 所谓网络中
  • Makefile学习总结

    Data 2017 12 07 Author cjh Theme Makefile Tutorial 俗话说 xff0c 工欲善其事必先利其器 xff0c 所以我们先来介绍一下Makefile中的特殊字符 64 表示目标文件 表示所有的依赖
  • stmdb和ldmia

    stmdb xff1a db xff08 decrease before xff09 表示先减后存 指令 stmdb sp fp ip lr pc 34 表示sp等于最终被修改的sp的值 假设 sp 61 4096 xff0c 此条指令的执
  • ros之tf经验总结

    1 概念 搞ros都离不开tf xff0c 当建立一个机器人模型时 xff0c 第一步就是要确定机器人的tf结构 以kobuki导航运行为例 xff0c 首先是 map xff1a 地图坐标 xff0c 固定坐标系 odom xff1a 机
  • setInterval和setTimeout的缺陷和优势分析

    先把问题摆出来 xff1a 使用定时器的setInterval xff08 xff09 方法会出现程序并不是按照我们设定的精确时间而调用的问题 xff01 定时器 xff1a 在JavaScript中经常会使用定时器来进行延时或者是重复调用
  • 关于KEIL调试时CortexJLink中SW Device检测不到芯片解决办法

    使用Jlink第一次下载成功后 xff0c 第二次检测不到设备 xff0c 极大原因是因为软件配置了SWDIO和SWCLK的状态导致的 解决办法 xff1a 软件中将配置两个引脚状态程序注释 xff0c 将芯片的BOOT0引脚接高电平 xf
  • Web大规模高并发请求和抢购的解决方案

    电商的秒杀和抢购 xff0c 对我们来说 xff0c 都不是一个陌生的东西 然而 xff0c 从技术的角度来说 xff0c 这对于Web系统是一个巨大的考验 当一个Web系统 xff0c 在一秒钟内收到数以万计甚至更多请求时 xff0c 系
  • Java用自定义的类作为HashMap的key值

    这是Java中很经典的问题 xff0c 在面试中也经常被问起 其实很多书或者文章都提到过要重载hashCode 和equals 两个方法才能实现自定义键在HashMap中的查找 xff0c 但是为什么要这样以及如果不这样做会产生什么后果 x
  • Maven类包冲突终极三大解决技巧 mvn dependency:tree

    举例 A依赖于B及C xff0c 而B又依赖于X Y xff0c 而C依赖于X M xff0c 则A除引B及C的依赖包下 xff0c 还会引入X xff0c Y xff0c M的依赖包 xff08 一般情况下了 xff0c Maven可通过
  • idea中的实现接口时@Override注解问题

    摘要 用IntelliJ 15打开一个以前的工程 xff0c 发现代码出现很多关于 64 Override的错误 xff0c 编辑器提示 xff1a 64 Override is not allowed when implementing
  • mac下idea的使用之java工程打包生成jar篇

    我们先选中工程 xff0c 然后点如下的图标 xff0c 打开配置文件 xff0c 再选中artifacts选项 xff0c 再点加号选jar 起一个名字 xff0c 然后再填写好要打到的路径 xff0c 下面就是我们要选择我们需要的包或着
  • Memory Dependencies-内存依赖

    Data 2017 12 28 Author cjh Theme Memory Dependencies 本篇内容是基于TI TMS320C6000Programmer s Guide手册第2 2 2 Memory Dependencies
  • Python中获取异常(Exception)信息

    异常信息的获取对于程序的调试非常重要 xff0c 可以有助于快速定位有错误程序语句的位置 下面介绍几种python中获取异常信息的方法 xff0c 这里获取异常 xff08 Exception xff09 信息采用try except 程序
  • 聚类、K-Means、例子、细节

    聚类 今天说聚类 xff0c 但是必须要先理解聚类和分类的区别 xff0c 很多业务人员在日常分析时候不是很严谨 xff0c 混为一谈 xff0c 其实二者有本质的区别 分类其实是从特定的数据中挖掘模式 xff0c 作出判断的过程 比如Gm
  • CTR中的特征哈希

    在CTR预估中 xff0c 一种做法是采用人工来做feature engineering xff0c 将一些非线性的feature转换为线性的feature xff0c 然后喂给LR之类的线性model来做在线学习 xff0c 在这个过程中
  • go的一些基本知识

    go 编译 xff0c 依赖 GOPATH 找到src https blog csdn net u012210379 article details 50443636 go logging http www yeolar com note
  • 论文精读-DeepFM

    转载一篇博客文章 https blog csdn net zynash2 article details 79348540 DNN部分的详细推导见 xff1a https blog csdn net zynash2 article deta

随机推荐

  • 《玲音》

    这年头时兴谈互联网思维 xff0c 最近看了二十年前的一部动漫 玲音 xff0c 里面还真是有不少互联网思维 xff0c 以下剧透 xff1a 玲音是一个中学女生 xff0c 性格内向自闭 xff0c 一直过着平淡的生活 xff0c 与家庭
  • idea中安装activity插件actibpm,文章中有下载链接

    我的个人网站 等不见天亮等时光 插件的安装路径有这么几种 从idea setting plugin 选择商店 在商店中直接输入actibpm 可以直接进行安装 由于网站的地址在国外 如果你没得梯子的话 中间肯定会安装失败 所以我建议在安装时
  • unrecognized command line option '-V' 解决方法

    xgcc error unrecognized command line option 39 V 39 xgcc fatal error no input files 真正的错误并不在这里 xff0c 而是在最后一个错误出现的地方 我遇到的
  • ROS教程译文1———TF转换树的设置和使用

    本文属于ROS翻译文章 xff0c 来自WIKI http wiki ros org navigation Tutorials RobotSetup TF 由于水平有限 xff0c 翻译错误在所难免 xff0c 发现错误欢迎评论或联系作者
  • TI Openmp clacc编译器讲解

    Data 2017 12 29 Author cjh Theme TI Openmp clacc编译器讲解 本章内容主要分四讲来讲 xff1a 一 clacc编译器的讲解 二 makefile的讲解 三 openmp target语法讲解
  • 第二讲 STM32相关底层配置(一)

    本文是针对stm32F1系列的一些基础部分的底层配置的流程的总结 主要包括了GPIO普通配置 GPIO复用配置 GPIO重映射配置及中断优先级管理 其中紫色部分为调用正点原子的SYSTEM文件夹里的函数来实现相应步骤 GPIO普通配置 1
  • RCP开发中,对当前字体名字的获得

    Display getCurrent getSystemFont getFontData 0 getName 这句话获得的是当前字体的名字
  • sql server 中OPENROWSET与OPENDATASOURCE的用法

    SELECT FROM OPENROWSET 39 sqloledb 1 39 39 mrp server 39 39 sa 39 39 123 39 DBdata dbo tbG gzzxzl SELECT a FROM OPENROWS
  • 【RP2物联网实战(一)】C/C++&FreeRTOS版

    写在前面 树莓派pico xff0c 又称为RP2 xff0c 其开发方式多种多样 xff0c 有C语言和micropython语言 xff0c 工具有cmake xff0c vscode xff0c arduino xff0c thonn
  • CAS 5.3使用MySQL数据库登录

    作者 xff1a 张永利 一 本例环境说明 JDK 1 8CAS 5 3apache maven 3 6 0mysql 5 6 32 二 CAS 5 3基础环境搭建与验证 需要按照 CAS 5 3服务器搭建 搭建好环境 xff0c 并使用系
  • JAVA底层常见面试题

    关于集合 1 Java中的集合及其继承关系 关于集合的体系是每个人都应该烂熟于心的 尤其是对我们经常使用的List Map的原理更该如此 2 poll 方法和remove 方法区别 xff1f poll 和 remove 都是从队列中取出一
  • Realsense D435i 深度图优化_高精度模式

    目录 1 Intel RealSense Viewer中高精度预设 2 深度图优化 1 Intel RealSense Viewer中高精度预设 1 打开Intel RealSense Viewer 2 Preset gt High Acc
  • 知乎登录出现Miss argument grant_type 无法成功登录解决方法

    知乎的模拟登录 xff0c 出现Miss argument grant type 无法成功登录 根据网上的说法 需要进行chrome版本降级 要使用用Chrome 60版本 chromedriver2 3 1 chrome浏览器降到60版本
  • Cant Find Compiler Executable In Your Configured Search Path"的解决方法

    今天因为课后作业要使用C语言编程 xff0c 所以装了心爱的codeBlocks 无奈打开使用的时候却弹出 Cant Find Compiler Executable In Your Configured Search Path 的错误 导
  • 解决野火iMX6ULL-wifi连接问题

    这里主要解决的是野火的linux EBF6ULL S1 pro板子的AP6212wifi 模块无法顺利连接wifi的问题 按照视频里面说的进行操作 xff0c 未能顺利连接wifi 解决这个问题要注意下面几个问题 pro板子目前我知道可能分
  • tail命令详解

    tail命令 用途 xff1a 显示文件的最后几行 标准语法 xff1a tail f c Number n Number m Number b Number k Number file 逆序显示行 xff1a tail r n Numbe
  • 历史上消失的那 10 天去哪了?

    如果你查过万年历 xff0c 会发现1582年10月居然少了10天 xff01 http wannianli fkcha com year 1582 month 10 html Linux上有个cal命令可以查日历 xff0c 如果你查过1
  • 这些年,那些我们一起读过的代码

    刚毕业不久 xff0c 工作经验吧 xff0c 谈不上 xff0c 不过书架上那些东东还是能拿出来分享一下下的 xff1a 工作性质吧 xff0c 先就说下快速桌面应用开发工具之delphi吧 xff1a 1 delphi 6 开发人员指南
  • C++码农要读的经典

    刚大四 xff0c 还在忙着找工作 xff0c 读过的书不是很多 xff0c 还有一些好书在读 xff0c 还有一些书将来必读 C语言程序设计 谭浩强版本 这个版本一致被人说误导子弟 xff0c 当然还有很多人推崇 我觉得这本书不是什么好书
  • 大数据分析学习第六课 使用Java语言开发MapReduce实战

    我们知道 xff0c 从Hadoop官网下载的部署包里 xff0c 提供了不少jar包示例 xff0c 但是我们不了解内部的实现逻辑 xff0c 今天我就给大家介绍下 xff0c 在java开发环境下怎么实现一个MapReduce redu