Spark:The Definitive Guide--读书小结(四)

Spark编程基础详细总结 第二种方式生成的RDD中保存的是T的值,Seq[String]部分的数据会按照 Seqf(T,Seq[String])的顺序存放到各个分区中,一个 Seq[Stringl对应存放至一个分区,并为数据提供位置信息,通过preferredLocations0方法可以根据位置信息查看每一个分区的值。(2)第2个参数是 ascending,决定排序后 RDD 中的元素是升序的还是降序的,默认是 true,即升序排序,如果需要降序排序则需要将参数的值设置为 false。mapO方法是懒操作,不会立即进行计算。 阅读详情

前言

大概花了一个月(2020-09~2020-10)左右的时间,看完了整本书。笔者毕业后,主要从事机器学习、数据挖掘方向的相关工作。由于Spark作为目前主流的分布式计算引擎,个人也一直在用Spark进行相关的数据分析与建模工作。通读全书,感觉比较适合入门级学习,主要介绍了Spark 2.0相关API及Spark生态。涵盖Spark SQL、Struct Streaming、GraphX、MLlib等内容。对初学者而言是一本不错的书籍。

数据、源码链接: https://github.com/databricks/Spark-The-Definitive-Guide

第Ⅰ部分 大数据与Spark概述

链接: https://blog.youkuaiyun.com/Java_Man_China/article/details/109321946

第Ⅱ部分 结构化API–DataFrame、SQL和Dataset

链接: https://blog.youkuaiyun.com/Java_Man_China/article/details/109321946

第Ⅲ部分 低级API

链接: https://blog.youkuaiyun.com/Java_Man_China/article/details/109378254

第Ⅳ部分 生产与应用

Spark UI
无论是为了调试还是更好的理解应用程序在集群上的执行过程,通过Spark UI和Spark日志是最方便获取监控报告的方式,这些报告包括Spark应用程序的运行状态,如RDD的转化和查询计划的执行信息等。
在这里插入图片描述
Jobs:对应Spark作业
Stages:对应各个阶段(及相关任务)
Storage:包含当前在Spark应用程序中缓存的信息和数据
Environment: Spark应用程序的配置信息
SQL: 对应提交的结构化API查询(SQL及DataFrame)
Executors: 应用程序中各执行器的详细信息

Summary Metrics:
查看某个Job的某个stage中所有task的执行情况,显示了各种指标的统计概要,注意警惕不均匀的数据分布。在本例中,各项指标分布均匀。
在这里插入图片描述
Spark常见问题:

  1. Spark作业未启动:
    集群配置问题或应用程序资源需要过大导致,常见的问题是每个执行器进程分配了太大的内存,超过了集群管理器的内存资源配额。

    解决方案:
    合理申请Spark资源

  2. 任务缓慢
    此问题在优化程序时非常常见,这可能是由于工作负载没有被均匀分布在集群各节点上(数据倾斜),或者由于某台计算节点比其它节点速度慢(硬件问题)。

    解决方案:
    1.尝试增加分区数,减少每个分区被分配到的数据量。
    2.分配给执行器进程更多的内存。
    3.尝试通过另一列组合来重新分区或自定义分区。
    4.打开推测功能,可以解决单节点硬件带来的速度缓慢问题。
    5.检查UDF函数是否在其对象分配或业务逻辑中有资源浪费。
    6.Dataset在执行大量的对象实例化并将记录转化为用户定义函数中的Java对象,可能会导致大量垃圾回收。请查看Spark UI中垃圾回收指标。

    任务缓慢和落后者可能是调试中遇到的最困难的问题之一,因为有太多的可能性导致任务缓慢,然而大多数情况下是某种数据倾斜导致的。

  3. 缓慢的聚合操作
    在执行groupby操作时产生缓慢任务或聚合操作之后的作业也执行的非常缓慢。

    解决方案:
    1.在聚合操作前增加分区数量可能有助于减少每个任务中处理不同key的数量。
    2.增加执行器的内存配额也可以缓解此问题。如果一个key数据量过大,增加内存可以减少与磁盘交互数据并更快的完成任务,尽管他可能依旧比其它进程要慢得多。
    3.如果你发现聚合操作之后的任务也很慢,这意味着你的数据集在聚合后依旧可能不均衡,尝试repartition并对数据进行随机重分区。
    4.优化代码逻辑,尽可能使所有filter操作和select操作在聚合之前发生。
    5.确保空值被正确的表示(建议使用Spark的null关键字),不要用”"或“empty”等表示,因为Spark优化器通常会在作业初期来跳过对null值得处理,但它无法为你自定义的空值进行此优化。
    这个问题并不能总是能够得到解决,如果你的作业中需要对存在数据倾斜的某个Key执行聚合操作,那么执行聚合操作时就是很慢。

  4. 缓慢的连接操作

    解决方案:
    1.实验不同的连接操作顺序,前提是一些连接操作会过滤大量数据。
    2.执行连接操作前,对数据集进行分区,这对于减少数据集在集群之前的移动是非常有用的,特别是多个连接操作中使用相同的数据集时。请注意,分区是以数据shuffle为代价的。
    3.数据倾斜导致的连接变慢
    4.可以强制采用广播小表的方式

  5. driver端OOM
    通常是由于驱动器进程收集了过多的数据集,从而导致内存不足。
    解决方案:
    1.查看collet之类操作的数据集是否过大
    2.可能使用了广播数据,但是广播的数据集太大
    3.应用程序长时间运行导致生成了大量对象,并且无法释放它们。
    4.增加driver端内存

  6. excutor OOM
    应用程序有时可以自动从这类错误中恢复,但不一定,主要还是取决于导致这种错误的根本原因。

    解决方案:
    1.增加excutor 内存
    2.在使用RDD或Dataset时,由于对象实例化可能导致产生执行器的内存溢出,应尽可能避免使用UDF,同时尽可能使用Spark的结构化操作。

  7. 序列化错误
    主要表现为作业失败并显示序列化错误。用结构化API时,这种现象非常罕见。但当你使用RDD或UDF执行自定义逻辑时,或序列化到执行器的任务或共享数据无法被序列化时,就常会遇到序列化错误。

    解决方案:
    1.如果你正在使用Kyro序列化,确保注册了你的类
    2.在scala或java中创建UDF时,不要在UDF中引用封闭对象的任何字段

Spark性能优化
提高性能最好的方法是实现良性的检测功能和作业历史跟踪功能,没有这些信息就很难理解你的优化策略是否真的提高了性能。

间接性能优化
1.RDD对象序列化:Kryo序列化比Java序列化更紧凑,效率更高

2.数据存储:Spark处理最有效的文件存储格式是parquet

3.文件可拆分:无论选择哪种文件都应该保证它式可拆分的,这样不同的任务就可以并行的读取文件。通常选择gzip压缩的parquet文件。zip和tar压缩的文件不可拆分

4.表分区:如果用户在其查询时经常按照”date“进行过滤,就可以用该列进行分区,这可以大大减少用户在大多数查询中读取的数据量,从而显著提高速度。

5.表分桶:当按列分区时,若分割细粒度太细导致很多小文件,此时可以尝试表分桶。

6.文件的数量:如果有很多小文件,获得文件列表和找到每个文件的开销都将非常大。例如,hdfs每个数据块是128MB,如果你有30个小文件,每个是5MB,实际上只要2个数据块就可以存储,但此时却需要请求30个块。可以通过maxRecordsPerFile选项控制每个文件中的记录数。一般建议调整文件大小几十兆(至少)。

7.内存压力、垃圾回收:尽可能的多使用结构化API,这不仅会提高Spark执行效率,而且还会大大降低内存压力,因为结构化API不会产生JVM对象。

直接性能优化

1.并行度:如果需要加速某一个特地的阶段,最先尝试的应该就是增加其并行度。可以通过spark.default.parallelism属性来设置它。

2.过滤优化:尽可能的将过滤器移动到Spark任务的最开始,有时,甚至可以放置在数据的源头。启动表分区和表分桶也有助于实现此目的。

3.重分区、合并
重分区的调用可能会导致Shuffle操作,但是通过平衡集群上的数据可以从整体上优化作业的执行,所以这个代价是值得的。重分区主要有coalesce(不会发生shuffle、单节点合并分区)、repartition(发生shuffle、跨节点重分区)。重分区操作应该在连接操作之前或这cache操作之前调用会产生非常好的效果。

4.自定义分区
尝试在RDD级别上自定义分区,可以更好的解决数据倾斜问题。DataFrame上的分区主要采用的是hash分区。

5.避免使用UDF函数
UDF是昂贵的,因为它们强制的将数据表示为JVM对象

6.缓存
重复使用相同的数据集时,最有用的优化方式之一就是将其缓存(内存或磁盘)。这将使得后续多次读取更块,不会再重头执行一遍。由于缓存会导致数据序列化、反序列化和存储开销,因此并不是我们应该一直做的事。例如,你只想在后续的操作中访问该数据集一次,此时缓存只会降低速度。

7.广播变量,针对大小表Join操作时可采用

8.聚合操作时,采用RDD,用reduceByKey替换groupByKey

第Ⅴ部分 流处理

链接: https://editor.youkuaiyun.com/md/?articleId=109321946//未写待续

第Ⅵ部分 高级分析与机器学习

链接: https://editor.youkuaiyun.com/md/?articleId=109321946//未写待续

第Ⅶ部分 生态系统

链接: https://editor.youkuaiyun.com/md/?articleId=109321946//未写待续

Spark算子代码汇总 大数据第35天-Spark算子代码汇总 算子分类 ​ Transformations转换算子延迟执行 需要Action算子触发才执行 ​ Action行动算子,触发执行 ​ 控制算子 cache persist checkpoint Transformations ​ 延迟执行 需要Action算子触发才执行 map- 1:1 取数据数据是一行 flatMap-1:n 数据是多行... 阅读详情

相关推荐

spark 常用算子大全(分类详细,图片解析)

scala 系列 spark 常用算子大全 scala 常用算子大全scala 系列前言思维导图 前言 上一篇博客已经给大家介绍了 scala OOP, 掌握了OOP 的知识后,就已经算是进入 scala 的门了。scala OOP基础是 spark 和 flink 的基础。 本篇博客将为大家带来 scala 高级扩展的介绍。主要包括模式匹配和正则表达式,此外还有异常处理、注解和高级类型的简单了解。 思维导图 ...

BigData_Hubert的博客 1万+

Spark常用算子

fullOuterJoin算子(K,,V)格式的RDD和(K,V)格式的RDD,使用fullOuterJoin结合是以两边的RDD出现的key为主,得到(K(Option(V),Option(W)))会产生shuffle,(K,V)格式的RDD和(K,V)格式的RDD按照相同的K,join得到(K,(V,W))格式的数据,分区数按照大的来。取RDD的差集,subtract两个RDD的类型要一致,结果RDD的分区数与subtract算子前面的RDD分区数多的一致。...

qq_51628990的博客 4432

别再手动对照了!用Python+ArcGIS Pro一键搞定三调数据转土地三大类

本文介绍如何利用Python和ArcGIS Pro实现三调数据向土地三大类的自动化转换,大幅提升国土空间规划和土地变更调查的工作效率。通过封装分类规则为Python函数并集成到ArcGIS Pro脚本工具中,解决了传统手动操作耗时且易错的问题,适用于大规模数据处理场景。

weixin_29081101的博客 304

Spark算子

RDD的方法和Scala集合对象的方法不一样,集合对象的方法都是在同一个节点的内存中完成的。RDD的方法可以将计算逻辑发送到Executor端(分布式节点)执行。为了区分不同的处理效果,所以将RDD的方法称为算子,RDD的方法外部的操作都是在Driver端执行的,而方法内部的逻辑代码是在Executor端执行。Spark算子大致可以分为4类:创建算子、转换算子、缓存算子、行动算子。............

weixin_44328257的博客 2568

数字音频接口之I2S总线协议详解

1、SDATA,也就是串行数据信号,使用二进制传输数字信号。请注意数据的传输形式为补码的方式2、例如音频的采样率是8K,一s内存采样8K个点,一个点包含一个左声道,一个右声道,所以LRCK是8K,BCLK是2×采样频率×采样位数3、同时双向(TX和RX)音频流:串行数据同步移位到时钟信号SCK和LRCK。在SCK的下降沿将TX数据写入SDOUT引脚,并在SCK的上升沿从SDIN引脚读取RX数据。始终首先发送最高有效位(MSB);TX和RX均可在主模式和从模式下使用。

卓学课堂 3万+

IAR安装成功的关键:STM32设备支持文件导入方法

IAR安装常卡在设备支持缺失这一步——尤其对STM32新手,没导入对应芯片包,编译直接报错。实测发现,必须通过IAR的Tools→Options→IDE→Configuration→Device Support手动加载STM32设备支持文件,否则新建工程时连芯片型号都选不到。IAR安装是否顺利,往往就差这一步。

weixin_42527589的博客 680

《Spark The Definitive Guide》Spark 权威指南学习计划

本书出自OReilly的《Spark: The Definitive Guide Big Data Processing Made Simple》,由Matei Zaharia, Bill Chambers两位大佬所写,是2018年2月的第一版(我也不清楚有没有最新版,搜也没搜到第二版) 参考本书主页介绍,着眼于Spark 2.0的改进,探索Spark结构化API的基本操作和常用功能,以及用于构建...

weixin_34235371的博客 644

用生成式AI自动生成测试用例的完整教程

本文旨在帮助测试工程师、开发人员快速掌握“生成式AI自动生成测试用例”的核心技术,覆盖从概念理解、工具选择到实战落地的全流程。无论是Web应用、API接口还是移动端功能测试,你都能找到可复用的方法。本文将按照“概念→原理→实战→避坑”的逻辑展开:先通过生活案例理解生成式AI如何生成测试用例,再拆解核心算法原理,接着用Python代码演示完整生成流程,最后分享实际应用中的优化技巧和未来趋势。生成式AI:能“创造内容”的AI模型(如ChatGPT、CodeLlama),像会写作文的智能笔。测试用例。

AIGC应用创新大全的博客 1580

Spark:The Definitive Guide--读书小结(一)

个人读后小结,如有不对,欢迎批评指正前言第Ⅰ部分 大数据与Spark概述第Ⅱ部分 结构化API--DataFrame、SQL和Dataset第Ⅲ部分 低级API第Ⅳ部分 生产与应用第Ⅴ部分 流处理第Ⅵ部分 高级分析与机器学习第Ⅶ部分 生态系统 前言 大概花了一个月(2020-09~2020-10)左右的时间,看完了整本书。笔者毕业后,主要从事机器学习、数据挖掘方向的相关工作。由于Spark作为目前主流的分布式计算引擎,个人也一直在用Spark进行相关的数据分析与建模工作。通读全书,感觉比较适合入门级学习,主

Java_Man_China的博客 937

AUTOSAR从入门到精通-【应用篇】基于AUTOSAR架构的混合动力电池 ECU 软件开发

由于严峻的环境污染和能源短缺问题,各国都在致力于发展新能源车,以达到节能排放的目的。在此背景下,12V启停系统由于成本较低廉、匹配方便,得到广泛应用。但是12V系统作为启停系统后存在许多问题,比如节能和减排效果有限,并且轻度混合动力系统的功率需求通常在10~15KW,在此电压条件下运行时,电池的电流会达到1000A,因此该方案行不通。高压混合动力系统(>110V)的节油效果好,但是成本很高,并且需要大功率的电机。48V混合动力系统比高压混合动力系统成本。

getusushu的博客 1488

群辉NAS映射为本地盘符

鼠标右击网络→映射网络驱动器→以上适合通过局域网操作,采用ZeroTier组网后,也可以按照以上步骤实现,这时使用 “虚拟局域网”的IP地址。

dgnankai的专栏 5774

Spark:The Definitive Guide--读书小结(三)

个人读后小结,如有不对,欢迎批评指正前言第Ⅰ部分 大数据与Spark概述第Ⅱ部分 结构化API--DataFrame、SQL和Dataset第Ⅲ部分 低级API第Ⅳ部分 生产与应用第Ⅴ部分 流处理第Ⅵ部分 高级分析与机器学习第Ⅶ部分 生态系统 前言 大概花了一个月(2020-09~2020-10)左右的时间,看完了整本书。笔者毕业后,主要从事机器学习、数据挖掘方向的相关工作。由于Spark作为目前主流的分布式计算引擎,个人也一直在用Spark进行相关的数据分析与建模工作。通读全书,感觉比较适合入门级学习,主

Java_Man_China的博客 622

基于DynamicHead的YOLOv8四头版本改进:面向复杂场景的多目标检测优化【YOLOv8】

YOLOv8的检测头是通过不同尺度的特征层输出检测结果。这些检测头通常包括三个:用于大物体、中等物体和小物体的检测。然而,这种单一结构可能会在复杂场景下失去针对性和灵活性,特别是当多个目标之间差异较大时。为了进一步提升模型在特定目标上的检测性能,DynamicHead的引入为我们提供了一个多检测头的优化方案。本文提出了一种基于DynamicHead的四头版本YOLOv8改进方案,以解决复杂场景下多目标检测的挑战。通过引入四个独立检测头,分别针对不同目标特征进行优化,实现了更灵活的检测结构。

博客 1718

Spark:The Definitive Guide--读书小结(五)

个人读后小结,如有不对,欢迎批评指正前言第Ⅰ部分 大数据与Spark概述第Ⅱ部分 结构化API--DataFrame、SQL和Dataset第Ⅲ部分 低级API第Ⅳ部分 生产与应用第Ⅴ部分 流处理第Ⅵ部分 高级分析与机器学习第Ⅶ部分 生态系统 前言 大概花了一个月(2020-09~2020-10)左右的时间,看完了整本书。笔者毕业后,主要从事机器学习、数据挖掘方向的相关工作。由于Spark作为目前主流的分布式计算引擎,个人也一直在用Spark进行相关的数据分析与建模工作。通读全书,感觉比较适合入门级学习,主

Java_Man_China的博客 518

Python爬虫实战:汽车之家车型参数与口碑数据抓取分析

在当今信息爆炸的时代,购车决策已从传统的4S店咨询转变为数据驱动的智能化过程。汽车之家作为国内领先的汽车信息平台,汇聚了海量车型参数、车主口碑和专业评测数据。本文将详细介绍如何使用Python最新爬虫技术构建一个高效、稳定的汽车数据采集系统,通过多维度数据分析辅助用户做出更明智的购车决策。本项目将采用异步爬虫、智能反爬绕过、数据清洗与分析等现代化技术栈,完整实现从数据采集到可视化分析的全流程。本文详细介绍了如何使用Python最新技术构建一个功能完整的汽车之家数据爬虫系统。

2201_76125261的博客 1488

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

大牛书单 | 大数据存储方向好书分享

导语:读书是一生的功课,技术人通过读书实现自我提升,学习优秀知识沉淀。TEG书知道本期特邀腾讯云数仓数据湖产品负责人堵俊平、腾讯云数据库负责人林晓斌、腾讯TEG云架构平台部数据块中心高级工程师王银虎,腾讯TEG计费平台部账户中心专家工程师潘安群为大家带来大数据方向好书推荐。来看看技术大牛在读什么,收藏优质内容,愿本期书单助您更专业。堵俊平,腾讯云数仓数据湖产品负责人,T4专...

weixin_34309543的博客 179

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

如何高效利用gh_mirrors/books79/Books:新手程序员的学习路径规划

gh_mirrors/books79/Books是一个全面的程序员学习资源库,包含从基础编程到高级人工智能的各类技术书籍,帮助新手程序员系统构建知识体系。通过合理规划学习路径,你可以快速掌握核心技能,提升职业竞争力。 ## 📚 快速获取项目资源 要开始使用这个宝藏资源库,首先需要将项目克隆到本地。打开终端,输入以下命令: ```bash git clone https://gitcode.

gitblog_00060的博客 416

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Spark基础之:常用算子逐一详解

Spark常用算子逐一详解 一、什么是Spark rdd算子 二、算子的分类 三、常用的Transformation算子及使用方法 四、常用的Action算子及使用方法 五、关于rdd算子的常见问题汇总

weixin_43542605的博客 6638

Spark初级入门——Spark编程基础(一)

本节内容主要包括:RDD简介、RDD生命周期、RDD的创建、RDD的依赖关系、RDD transformation操作

Spark常见算子详解

groupByKey 和groupby 的区别是前者是确定以key为分组,所以只返回value的迭代器,程序上后者不确定以什么来分组,所以返回[(String,Int) (K,V)]定义:countByKey算子统计K-v类型的数据中的Key的次数,countByValue统计所有的value出现的次数,统计对象可以是K-v,也可以是List等。定义:rdd.aggregateByKey((初始化的值)(分区内迭代计算的逻辑)(分区间计算的逻辑))

weixin_42733117的博客 3070

SPARK基本编程

SPARK基本编程

zcb_data的博客 3698

Spark常用代码

有两个不同的方式可以创建新的RDD 2. 专门读取小文件wholeTextFiles 3. rdd的分区数 4. Transformation函数以及Action函数 4.1 Transformation函数 由一个RDD转换成另一个RDD,并不会立即执行的。是惰性,需要等到Action函数来触发。单值类型valueType单值类型函数的demo: 双值类型DoubleValueType双值类型函数的demo: Key-Value类型Key-Value类型函数demo 4.2 Action函数 立即执行

HELLOWORLD2424的博客 2523

Spark的算子

分享了spark中的算子

xieyichun_的博客 2258

spark—算子详解

介绍算子和闭包检测功能

weixin_44604159的博客 2213

Spark的算子的分类

从大方向来说,Spark 算子大致可以分为以下两类: 1)Transformation 变换/转换算子:这种变换并不触发提交作业,完成作业中间过程处理。   Transformation 操作是延迟计算的,也就是说从一个RDD 转换生成另一个 RDD 的转换操作不是马上执行,需要等到有 Action 操作的时候才会真正触发运算。 2)Action 行动算子:这类算子会触发 SparkContext 提交 Job 作业。   Action 算子会触发 Spark 提交作业(Job),并将数据

King_S_H的博客 7464

Centos7安装jdk

Centos7安装jdk 1.第一步 将下载的tar包传到虚拟机 2.卸载openjdk rpm -e --nodeps java-1.6.0-openjdk-1.6.0.35-1.13.7.1.el6_6.i686 rpm -e --nodeps java-1.7.0-openjdk-1.7.0.79-2.5.5.4.el6.i686 3.解压 将tar包解压到你想放的目录下 -C后面是路...

Thesmallwhiteah的博客 309
上一篇: Spark:The Definitive Guide--读书小结(三)
下一篇: Spark:The Definitive Guide--读书小结(五)
小糖宝
博客等级 码龄9年 47粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值