大数据之MapReduce

news2025/1/15 6:50:38

MapReduce概述

是一个分布式的编程框架,MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个Hadoop集群上。

  • 优点:
    • 易于编程,简单的实现一些接口,就可以完成一个分布式程序。
    • 良好的扩展性,可以增加机器来扩展计算能力。
    • 高容错性,子任务失败后可以重试4次。
  • 缺点:
    • 不擅长实时计算
    • 不能进行流式计算,MapReduce的输入数据集是静态的,不能动态变化。
    • 不擅长DAG有向无环图:下一段计算的起始数据取决于上一个阶段的结果。

MapReduce核心思想

  1. Map: 读单词,进行分区
  2. Shuffle:排序是框架内固定的代码,必须排序。进行快排
  3. Reduce:对区间有序的内容进行归并排序,累加单词
  4. 在MapReduce过程中只能有一个Map和一个Reduce
  • MapReduce进程
  1. MrAppMaster:负责整个程序的过程调度及状态协调。
  2. MapTask:负责Map阶段的整个数据处理流程。
  3. ReduceTask:负责Reduce阶段的整个数据处理流程。
  • 序列化
    • 变量类型后面加上Writable,转换成可以序列化的类型
    • String类型有点特别,相应的序列化类型为Text
    • java类型转hadoop类型
      • private IntWritable key = new IntWritable();
      • key.set(java_value);
      • 构造器转换 new intWritable(1);
    • hadoop类型转java类型
      • int value = key.get();

WordCount案例

Driver类的8个步骤

该类中的步骤是使用hadoop框架的核心,这8个步骤是写死的,无法更改,具体为:

  1. 获取配置信息,获取job对象实例
  2. 指定本程序的jar包所在的本地路径
  3. 关联Mapper/Reducer业务类
  4. 指定Mapper输出数据的kv类型
  5. 指定最终输出数据的kv类型,部分案例不需要reduce这个步骤
  6. 指定job的输入原始文件所在目录
  7. 指定job的输出结果所在目录
  8. 提交作业

WordCountMapper类的实现

  1. 继承mapper类,选择mapreduce包,新版本,老版本的叫mapred包
  2. 根据业务需求设定泛型的具体类型,输入的kv类型,输出的kv类型。
    • 输入类型
      • keyIn:起始偏移量,是字节偏移量。一般不参与计算,类型为longwritable
      • valueIn:每一行数据,类型为Text
    • 输出类型
      • keyOut: 每个单词
      • valueOut:数字1
  3. 重写map方法,ctrl + o 快捷键重写方法
	@Override
    protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context) throws IOException, InterruptedException {
        //1.获取一行
        // atguigu atguigu
        String line = value.toString();

        //2.切割
        //atguigu
        //atguigu
        String[] words = line.split(" ");

        //3.循环写出
        for (String word : words) {
            //封装outKey
            context.write(new Text(word),new IntWritable(1));
        }
    }

WordCountReducer类的实现

  1. 继承Reduce类
  2. 设置输入输出类型
    • 输入: 跟Map的输出类型对应即可
    • 输出:
      • keyInt, 单词,类型为Text
      • keyOut, 次数,类型为IntWritable
  3. 重写reduce方法
	@Override
    protected void reduce(Text key, Iterable<IntWritable> values, Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {
        int sum = 0;
        //atguigu(1,1)
        //累加
        for (IntWritable value : values) {
            sum += value.get();
        }
        //写出
        context.write(key, new IntWritable(sum);//注意
    }

在处理大数据时,不要在循环中new对象,创建对象是很消耗资源的。可以使用ctrl + alt + F将这两个变量提升为全局变量,作为Reducer类的属性值。但其实还有更好的方法,可以使用Mapper类中的setup()方法来实现该需求。该方法是框架里面原本就设定好的方法,在map阶段前只会执行1次。

private Text outKey;
    private IntWritable outValue;

    @Override
    protected void setup(Mapper<LongWritable, Text, Text, IntWritable>.Context context) throws IOException, InterruptedException {
        outKey = new Text();
        outValue = new IntWritable(1);
    }

Driver类的实现

该类的写法基本上是固定的,不同需求只需要在此基础上修改一下map和reduce业务类即可。

public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {

        //1.获取Job
        Configuration conf = new Configuration();
        Job job = Job.getInstance();

        //2.设置jar包路径,绑定driver类
        job.setJarByClass(WordCountDriver.class);

        //3.关联mapper和reducer
        job.setMapperClass(WordCountMapper.class);
        job.setReducerClass(WordCountReducer.class);

        //4.设置map的kv类型
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);

        //5.设置最终输出的kv类型
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);

        //6.设置输入路径和输出路径
        FileInputFormat.setInputPaths(job, new Path("D:\\inputOutput\\input\\wordcount"));
        FileOutputFormat.setOutputPath(job, new Path("D:\\inputOutput\\output\\output666"));

        //7.提交job
        job.waitForCompletion(true);
    }

打包本地程序到集群中运行

  1. 修改本地程序Driver类中的输入输出路径
//6.设置输入路径和输出路径
FileInputFormat.setInputPaths(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
  1. 使用maven的package命令打包本地程序成.jar文件,生成的jar包在target目录下
  2. 使用jar命令解压运行jar 包名 数据输入路径 数据输出路径

可以直接在window中的IDEA中发送任务到Linux集群中,但配置方式较为烦琐,生产环境中使用该方法的人较少。

序列化

java序列化

序列化目的是将内存的对象放进磁盘中进行保存,序列化实际上是为了传输对象中的属性值,而不是方法。序列化本质上是一种数据传输技术,IO流。

  • ObjectOutputStream 序列化流 writeObject()
  • ObjectInputStream 反序列化流 readObject(Object obj)
  • 序列化前提条件:
    • 实现Serializable接口
    • 空参构造器
    • 私有的属性
    • 准备get和set方法

总结:java序列化是一个比较重的序列化,序列化的内容很多,比如属性+校验+血缘关系+元数据。

hadoop序列化

特点: 轻量化,只有属性值和校验

hadoop中自定义bean对象步骤:

  1. 实现writable接口
  2. 空参构造器
  3. 私有的属性
  4. get和set方法
  5. 重写write方法和readFields方法(write方法出现的属性顺序必须和readFields的读取顺序一致)
  6. 如果自定义的bean对象要作为reduce的输出结果,需要重写toString方法,否则存入磁盘的是地址值
  7. 如果自定义的bean对象要作为map输出结果中的key进行输出,并进行reduce操作,必须实现comparable接口。

MapReduce框架原理

  • 粗略流程:mapreduce = map + reduce
  • 大体流程:mapreduce = inputFormat --> map --> shuffle(排序) --> reduce -->outputFormat
  • 源码流程:
    1. inputformat
    2. map
      • map
      • sort: 按照字典序进行快排
    3. reduce
      • copy:拉取map的处理结果
      • sort:由于结果是局部有序,不是整体有序,进行归并排序
      • reduce:之后再进行数据合并规约

InputFormat/OutputFormat基类

实现类有TextInputFormat和TextOutputFormat, 其中重点是切片逻辑和读写逻辑,读写部分的代码框架已经写死了,主要关注如何切片即可。

切片与MapTask并行度决定机制

数据块:Block是物理上真的分开存储了。
数据切片:只是逻辑上进行分片处理,每个数据切片对应一个MapTask。

正常来说,如果数据有300M,我们按照常理来说会平均划分成3 x 100 M,但是物理上每个物理块是128M,每个MapTask进行计算时需要从另外那个主机读取数据,跨越主机读取数据需要进行网络IO,这是很慢的。
切片
所有MR选择的是按照128M来进行切分,尽管这样会导致划分的数据块并不是十分均匀,但是对于网络IO的延迟来说,还是可以接受的。

Hadoop提交流程源码和切片源码

提交源码主要debug节点

  1. job.waitForCompletion()
    • JobState枚举类,DEFINE、RUNING
  2. submit()
  3. connect()
    • 匿名内部类、new方法 无法进入,打好断点,点击快速运行进入
    • ctrl + alt + 左方向键,可以返回原先的位置
    • initProviderList(): 添加了本地客户端协议和Yarn客户端协议
    • create(conf): 根据配置文件来决定代码的运行环境(Yarn分布式环境/本地单机环境)
  4. submitter 根据运行环境获取相应的提交器
  5. checkSpecs(job):检查输出路径是否正确
  6. jobStagingArea: job的临时运行区域,给定一个绝对路径的目录D:\tmp\hadoop\mapred\staging,里面存放了:
    • local: 切片结果+8个配置文件总和
    • yarn:切片结果+8个配置文件总和+jar包
  7. copyAndConfigureFiles(): 读取任务需要的支持文件读取到job的临时运行环境中,在Yarn环境中,会上传jar包到该路径中
  8. writeSplits():给数据添加切片标记,实际还未切分,会生成切片文件到临时区域中
  9. writeConf(): 写配置文件到目录中

提交源码总结:

  • mapreduce.framework.name这个参数决定了运行环境
  • 切片个数决定了MapTask个数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/980924.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CentOS 7删除virbr0虚拟网卡

在CentOS 7的安装过程中如果有选择相关虚拟化的的服务安装系统后&#xff0c;启动网卡时会发现有一个以网桥连接的私网地址的virbr0网卡&#xff0c;这个是因为在虚拟化中有使用到libvirtd服务生成的&#xff0c;如果不需要可以关闭后去掉&#xff1a; 一、查看IP及网桥设备 [r…

Ajax介绍、爬取案例实战 + MongoDB存储

Ajax介绍 Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;是一种用于在Web应用程序中实现异步通信的技术。它允许在不刷新整个网页的情况下&#xff0c;通过在后台与服务器进行数据交换&#xff0c;实时更新网页的一部分。Ajax的主要特点包括&#xff1a; 异步通…

前端框架 vue-admin-template的搭建运行

一介绍 1.1 下载地址 vue-element-admin是基于element-ui 的一套后台管理系统集成方案。 GitHub - PanJiaChen/vue-element-admin: :tada: A magical vue admin https://panjiachen.github.io/vue-element-admin 1.2 node.js的安装 地址下载node.js 1.6版本 CNPM Binari…

2023 IntelliJ IDEA下载、安装教程, 附详细图解

文章目录 下载与安装IDEA推荐阅读 下载与安装IDEA 首先先到官网下载最新版的IntelliJ IDEA, 下载后傻瓜式安装就好了 官网下载地址&#xff1a;https://www.jetbrains.com/ 1、下载完后在本地找到该文件&#xff0c;双击运行 idea 安装程序 2、点击 Next 3、选择安装路径&…

sqlmap --os-shell(写入木马获取getshell)

在存在sql注入处&#xff0c;可以使用--os-shell 对存在SQL注入处抓包&#xff0c;查看报错暴露出绝对路径 将POST包放入TXT文本中 启动sqlmap 读取TXT文件 python sqlmap.py -r C:\Users\南倾\Desktop\222.txt --os-shell 写入木马到文件中 echo "<?php eval($_R…

复旦-华盛顿EMBA:AI时代掘金,科技进化里的挑战与机遇

如果从去年年底ChatGPT3.5发布算起&#xff0c;AI赛道的热度已经持续飙升了半年有余。      “AI的iPhone时刻”代表什么&#xff1f;AI驱动的商业时代已经到来&#xff1f;      我们能看到担忧、恐惧、憧憬&#xff0c;但唯独不缺狂飙突进、加速进化。人类制造AI&…

ES 集群常用排查命令

说明&#xff1a;集群使用非默认端口9200&#xff0c;使用的是7116端口举例 一、常用命令 #1.集群健康状态 [wlsadminelastic-01~]$ curl -XGET "http://10.219.27.00:7116/_cluster/health?pretty" { cluster name":"cluster" "status"…

线性代数的学习和整理19,特征值,特征向量,以及引入的正交化矩阵概念

目录 1 什么是特征值和特征向量&#xff1f; 1.1 特征值和特征向量这2个概念先放后 1.2 直观定义 1.3 严格定义 2 如何求特征值和特征向量 2.1 方法1&#xff1a;结合图形看&#xff0c;直观方法求 2.1.1 单位矩阵的特征值和特征向量 2.1.2 旋转矩阵 2.2 根据严格定义…

网络协议从入门到底层原理学习(三)—— 路由

网络协议从入门到底层原理学习&#xff08;三&#xff09;—— 路由 1、简介 路由&#xff08;routing&#xff09;是指分组从源到目的地时&#xff0c;决定端到端路径的网络范围的进程 在不同网段之间转发数据&#xff0c;需要有路由器的支持 默认情况下&#xff0c;路由器…

64.C++运算符重载

目录 1.可重载\不可重载运算符 2.重载运算符&#xff1a; 3.重载运算符&#xff1a; 4.重载运算符&#xff1a;- - 5.重载运算符&#xff1a;<< 6.重载运算符&#xff1a; 运算符重载是一种C的特性&#xff0c;它允许重新定义或扩展已存在的运算符&#xff0c;以使…

语音芯片NV040D在电动车的防盗应用

在现代社会&#xff0c;人们的出行方式往往有多种多样。但电动车在交通工具中依然占据着重要地位&#xff0c;帮助人们节省了较长的通勤时间。随着电动车数量的不断增加&#xff0c;车辆的防盗也成为了人们万分重视的问题。因而选择一辆具备预警功能与故障提示的智能电动车是必…

Lua01——概述

Lua是啥&#xff1f; 官网 https://www.lua.org Lua这个名字在葡萄牙语中的意思是“美丽的月亮”&#xff0c;诞生于巴西的大学实验室。 这是一个小巧、高效且能够很好的和C语言一起工作的编程语言。 在脚本语言领域中&#xff0c;Lua因为有资格作为游戏开发的备选方案&…

WebGL 纹理——在矩形表面贴上图像

目录 WebGL要进行纹理映射&#xff0c;需遵循以下四步&#xff1a; 1. 准备好映射到几何图形上的纹理图像。 2. 为几何图形配置纹理映射方式。 3. 加载纹理图像&#xff0c;对其进行一些配置&#xff0c;以在WebGL中使用它。 4. 在片元着色器中将相应的纹素从纹理中抽取出…

密码找回安全

文章目录 密码找回安全任意秘密重置 密码找回安全 用户提交修改密码请求;账号认证:服务器发送唯一ID (例如信验证码)只有账户所有者才能看的地方&#xff0c;完成身份验证&#xff1b;身份验证:用户提交验证码完成身份验证;修改密码:用户修改密码。 任意秘密重置 登录metinfo4…

STM32 软件IIC 控制OLED 显示屏

1. 硬件IIC 实在是太难用了&#xff0c;各种卡死&#xff0c;各种发不出来数据&#xff0c;没那么多时间折腾了&#xff0c;还是用软件IIC 先吧&#xff0c;初始化 void OLED_Software_IIC_Init(void) {GPIO_InitTypeDef GPIO_InitStruct;RCC_AHBPeriphClockCmd(OLED_SOFTWARE…

分布式锁java程序怎么处理 zk与redis

curator 基于zk实现实现了一套高级功能&#xff0c;比如有分布式锁 当第二客户端加锁时&#xff0c;会先判断它前面有没有第一个节点&#xff0c;如果有就加锁失败&#xff0c;同时就对它上一个节 点加一个watcher监听器&#xff0c;当第一个节点释放或客户端A宕机时&#xff…

Redis从基础到进阶篇(四)----性能调优、分布式锁与缓存问题

目录 一、Redis 集群演变 1.1 ReplicationSentinel*高可用 1.2 ProxyReplicationSentinel(仅仅了解) 1.3 Redis Cluster 集群 (重点&#xff09; 1.3.1 Redis-cluster架构图 1.3.2 工作原理 1.3.3 主从切换 1.3.4 副本漂移 1.3.5 分片漂移 二、Redis版本历史&#xf…

flink学习之广播流与合流操作demo

广播流是什么&#xff1f; 将一条数据广播到所有的节点。使用 dataStream.broadCast() 广播流使用场景&#xff1f; 一般用于动态加载配置项。比如lol&#xff0c;每天不断有人再投诉举报&#xff0c;客服根本忙不过来&#xff0c;腾讯内部做了一个判断&#xff0c;只有vip3…

Android开发-Mac Android开发环境搭建(Android Studio Mac环境详细安装教程,适合新手)...

1.进入Android Studio官网 https://developer.android.google.cn/studio 2.点击下载Android Studio. 3.将说明拉到最下方,选择Mac With Apple Chip.苹果芯片选择Apple Chip,如果是Intel芯片可以选择Intel. 4.下载完成后,双击进入Android Studio. 点击打开. 5.如果是第一次安装,…

【枚举子序列+组合数学+推式子】Cf Edu11 E

https://codeforces.com/contest/660/problem/E 题意&#xff1a; 思路&#xff1a; 重点在于枚举子序列&#xff0c;一般是先枚举子序列长度&#xff0c;然后枚举别的 算是经典套路 Code&#xff1a; #include <bits/stdc.h>#define int long longusing i64 long lo…