Hadoop权威指南-读书笔记-02-关于MapReduce

Hadoop权威指南-读书笔记

记录一下读这本书的时候觉得有意思或者重要的点~

在这里插入图片描述
还是老样子~挑重点记录哈😁有兴趣的小伙伴可以去看看原著😊

第二章 关于MapReduce

  • MapReduce是一种可用于数据处理的编程模型。

在这里插入图片描述

  • MapReduce程序本质上是并行运行的,因此可以将大规模的数据分析任务分发给任何一个拥有足够多机器的数据中心。

在这里插入图片描述

  • MapReduce的优势在于处理大规模数据集。

Tips:第二章序言里比较重要的点都在上面啦~🤣


2.1 使用Hadoop来分析气象数据集

气象数据集这一小节举了挖掘气象数据的例子,博主把这个例子的核心摘录了出来。

  • 为了充分利用Hadoop提供的并行处理优势,我们需要将查询表示成MapReduce作业。完成某种本地端的小规模测试之后,就可以把作业部署到在集群上运行。

map和reduce

MapReduce任务过程分为两个处理阶段:map阶段和reduce阶段。

每阶段都以键值对作为输入和输出,其类型由程序员来选择。程序员还需要写两个函数:map函数和reduce 函数。

在这里插入图片描述

map阶段的输入是NCDC原始数据。我们选择文本格式作为输入格式,将数据集的每一行作为文本输入。

键是某一行起始位置相对于文件起始位置的偏移量,不过我们不需要这个信息,所以将其忽略。

我们的map函数很简单。由于我们只对年份和气温属性感兴趣,所以只需要取出这两个字段数据。

在本例中,map函数只是一个数据准备阶段,通过这种方式来准备数据,使reduce函数能够继续对它进行处理:即找出每年的最高气温。

map函数还是一个比较适合去除已损记录的地方:此处,我们筛掉缺失的、可疑的或错误的气温数据。

map函数的功能仅限于提取年份和气温信息(以粗体显示),并将它们作为输出(气温值已用整数表示):

在这里插入图片描述

map函数的输出经由MapReduce框架处理后,最后发送到reduce函数。

这个处理过程基于键来对键-值对进行排序和分组。因此,在这一示例中,reduce函数看到的是如下输入:

在这里插入图片描述

在这里插入图片描述


下面是这个例子所体现出的比较重要的MR处理的流程图:
在这里插入图片描述


2.2 Java MapReduce

Java实现MR程序需要三样东西:一个map函数、一个reduce函数和一些用来运行作业的代码。

  • map函数由Mapper类来表示,后者声明了一个抽象的map()方法。

在这里插入图片描述

  • 这个Mapper类是一个泛型类型,它有四个形参类型,分别指定map数的输入键、输入值、输出键和输出值的类型。
  • 就现在这个例子来说,输入键是一个长整数偏移量,输入值是一行文本,输出键是年份,输出值是气温(整数)。
  • Hadoop本身提供了一套可优化网络序列化传输的基本类型,而不直接使用Java内嵌的类型。

Tips:我的这篇文章讲了为啥不用Java内嵌的序列化—Hadoop序列化详解

  • 这些类型都在 org.apache.hadoop.io包中。这里使用 LongWritable 类型(相当于Java的Long类型)、Text类型(相当于Java中的String 类型)和IntWritable类型(相当于Java的Integer类型)。
  • map()方法的输入是一个键和一个值。我们首先将包含有一行输入的Text值转换成Java的String类型,之后用substring()方法提取我们感兴趣的列。

在这里插入图片描述

  • map()方法还提供Context实例用于输出内容的写入。在这种情况下,我们将年份数据按Text对象进行读/写(因为我们把年份当作键),将气温值封装在Intwritable 类型中。
  • 只有气温数据不缺并且所对应质量代码显示为正确的气温读数时,这些数据才会被写入输出记录中。

在这里插入图片描述

  • 同样,reduce函数也有四个形式参数类型用于指定输入和输出类型。
  • reduce函数的输入类型必须匹配map 函数的输出类型:即Text类型和Intwritable 类型。
  • 在这种情况下,reduce函数的输出类型也必须是Text和IntWritable类型,分别输出年份及其最高气温。
    在这里插入图片描述

这个最高气温是通过循环比较每个气温与当前所知最高气温所得到的。


第三部分代码负责运行MR作业。

在这里插入图片描述

  • Job对象指定作业执行规范。
  • 我们可以用它来控制整个作业的运行。

在这里插入图片描述

  • 我们在Hadoop 集群上运行这个作业时,要把代码打包成一个JAR文件(Hadoop 在集群上发布这个文件)。

在这里插入图片描述

  • 不必明确指定JAR文件的名称,在Job对象的setJarByClass()方法中传递一个类即可,Hadoop利用这个类来查找包含它的JAR文件,进而找到相关的· JAR 文件。

  • 构造 Job对象之后,需要指定输入和输出数据的路径。

  • 调用FileInputFormat类的静态方法 addInputPath()来定义输入数据的路径,这个路径可以是单个的文件、一个目录(此时,将目录下所有文件当作输入)或符合特定文件模式的一系列文件。
    在这里插入图片描述

  • 由函数名可知,可以多次调用 addInputPath()来实现多路径的输入。


  • 调用 File0utputFormat 类中的静态方法 setOutputPath()来指定输出路径(只能有一个输出路径)。

  • 这个方法指定的是reduce函数输出文件的写入目录。
    在这里插入图片描述

  • 在运行作业前该目录是不应该存在的,否则Hadoop会报错并拒绝运行作业。这种预防措施的目的是防止数据丢失(长时间运行的作业如果结果被意外覆盖,肯定是非常恼人的)。


  • 接着,通过 setMapperClass()和setReducerclass()方法指定要用的 map 类型和reduce 类型。
    在这里插入图片描述

  • setOutputKeyClass()和setOutputValueClass()方法控制reduce 函数的输出类型,并且必须和Reduce类产生的相匹配。

在这里插入图片描述

  • map数的输出类型默认情况下和reduce 函数是相同的,因此如果mapper产生出和reducer相同的类型时(如同本例所示),不需要单独设置。
  • 但是,如果不同,则必须通过setMap0utputKeyClass()和setMapOutputValueClass()方法来设置 map 函数的输出类型。

  • waitForCompletion()方法提交作业并等待执行完成。该方法唯一的参数是一个标识,指示是否已生成详细输出。

在这里插入图片描述

  • 当标识为true(成功)时,作业会把其进度信息写到控制台。
  • waitForcompletion()方法返回一个布尔值,表示执行的成(true)败(false),这个布尔值被转换成程序的退出代码0或者1。

运行测试

写好MapReduce作业之后,通常要拿一个小型数据集进行测试以排除代码问题。

在这里插入图片描述

  • 5个map输入记录产生5个map输出记录(由于mapper为每个合法的输入记录产生一个输出记录),随后,分为两组的5个reduce输入记录(一组对应一个唯一的键)产生两个reduce 输出记录。
  • 输出数据写人output目录,其中每个reducer都有一个输出文件。
  • 我们例子中的作业只有一个 reducer,所以只能找到一个名为part-r-00000的文件:

在这里插入图片描述


2.3 横向扩展

  • MapReduce作业(job)是客户端需要执行的一个工作单元:它包括输入数据、MapReduce程序和配置信息。
  • Hadoop将作业分成若干个任务(task)来执行,其中包括两类任务:map任务和reduce任务。
  • 这些任务运行在集群的节点上,并通过YARN进行调度。
  • 如果一个任务失败,它将在另一个不同的节点上自动重新调度运行。

❤❤❤❤❤ 分片重点:

  • Hadoop将 MapReduce 的输入数据划分成等长的小数据块,称为输入分片(input split)或简称“分片”。

在这里插入图片描述

  • Hadoop为每个分片构建一个map任务,并由该任务来运行用户自定义的map 函数从而处理分片中的每条记录。

  • 拥有许多分片,意味着处理每个分片所需要的时间少于处理整个输入数据所花的时间。

  • 因此,如果我们并行处理每个分片,且每个分片数据比较小,那么整个处理过程将获得更好的负载平衡,因为一台较快的计算机能够处理的数据分片比一台较慢的计算机更多,且成一定的比例。即使使用相同的机器,失败的进程或其他并发运行的作业能够实现满意的负载平衡,并且随着分片被切分得更细,负载平衡的质量会更高。

  • 另一方面,如果分片切分得太小,那么管理分片的总时间和构建map任务的总时间将决定作业的整个执行时间。

  • 对于大多数作业来说,一个合理的分片大小趋向于HDFS的一个块的大小,默认是128MB,不过可以针对集群调整这个默认值(对所有新建的文件),或在每个文件创建时指定。


❤❤❤❤❤ 数据本地化重点:

在这里插入图片描述

  • Hadoop在存储有输入数据(HDFS中的数据)的节点上运行map任务,可以获得最佳性能,因为它无需使用宝贵的集群带宽资源。这就是所谓的“数据本地化优化”(data locality optimization)

在这里插入图片描述

  • 但是,有时对于一个 map 任务的输入分片来说存储该分片的HDFS数据块复本的所有节点可能正在运行其他map任务,此时作业调度需要从某一数据块所在的机架中的一个节点上寻找一个空闲的 map 槽(slot)来运行该map任务分片。

在这里插入图片描述

  • 仅仅在非常偶然的情况下(该情况基本上不会发生),会使用其他机架中的节点运行该map任务,这将导致机架与机架之间的网络传输。图2-2显示了这三种可能性。

  • 现在我们应该清楚为什么最佳分片的大小应该与块大小相同:因为它是确保可以存储在单个节点上的最大输入块的大小。
  • 如果分片跨越两个数据块,那么对于任何一个HDFS节点,基本上都不可能同时存储这两个数据块,因此分片中的部分数据需要通过网络传输到map任务运行的节点。与使用本地数据运行整个map任务相比,这种方法显然效率更低。

  • map任务将其输出写入本地硬盘,而非HDFS。这是为什么?
  • 因为map的输出是中间结果:该中间结果由reduce任务处理后才产生最终输出结果,而且一旦作业完成,map的输出结果就可以删除。
  • 因此,如果把它存储在HDFS中并实现备份,难免有些小题大做。
  • 如果运行map任务的节点在将map中间结果传送给reduce 任务之前失败,Hadoop将在另一个节点上重新运行这个map任务以再次构建 map 中间结果。

reduce任务并不具备数据本地化的优势,单个reduce任务的输入通常来自于所有mapper的输出。

在本例中,我们仅有一个reduce任务,其输入是所有map任务的输出。

因此,排过序的 map 输出需通过网络传输发送到运行reduce任务的节点。

数据在reduce端合并,然后由用户定义的reduce 函数处理。reduce 的输出通常存储在 HDFS中以实现可靠存储。

在这里插入图片描述

如第3章所述,对于reduce输出的每个HDFS块,第一个复本存储在本地节点上,其他复本出于可靠性考虑存储在其他机架的节点中。

因此,将reduce的输出写入 HDFS 确实需要占用网络带宽,但这与正常的 HDFS 管线写入的消耗一样。


❤❤❤❤❤ 数据分区重点:

  • reduce 任务的数量并非由输入数据的大小决定,相反是独立指定的。

  • 如果有好多个reduce任务,每个map任务就会针对输出进行分区(partition),即为每个reduce任务建一个分区。

在这里插入图片描述

  • 每个分区有许多键(及其对应的值),但每个键对应的键-值对记录都在同一分区中。
  • 分区可由用户定义的分区函数控制,但通常用默认的 partitioner 通过哈希函数来分区,很高效。

在这里插入图片描述
一般情况下,多个reduce任务的数据流如图2-4所示。

  • 该图清楚地表明了为什么map任务和reduce任务之间的数据流称为shuffle(混洗),因为每个reduce 任务的输入都来自许多map任务。
  • shuffle一般比图中所示的更复杂,而且调整混洗参数对作业总执行时间的影响非常大,详情参见7.3节。

  • 最后,当数据处理可以完全并行(即无需混洗时),可能会出现无reduce任务的情况(示例参见8.2.2节)。

在这里插入图片描述

  • 在这种情况下,唯一的非本地节点数据传输是map任务将结果写人HDFS(参见图2-5)。

❤❤❤❤❤ combiner函数重点:

集群上的可用带宽限制了MapReduce作业的数量,因此尽量避免map和reduce任务之间的数据传输是有利的。

Hadoop允许用户针对map任务的输出指定一个combiner(就像 mapper和reducer 一样),combiner 函数的输出作为reduce 函数的输入。

由于combiner属于优化方案,所以Hadoop无法确定要对一个指定的map任务输出记录调用多少combiner(如果需要)。

换而言之,不管调用combiner 多少次,0次、1次或多次,reducer的输出结果都是一样的。


书里给了一个非常棒的示例,讲解了combiner函数是如何做到—尽量避免map和reduce任务之间的数据传输~

eg:
第一个map的输出:
在这里插入图片描述

第二个map的输出:

在这里插入图片描述

reduce被调用时,输入如下:
在这里插入图片描述
因为25为该列数据中最大的,所以它的输出如下:

在这里插入图片描述


但其实我们可以像使用reduce函数那样,使用combiner找出每个map任务输出结果中的最高气温。

如此一来,reduce函数调用时将被传入以下数据:

在这里插入图片描述
传输的数据量就会少很多~😂

reduce输出的结果和以前一样。

在这里插入图片描述


但并非所有场合都适用类似这种优化。

例如,如果我们计算平均气温,就不能用求平均函数mean作为我们的combiner函数,因为

在这里插入图片描述

这里的场景—combiner函数不能取代reduce函数。为什么呢?
我们仍然需要reduce 函数来处理不同map输出中具有相同键的记录。

但combiner函数能帮助减少mapper和reducer 之间的数据传输量,因此,单纯就这点而言,在MapReduce 作业中是否使用cobiner函数还是值得斟酌的。


仅供学习使用~

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

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

相关文章

算法体系-26 第二十六节:第26节:单调栈结构 (5节)

一 单调栈知识讲解 1.1描述 一个数组里面想的到每个位置与他最近的左边和右边比他小的最近的信息 1.2 分析 通过单调栈的特点,for遍历数组中的每个数,当前数来的时候对比单调栈中的数进行每个数的左右判断完满足条件的进行更新到当前i种的 int[][] re…

【鸿蒙学习笔记】Stage模型工程目录

官方文档:应用配置文件概述(Stage模型) 目录标题 FA模型和Stage模型工程级目录模块级目录app.json5module.json5程序执行流程程序基本结构开发调试与发布流程 FA模型和Stage模型 工程级目录 模块级目录 app.json5 官方文档:app.j…

【51单片机入门】数码管原理

文章目录 前言共阴极与共阳极数码管多个数码管显示原理 总结 前言 在我们的日常生活中,数码管被广泛应用于各种电子设备中,如电子表、计时器、电子钟等。数码管的主要功能是显示数字和一些特殊字符。在这篇文章中,我们将探讨数码管的工作原理…

【机器学习】机器学习与自然语言处理的融合应用与性能优化新探索

引言 自然语言处理(NLP)是计算机科学中的一个重要领域,旨在通过计算机对人类语言进行理解、生成和分析。随着深度学习和大数据技术的发展,机器学习在自然语言处理中的应用越来越广泛,从文本分类、情感分析到机器翻译和…

项目部署_持续集成_Jenkins

1 今日内容介绍 1.1 什么是持续集成 持续集成( Continuous integration , 简称 CI )指的是,频繁地(一天多次)将代码集成到主干 持续集成的组成要素 一个自动构建过程, 从检出代码、 编译构建…

【Python】基于KMeans的航空公司客户数据聚类分析

💐大家好!我是码银~,欢迎关注💐: CSDN:码银 公众号:码银学编程 实验目的和要求 会用Python创建Kmeans聚类分析模型使用KMeans模型对航空公司客户价值进行聚类分析会对聚类结果进行分析评价 实…

linux-5.10.110内核源码分析 - Freescale ls1012a pcie host驱动

1、dts pcie设备树 1.1、pcie设备树 pcie1: pcie3400000 {compatible "fsl,ls1012a-pcie";reg <0x00 0x03400000 0x0 0x00100000 /* controller registers */0x40 0x00000000 0x0 0x00002000>; /* configuration space */reg-names "regs", &…

尚硅谷k8s 2

p54-56 k8s核心实战 service服务发现 Service:将一组 Pods 公开为网络服务的抽象方法。 #暴露Deploy,暴露deploy会出现在svc kubectl expose deployment my-dep --port8000 --target-port80#使用标签检索Pod kubectl get pod -l appmy-depapiVersion: v1 kind: Service metad…

Python酷库之旅-第三方库Pandas(006)

目录 一、用法精讲 10、pandas.DataFrame.to_excel函数 10-1、语法 10-2、参数 10-3、功能 10-4、返回值 10-5、说明 10-6、用法 10-6-1、数据准备 10-6-2、代码示例 10-6-3、结果输出 11、pandas.ExcelFile类 11-1、语法 11-2、参数 11-3、功能 11-4、返回值 …

您的私人办公室!-----ONLYOFFICE8.1版本的桌面编辑器测评

随时随地创建并编辑文档&#xff0c;还可就其进行协作 ONLYOFFICE 文档是一款强大的在线编辑器&#xff0c;为您使用的平台提供文本文档、电子表格、演示文稿、表单和 PDF 编辑工具。 网页地址链接&#xff1a; https://www.onlyoffice.com/zh/office-suite.aspxhttps://www…

Zynq系列FPGA实现SDI视频编解码,基于GTX高速接口,提供5套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本方案在Xilinx--Kintex系列FPGA上的应用 3、详细设计方案设计原理框图SDI 输入设备Gv8601a 均衡器GTX 解串与串化SMPTE SD/HD/3G SDI IP核BT1120转RGB图像缓存视频读取控制HDMI输出RGB转BT1120Gv8500 驱…

Docker 运行Nacos无法访问地址解决方法

参考我的上一篇文章去配置好镜像加速器&#xff0c;镜像加速器不是配置越多越好&#xff0c;重试次数多了会失败 Dockerhub无法拉取镜像配置阿里镜像加速器-CSDN博客 错误的尝试 最开始按照网上的方式去配了一大堆&#xff0c;发现下不下来。 镜像源地址&#xff1a;https:…

Kafka-服务端-副本同步-源码流程

杂 在0.9.0.0之前&#xff0c;Kafka提供了replica lag.max.messages 来控制follower副本最多落后leader副本的消息数量&#xff0c;follower 相对于leader 落后当超过这个数量的时候就判定该follower是失效的&#xff0c;就会踢出ISR&#xff0c;这里的指的是具体的LEO值。 对…

工程文件参考——CubeMX+LL库+SPI主机 阻塞式通用库

文章目录 前言CubeMX配置SPI驱动实现spi_driver.hspi_driver.c 额外的接口补充 前言 SPI&#xff0c;想了很久没想明白其DMA或者IT比较好用的方法&#xff0c;可能之后也会写一个 我个人使用场景大数据流不多&#xff0c;如果是大批量数据交互自然是DMA更好用&#xff0c;但考…

如何摆脱反爬虫机制?

在网站设计时&#xff0c;为了保证服务器的稳定运行&#xff0c;防止非法数据访问&#xff0c;通常会引入反爬虫机制。一般来说&#xff0c;网站的反爬虫机制包括以下几种&#xff1a; 1. CAPTCHA&#xff1a;网站可能会向用户显示CAPTCHA&#xff0c;要求他们在访问网站或执行…

华为实训案例

案例下载 案例内包含空拓扑图、配置完整的拓扑、以及步骤脚本文档&#xff0c;可按需下载。 拓扑图 任务清单 &#xff08;一&#xff09;基础配置 根据附录1拓扑图、附录2地址规划表、附录3设备编号表&#xff0c;配置设备接口及主机名信息。 将所有终端超时时间设置为永不…

【nvm】如何使用nvm优雅的管理Node.js

希望文章能给到你启发和灵感&#xff5e; 如果觉得文章对你有帮助的话&#xff0c;点赞 关注 收藏 支持一下博主吧&#xff5e; 阅读指南 开篇说明一、基础环境说明1.1 硬件环境1.2 软件环境 二、什么是nvm?2.1 概念2.1 安装2.1.1 对于Mac系统2.1.2 对于Windows系统2.1.3 对于…

逻辑这回事(八)---- 时钟与复位

时钟设计总结 时钟和复位是FPGA设计的基础&#xff0c;本章总结了一些逻辑时钟复位设计、使用中出现的问题&#xff0c;给出了设计要点&#xff0c;避免后续问题重犯。时钟和复位&#xff0c;本文都先从板级谈起&#xff0c;再到FPGA芯片级&#xff0c;最后到模块级别。仅在此…

基于单片机的粉尘检测报警防护系统研究

摘要 &#xff1a; 粉尘检测是环境保护的重要环节&#xff0c;传统的粉尘检测防护系统的预防方式较为单一。本文设计了一种基于单片机的粉尘检测报警防护系统&#xff0c;能有效地检测粉尘浓度&#xff0c;进行多种方式的报警防护&#xff0c;以保证工作人员的生命健康和安全。…

软件设计之Java入门视频(11)

软件设计之Java入门视频(11) 视频教程来自B站尚硅谷&#xff1a; 尚硅谷Java入门视频教程&#xff0c;宋红康java基础视频 相关文件资料&#xff08;百度网盘&#xff09; 提取密码&#xff1a;8op3 idea 下载可以关注 软件管家 公众号 学习内容&#xff1a; 该视频共分为1-7…