Spark的逻辑处理流程(二)

发布于:2024-10-24 编辑:匿名 来源:网络

【往期链接】:Spark的基本流程(一)前言本文参考徐立杰老师的《大数据处理框架Apache Spark设计与实现》,在此记录相关笔记,并添加一些个人理解,如有请指正我错了。参考链接:Spark逻辑处理流程概述 上一章提到了逻辑处理流程(Logical plan),本章将详细讲解。

一般来说,逻辑处理流程可以分为四个部分: 数据源(Data Block):即数据从哪里来,比如 HDFS、k-y 形式的 HBase 等。 数据模型:简单来说可以是理解为抽象数据类型。

例如,在MapReduce中,它是记录。 Spark对此进行了改进,这就是RDD(弹性分布式数据集)。

本质上是一个抽象类。与ArrayList等数据类型相比,RDD有两个主要区别:它只是一个逻辑概念。

简单来说,如果用户不进行cache(),RDD就不会存储在内存中,计算完成后就会消失。 ArrayList等数据结构都是驻留在内存中的。

可以包含多个分区。毕竟Spark处理的是分布式计算,必须支持多个分区。

数据操作:也就是我们可以用RDD做什么。简单来说,分为两个操作,一个是transformation(),另一个是action():transformation():顾名思义,就是对RDD到处改变。

这里注意,RDD本身是不能修改的,也就是说每次变换都完成了。创建一个新的,之前的不会被移动。

(结合上一点,就是说如果不使用cache(),那么在transformation()完成之前RDD就没有了)action():是计算最终的结果。 action() 会触发 Spark 提交作业,从而真正开始执行。

例如,count() 一次和 show() 一次。 (所以使用时需要注意,如果前面的RDD或者Dataframe中没有cache(),后面又重复count()和show(),就会重复计算。

)计算处理结果:通常分布式计算结果分为两种类型。 :无需在Driver端计算:例如直接将结果保存在分布式文件系统(如HDFS)中。

rdd.save("").需要在Driver端计算:比如count()需要使用一个task来统计每个RDD中分区元素的数量,然后聚合到Driver中,最后相加进行计算。 2.2 Spark逻辑处理过程生成方法 对于Spark来说,需要一种通用的方法,能够自动将应用转化为确定性的逻辑处理过程,即RDD之间的数据依赖关系。

因此,需要解决三个问题:如何生成R5DD,以及生成什么样的RDD?如何建立RDD之间的数据依赖关系?如何计算RDD中的数据? 2.2.1 如何生成RDD,生成什么样的RDD?一般来说,执行Transformer操作时会产生RDD。这里有两种类似的情况:一个 Transformer 只创建一个 RDD。

比如一些简单的操作比如map(func)。一个 Transformer 创建多个 RDD。

例如,更复杂的操作如join()和distinct(),中间会生成多个RDD,但最终只会返回一个用户。下面展示了一些常用的 Transformation() 生成的 RDD: TransformationGenerated RDDsCompute()map(func)MappedRDDiterator(split).map(f)filter(func)FilteredRDDiterator(split).filter(f)flatMap(func)FlatMappedRDiterator( split).flatMap(f)mapPartitions(func)MapPartitionsRDDf(iterator(split))mapPartitionsWithIndex(func)MapPartitionsRDDf(split.index, iterator(split))sample(withReplacement,fraction,seed)PartitionwiseSampledRDDPoissonSampler.sample(iterator(split)) BernoulliSampler.sample(iterator(split))pipe(command, [envVars])PipedRDDunion(otherDataset) 生成多个 RDDintersection(otherDataset) 生成多个 RDDdistinct([numTasks])) 生成多个 RDDgroupByKey([numTasks]) 生成多个 RDDreduceByKey(func, [numTasks]) 生成多个 RDDsortByKey([ascending], [numTasks]) 生成多个 RDDjoin(otherDataset, [numTasks]) 生成多个 RDDcogroup(otherDataset, [numTasks]) 生成多个 RDDcartesian(otherDataset) 生成多个 RDDcoalesce(numPartitions) 生成多个RDDrepartition(numPartitions) 生成多个RDD2.2.2 RDD之间如何建立数据依赖关系?如上所述,transformation()之后会生成一堆RDD。

下一个问题是这些 RDD 之间的数据依赖关系是什么。一般来说可以分为两类:窄依赖(NarrowDependency)和宽依赖(ShuffleDependency)。

区分这两类依赖关系的依据是:生成的子RDD的每个分区是否完全依赖于父RDD的每个分区的全部或部分。如果依赖于每个分区的整个分区,则为窄依赖;如果仅依赖于每个分区的一部分,则为宽依赖。

划分NarrowDependency和ShuffleDependency的原因是为了生成物理执行图。 1)窄依赖(NarrowDependency)一对一依赖(OneToOneDependency)(1:1)一对一映射关系,如map()、filter()。

RangeDependency(1:1)可以理解为区域一对一,比如union(),如上图所示。多对一依赖(非官方定义,属于 NarrowDependency)(N:1)表示子 RDD 中的某个分区依赖于多个父 RDD 中的分区,例如 join()、cogroup()。

下图是 join() 的一个例子,它将两个 RDD 聚合在一起。首先执行 cogroup() 获得类型为 的 MappedValuesRDD,然后将 Iterable[V1] 和 Iterable[V2] 制作为笛卡尔集合,并对其进行 flat() 操作。

多对多依赖(非官方定义,属于NarrowDependency)(N:N)是指子RDD中的一个分区依赖于多个父RDD中的分区,一个父RDD又依赖于多个子RDD。常见的是 cartesian()2) 宽依赖(ShuffleDependency)。

宽依赖也可以理解为“部分依赖”。宽依赖和MapReduce中shuffle的数据依赖是一样的(mapper对其输出进行分区,然后每个reducer对所有mapper进行分区,输出中自己的分区通过HTTP fetch获取)。

从上图可以看出,广泛依赖的子RDD的分区只会依赖于父RDD的一部分。为什么要区分窄依赖和宽依赖?主要原因是在执行过程中,窄依赖关系可以在同一阶段进行流水线化,而无需进行shuffle。

顾名思义,宽依赖需要 shuffle。另外,这样区分的话,也很容易实现。

2.2.3 如何计算RDD中的数据。上面我们讲了RDD之间的依赖关系。

现在我们来谈谈如何计算每个RDD的每个分区中的数据(记录)。 Spark的大部分transformation()函数与映射函数类似,都有固定的计算方法,称为“控制流”。

下图给出了两个例子。虽然两者在数据依赖上都具有一对一的依赖关系(OneToOneDependency),但是两者的func的“控制流程”是不同的:map(fuc):读取一条记录,处理一条记录。

记录,然后吐出处理后的mapPartitions(fuc):它处理分区中的所有记录,然后集中输出。

Spark的逻辑处理流程(二)

站长声明

版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。

标签:

相关文章

  • 老铺黄金等人“折A转港”

    老铺黄金等人“折A转港”

    老铺黄金A股崩盘后,选择转投港股。 11月10日,老铺黄金在香港联交所披露招股说明书。 梦金源今年9月向港股市场发起进攻,之前也曾遭遇过“A”的失败。 11月17日,深交所公告称,星期六福已于11月8日主动撤回上市申请。 黄金珠宝终端消费热情带动黄金珠宝企业业绩稳步上升,不

    06-18

  • 全球首次碳化硅MEMS微推力阵列在轨点火试验成功

    全球首次碳化硅MEMS微推力阵列在轨点火试验成功

    南京理工大学化工学院消息:近日,碳化硅MEMS(微机电系统)微推力阵列芯片在轨点火试验成功与金牛座纳米星运行37天后,从地面收到点火命令成功点火,金牛座纳米星的姿态控制技术在轨道上得到验证。 金牛座纳米卫星由八院所属上海依依斯航天技术有限公司研制。 9月12日11时26

    06-06

  • 【全球财经24小时】2023年9月21日投融资事件汇总及详情

    【全球财经24小时】2023年9月21日投融资事件汇总及详情

    今日全球市场共发生16起投资披露事件,其中境内13起,境外13起。 其中,国内先进制造业4例,医疗健康行业4例,汽车交通运输行业1例,电商零售行业1例,企业服务行业1例,传统制造业2例。 涉外医疗健康行业2例,金融行业1例。 国内事件 1、灵科药业完成C2轮融资,整体C轮融资金

    06-18

  • 相信你的耳朵,盲目测试全球最薄vivo X5Max的Hi-Fi 2.0

    相信你的耳朵,盲目测试全球最薄vivo X5Max的Hi-Fi 2.0

    vivo在年底前发布了年度旗舰——全球最薄vivo,它保持着全球最薄手机的记录。 此外,vivo X5Max还搭载全新手机Hi-Fi 2.0架构,使该手机成为全球音质最好的手机,媲美专业Hi-Fi玩家。 那么,什么是Hi-Fi 2.0?根据vivo提供的信息,Hi-Fi 2.0采用了二次供电+二次放大+专业音频解

    06-17

  • 共享纸巾平台“纸鼠”完成数百万元天使轮融资,白马金服投资

    共享纸巾平台“纸鼠”完成数百万元天使轮融资,白马金服投资

    据投资界2月6日消息,共享纸巾平台“纸鼠”近日宣布,已完成数百万元天使轮融资,投资方为白马金服。    据悉,本轮融资资金将用于共享卫生纸机的升级、研发和市场拓展。   Paper Mouse成立于今年10月,是一个组织共享平台。 公开信息显示,纸鼠目前已预订多台卫生纸机,

    06-18

  • 尊湃通信完成数亿元Pre-A轮融资,致力于提供全系列Wi-Fi芯片及解决方案

    尊湃通信完成数亿元Pre-A轮融资,致力于提供全系列Wi-Fi芯片及解决方案

    投资界(ID:pedaily)5月9日消息,尊湃通信科技(南京)尊湃传播股份有限公司(二)近日宣布完成数亿元Pre-A轮融资。 本轮由小米集团、虎山资本、天极资本、嘉域资本、上海科创海王资本、品智信息等知名金融投资机构投资。 以及产业投资者的构成。 此前,尊湃通讯于5月21日完

    06-18

  • 宜家最酷的未来产品都来自这个神秘的实验室

    宜家最酷的未来产品都来自这个神秘的实验室

    在哥本哈根肉类加工区的中心地带,有无数的画廊、艺术咖啡馆和创意工作室。 其中有一栋由鱼市场改建而成的平米建筑。 利用技术和好奇心来绘制宜家的未来蓝图。 这就是宜家资助的 SPACE10 冒险之旅的起点。 作为宜家的未来生活实验室和产品创意孵化器,SPACE10总是开发一些超级

    06-21

  • 李彦宏内部信宣布李震宇晋升为百度集团高层副总裁

    李彦宏内部信宣布李震宇晋升为百度集团高层副总裁

    百度创始人与CEO李彦宏通过内部信宣布,百度集团副总裁和智能驾驶集团总经理李震宇晋升为集团高层副总裁,并将继续担任全面负责IDG的业务和管理工作,并向集团CEO汇报。

    06-17

  • 艾罗能源正计划在A股IPO,主要产品包括光伏储能系统等

    艾罗能源正计划在A股IPO,主要产品包括光伏储能系统等

    艾罗能源正在筹划A股IPO。 公司长期专注于家用光伏逆变器、家用储能设备等新能源供电设备的研发。 、生产、销售。

    06-18

  • 香港理工大学研发出适用于可穿戴电子装置的高透气超弹导电材料

    香港理工大学研发出适用于可穿戴电子装置的高透气超弹导电材料

    2020年3月24日,香港理工大学(理大)研发出适用于长时间佩戴电子装置的高透气超弹导电材料一段时间。 。 这种创新的导电材料采用涂层或印刷的方法,将液态金属材料添加到静电纺丝制成的弹性纤维网上。 它不仅具有高透气性、弹性、导电性且具有高导电稳定性,可广泛应用于健

    06-06

  • 冯仑:有了这样的制度环境,创新只是“副产品”

    冯仑:有了这样的制度环境,创新只是“副产品”

    近日,万通集团创始人冯仑在WISE超级进化者大会上谈到创新时表示,个人驱动力是一方面,外部的制度环境也很重要。 冯仑表示,必须有一个允许民营企业存在的制度环境,企业才愿意创新。 比如,土地1-2年不开发就被拿走,比如加大健康住房的投入,但登记价格和不创新一样,企业

    06-18

  • 杨迪、麻子、谢广坤都做出了“爆炸性的改变”,这背后是谁?

    杨迪、麻子、谢广坤都做出了“爆炸性的改变”,这背后是谁?

    亚洲换头术的魔力在短视频继续放大。 前一分钟杨迪还自嘲小眼睛,后一分钟成功变身男团酷偶像。 苹果手机的面部识别功能在真正的“苦力”面前不得不被打败。 《狂飙》中的麻子哥变身为五官精致的清秀美男。 无奖猜测。 原本只是想看热闹的网友们大概没有想到,看完一个视频后

    06-18