大数据之MapReduce

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 快捷键重写方法
	@Overrideprotected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context) throws IOException, InterruptedException {//1.获取一行// atguigu atguiguString line = value.toString();//2.切割//atguigu//atguiguString[] words = line.split(" ");//3.循环写出for (String word : words) {//封装outKeycontext.write(new Text(word),new IntWritable(1));}}

WordCountReducer类的实现

  1. 继承Reduce类
  2. 设置输入输出类型
    • 输入: 跟Map的输出类型对应即可
    • 输出:
      • keyInt, 单词,类型为Text
      • keyOut, 次数,类型为IntWritable
  3. 重写reduce方法
	@Overrideprotected 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;@Overrideprotected 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.获取JobConfiguration conf = new Configuration();Job job = Job.getInstance();//2.设置jar包路径,绑定driver类job.setJarByClass(WordCountDriver.class);//3.关联mapper和reducerjob.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.提交jobjob.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.rhkb.cn/news/123259.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C高级 DAY1

一、复习 命令行提示符 ubuntuubuntu:~$ 第一个ubuntu:用户名 第二个ubuntu:主机名 &#xff1a; ---> 分割符 ~ &#xff1a; 用户的家目录 $: 普通用户 #&#xff1a;管理员 切换用户 su 用户名---》切换至指定用户 su --》切换至超级用户 sudo 加在…

excel表格怎么换行?好用的3个方法

excel是一款功能齐全的电子表格应用程序&#xff0c;广泛用于数据分析、记录和管理。在创建excel表格时&#xff0c;有时候我们需要在单元格中输入较长的文本内容&#xff0c;这时如何进行换行是一个常见问题。本文将为您介绍excel表格怎么换行的3种方法&#xff0c;帮助您轻松…

LeetCode 3. 无重复字符的最长子串

题目链接 题目解析 我们需要找的是含重复元素的最长子串&#xff0c;当然直接暴力求解固然简单。但是可能引发的情况是超时&#xff0c;而且面试官想看到的也不是让你去暴力解决这类问题。因此我们使用哈希滑动窗口的思想来解决。 滑动窗口哈希 使用哈希表的缘故是更好的判…

Vue + Element UI 实现权限管理系统 前端篇(四):优化登录流程

完善登录流程 1. 丰富登录界面 1.1 从 Element 指南中选择组件模板丰富登录界面&#xff0c;放置一个登录界面表单&#xff0c;包含账号密码输入框和登录重置按钮。 <template><el-form :model"loginForm" :rules"fieldRules" ref"loginFo…

ORB-SLAM2算法14之局部建图线程Local Mapping

文章目录 0 引言1 概述2 处理队列中的关键帧3 剔除坏的地图点4 创建新地图点5 融合当前关键帧和其共视帧的地图点6 局部BA优化7 剔除冗余关键帧 0 引言 ORB-SLAM2算法7详细了解了System主类和多线程、ORB-SLAM2学习笔记8详细了解了图像特征点提取和描述子的生成、ORB-SLAM2算法…

LeetCode 1113.报告的记录

数据准备 Create table If Not Exists Actions (user_id int, post_id int, action_date date, action ENUM(view, like, reaction, comment, report, share), extra varchar(10)); Truncate table Actions; insert into Actions (user_id, post_id, action_date, action, ext…

MySQL——存储引擎

简介 MySQL数据库主要的存储引擎&#xff1a; MyISAM和InnoDB简介 MyISAM是MySQL的默认数据库引擎&#xff08;5.5版之前&#xff09;&#xff0c;由早期的 ISAM &#xff08;Indexed Sequential Access Method&#xff1a;有索引的顺序访问方法&#xff09;所改良。虽然性能…

Gateway--服务网关

1 网关简介 大家都都知道在微服务架构中&#xff0c;一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用 这么多的微服务呢&#xff1f;如果没有网关的存在&#xff0c;我们只能在客户端记录每个微服务的地址&#xff0c;然后分别去调用。 这样的架构&#xff0c;会…

Elasticsearch:wildcard - 通配符搜索

Elasticsearch 是一个分布式、免费和开放的搜索和分析引擎&#xff0c;适用于所有类型的数据&#xff0c;例如文本、数字、地理空间、结构化和非结构化数据。 它基于 Apache Lucene 构建&#xff0c;Apache Lucene 是一个全文搜索引擎&#xff0c;可用于各种编程语言。 由于其速…

mysql(十)mysql主从复制--主库切换

概述 可能为了更迭升级服务器&#xff0c;或者主库出现问题&#xff0c;又或者只是希望重新分配容量&#xff0c;此时需要切换主库。 如果这是计划内的切换&#xff0c;会相对容易点。只需要在从库上使用CHANGE MASTER TO命令&#xff0c;并设置合适的值。大多数的值都是可选…

苍穹外卖 day12 Echats 营业台数据可视化整合

苍穹外卖-day12 课程内容 工作台Apache POI导出运营数据Excel报表 功能实现&#xff1a;工作台、数据导出 工作台效果图&#xff1a; 数据导出效果图&#xff1a; 在数据统计页面点击数据导出&#xff1a;生成Excel报表 1. 工作台 1.1 需求分析和设计 1.1.1 产品原型 工作台是系…

2023年智能家居占消费电子出货量28%,蓝牙Mesh照明占据重要位置

市场研究机构 TechInsights 的最新报告显示&#xff0c;预计 2023 年全球消费者在智能家居相关硬件、服务和安装费方面的支出将复苏&#xff0c;达到 1310 亿美元&#xff0c;比 2022 年增长 10%。TechInsights 表示&#xff0c;消费者在智能家居系统和服务上的支出将继续强劲增…

架构师如何做好需求分析

架构师如何做好需求分析 目录概述需求&#xff1a; 设计思路实现思路分析1.主要步骤 2.主要步骤2操作步骤 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,…

Fiddler安装与使用教程(2) —— 软测大玩家

&#x1f60f;作者简介&#xff1a;博主是一位测试管理者&#xff0c;同时也是一名对外企业兼职讲师。 &#x1f4e1;主页地址&#xff1a;【Austin_zhai】 &#x1f646;目的与景愿&#xff1a;旨在于能帮助更多的测试行业人员提升软硬技能&#xff0c;分享行业相关最新信息。…

数据结构例题代码及其讲解-递归与树

树 ​ 树的很多题目中都包含递归的思想 递归 递归包括递归边界以及递归式 即&#xff1a;往下递&#xff0c;往上归 递归写法的特点&#xff1a;写起来代码较短&#xff0c;但是时间复杂度较高 01 利用递归求解 n 的阶乘。 int Func(int n) {if (n 0) {return 1;}else …

码云使用记录

码云使用记录 主要步骤 1、https://gitee.com 注册 2、下载Git 3、配置SSH 4、创建远程仓库 5、切到本地项目目录下将本地项目推到远程 前两步根据提示进行即可&#xff0c;下面从第三步开始讲解 3、配置SSH&#xff08;用于提交代码和更新代码&#xff09; https://gitee.…

行人属性识别数据集PA100K介绍

本文介绍pa100k数据集&#xff0c;是从GitHub上paddleCLA工程中提供的路径下载&#xff0c;针对该数据集进行介绍&#xff1a; 01 - 图像信息 训练集 - 80000张图像验证集 - 10000张图像测试集 - 10000张图像 02 - 标签信息 属性1&#xff1a;有无帽子 - [0] 属性2&#xf…

CP Autosar-Ethernet配置

文章目录 前言一、Eth层级结构介绍二、Autosar实践2.1 ETH Driver2.2 Eth InterfaceEth Interface Autosar配置2.3 TcpIp模块Eth TcpIp Autosar配置2.4 SoAdEth SoAd配置前言 因汽车E/E架构和功能的复杂度提升而带来的对车辆数据传输带宽提高和通讯方式改变(基于服务的通讯-S…

London Dock丨伦敦一区的房产明星,拥揽泰晤士河美景,尽享都市奢华生活

生活在伦敦一区&#xff0c;似乎就意味跻身上流阶层 皆是精英环绕&#xff0c;也为下一代创造了极好的社区氛围 所谓“一方水土养一方人”&#xff0c;泰晤士河穿过的伦敦 也孕育着伦敦人的礼貌绅士与严谨认真。 河流&#xff0c;是城市发展的源头。 源远流长的塞纳河&…

Text文件在MATLAB中读写示例基础

背景 为了便于和外部程序进行交换&#xff0c;以及查看文件中的数据&#xff0c;也常常采用文本数据格式与外界交换数据。在文本格式中&#xff0c;数据采用ASCII码格式&#xff0c;可以使用字母和数字字符。可以在文本编辑器中查看和编辑ASCII文本数据。MATLAB提供了导入函数…