Hadoop Shuffle和Spark Shuffle的区别

news/2024/12/23 15:23:11/
一.MR的ShufflemapShuffle数据存到hdfs中是以块进行存储的,每一个块对应一个分片,maptask就是从分片中获取数据的在某个节点上启动了map Task,map Task读取是通过k-v来读取的,读取的数据会放到环形缓存区,这样做的目的是为了防止IO的访问次数,然后环形缓存区的内存达到一定的阀值的时候会把文件益写到磁盘,溢出的各种小文件会合并成一个大文件,这个合并的过程中会进行排序,这个排序叫做归并排序1.1map阶段会涉及到1.1.1.sort排序(默认按字典排序)1.1.2.合并(combiner合并)1.1.3.文件合并(merage 合并 总共有三种,默认是内存到磁盘)1.1.4.压缩(设置压缩就会执行)reduce Shuffle归并排序完成后reduce端会拉取map端的数据,拉取的这个过程叫做copy过程,拉取的数据合并成一个文件,GroupComparator(默认,这个我们也可以自定义)是专门对文件夹里面的key进行分组然后就形成k-List(v1,v2,v3)的形式,然后reduce经过业务处理,最终输出到hdfs,如果设置压缩就会执行,不设置则不执行1.2 reduce阶段会涉及到:1.2.1.sort排序1.2.2.分组(将相同的key的value放到一个容器的过程)1.2.3.merge文件合并1.2.4.压缩
二.spark shuffle的版本一2.1.rdd中一个partition对应一个shufflemapTask任务,因为某个节点上可以有多个分区,所以可以有多个shufflemapTask2.2.每一个shufflemapTask都会为每一个resultTask创建一个bucket缓存(内存),bucket的数量=M x R,当内存达到一定值的时候会益写到shuffleblockfile文件中2.3.shuffleMap task会封装成一个叫mapStatus,这个mapstatus里面包含了每一个resultTask拉取数据的大小2.4 Mapstatus: 是ShuffleMapTask返回调度器scheduler的对象,包括任务运行的块管理器地址和对应每个reducer的输出大小。如果partitions的数量大于2000,则用HighlyCompressedMapStatus,否则用CompressedMapStatus。2.5.每一个resultTask拉取过来的数据,就会在内部形成一个rdd,这个rdd叫做shuffleRdd,这个rdd的数据优先存放到内存中,内存中不够然后存到磁盘里如果是groupByKey算子就结束了,下次执行ReduceByKey的时候,再进行相同key的聚合操作,这个时候会把shuffle rdd进行聚合操作生成mapPartitionRdd,就是我们执行reduceByKey之后得到的那个rdd
spark shuffle的版本二缺点:版本一的shuffle方式中会产生大量的小文件,版本二的优点:就是为了减少这么多小文件的生成,bucket的数量=cpu*resultTask的个数版本二设计的原理:一个shuffleMapTask还是会写入resultTask对应个数的本地文件,但是当下一个shuffleMapTask运行的时候会直接把数据写到之前已经建立好的本地文件,这个文件可以复用,这种复用机制叫做consolidation机制我们把这一组的shuffle文件称为shuffleGroup,每个文件中都存储了很多shuffleMapTask对应的数据,这个文件叫做segment,这个时候因为不同的shuffleMapTask都是存在一个文件中所以建立索引文件,来标记shuffleMapTask在shuffleBlockFile的位置+偏移量,这样就可以在一个文件里面把不同的shuffleMaptask数据分出来
spark shuffle的版本三版本三的优点:是通过排序建立索引,相比较于版本二,它只有一个临时文件,不管有多少个resultTask都只有一个临时文件,缺点:这个排序操作是一个消耗CPU的操作,代价是会消耗很多的cpu版本二占用内存多,打开文件多,但不需排序,速度快。版本三占用内存少,打开文件少,速度相对慢。实践证明使用第二种方案的应用场景更多些。
三、shuffle的读流程1.有一个类blockManager,封装了临时文件的位置信息,resultTask先通过blockManager,就知道我从哪个节点拿数据如果是远程,它就是发起一次socket请求,创建一个socket链接。然后发起一次远程调用,告诉远程的读取程序,读取哪些数据。读到的内容再通过socket传过来。2.一条条读数据和一块块读数据的优缺点?2.1如果是一条条读取的话,实时性好,性能低下2.2一块块读取的话性能高,但是实时性不好Shuffle读由reduce这边发起,它需要先到临时文件中读,一般这个临时文件和reduce不在一台节点上,它需要跨网络去读。但也不排除在一台服务器。不论如何它需要知道临时文件的位置,这个是谁来告诉它的呢?它有一个BlockManager的类。这里就知道将来是从本地文件中读取,还是需要从远程服务器上读取。读进来后再做join或者combine的运算。这些临时文件的位置就记录在Map结构中。可以这样理解分区partition是RDD存储数据的地方,实际是个逻辑单位,真正要取数据时,它就调用BlockManage去读,它是以数据块的方式来读。比如一次读取32k还是64k。它不是一条一条读,一条一条读肯定性能低。它读时首先是看本地还是远程,如果是本地就直接读这个文件了,如果是远程,它就是发起一次socket请求,创建一个socket链接。然后发起一次远程调用,告诉远程的读取程序,读取哪些数据。读到的内容再通过socket传过来。

http://www.ppmy.cn/news/449916.html

相关文章

关于Hadoop的shuffle

我们知道每个reduce task输入的key都是按照key排序的。 但是每个map的输出只是简单的key-value而非key-valuelist,所以洗牌的工作就是将map输出转化为reducer的输入的过程。 在map结束之后shuffle要做的事情: map的输出不是简单的写入本地文件&am…

Shuffle 操作

在spark中的主要操作,触发一个叫作shuffle的事件。shuffle是spark对于重新分布数据的机制,因此数据 能在partitions上进行不同的分组。Shuffle包含在executors和machines上的数据复制,使得 shuffle成为一个复杂的和昂贵的操作。 backgroud 为…

shuffle简介

一、shuffle概述。 hadoop中mapper之后,reducer之前的阶段称之为shuffle,是mapreduce的核心。我们不用知道它的定义,只需要知道它的功能,以及它的优化。 为什么会有shuffle? hadoop中,map负责数据的…

常见算法面试题

【一】 时间受限 大部分的面试题,都是对时间复杂度有所要求的,如果有涉及,“最快”一类的字样,毫无疑问,先上时空原理,用空间来换时间。Hash,大数组,一些辅助性的空间,都…

如何利用Spring Boot 3.X与WebSocket实现电脑系统数据的实时刷新?

通过结合Spring Boot 3.X和WebSocket技术,您可以实现数据的实时传输与展示,从而实现电脑系统数据的实时刷新。本文将介绍必要的步骤和代码示例,帮助您快速上手并应用于您的项目中。通过这种方式,您可以实现即时更新和监控系统数据的需求,提升用户体验和系统的实时性。 首…

修改虚拟机Ubuntu为桥接模式的静态IP

1.首先要打开虚拟机软件(如VMVware),选择要设置的虚拟机,点击“设置”按钮。在“网络”选项卡中, 将“网络连接”设置为“桥接模式”。 2.然后打开cmd通过ipconfg查看当前宿主机的ip信息,根据宿主机的配置信…

几道趣味算法面试题

1.1 绳子计时问题 阿里曾面过这道题目,有若干根相同的不均匀的绳子,烧完一根绳子的时间是1小时,问如何计时1小时15分钟? 答案:能计时出15分钟就好办了,可以用两根绳子并排反向放置,同时从两端点…

Vue 项目 实现阻止浏览器记住密码功能

前言 通常浏览器会主动识别密码表单,在你登录成功之后提示保存密码 , 密码保存到浏览器的 密码管理器中 ( 如下是谷歌浏览器 ) 这种行为是浏览器的行为 ,这种操作也是为了方便用户的使用 现在的一个需求是要阻止这个保存密码的弹窗提示 实现…