spark原理概念

本文深入解析Spark组件功能,探讨优化策略,阐述宽窄依赖概念,详述transformation与action算子,解读RDD特性及应用场景,提供Kafka数据接入方案,分享数据倾斜解决方案,介绍并行度设置原则,探讨数据本地化策略,分析DataFrame与Dataset区别,揭示Spark持久化机制,总结shuffle优化技巧,阐明Parquet优势,演示二次排序实践,剖析Spark内存管理,讲解Kafka工作原理,强调offset的重要性。

spark有哪些组件:

master:管理集群和节点,不参与计算
worker:计算节点,进程本身不参与计算,向master心跳(不包含节点资源)
Driver:运行程序的main方法,创建spark context对象
spark context:控制整个application的生命周期,包括DAGSchedule和 TaskSchedule等
client:用户提交程序的入口


spark的优化怎么做:

防止不必要的jar包分发,提高数据本地性,选择高效的存储格式,大数据量的应用开启持久化,JVM设置合适的资源量,使用高效的序列化,增大off head等

  • 宽、窄依赖
    窄依赖是指每一个parent RDD的partition最多被子RDD的固定个数partition使用
    宽依赖是指多个子RDD的partition会依赖同一个parent RDD的partition
    lazy模式下只有碰到action算子才会执行。

transformation算子

map(func)
filter(func)
flatMap(func)
sample()
union()
groupByKey()
reduceByKey()
join()
distinct()
cogroup()
sortByKey()
groupWith()
cartesian()

action算子

reduce()
collect()
count()
first()
take()
takeSample()
saveAsTextFile()
saveAsSequenceFile()
countByKey()
foreach()


RDD的弹性表现在哪几点?

  1. 自动进行内存和磁盘存储切换
  2. 基于lineage的高效容错
  3. task如果失败会自动进行特定次数的重试,而且只会计算失败的分片
  4. checkpoint和persist,数据计算之后持久化缓存
  5. 数据调度弹性,DAG Task调度和资源无关
  6. 数据分片的高度弹性,分片很多碎片可以合成大的

RDD通过lineage(记录数据更新)的方式如何高效

  1. lazy记录了数据的来源,RDD是不可变的,所以每次操作不存在全局修改的问题,所有的计算都可以往前回溯
  2. 记录原数据,RDD的写是粗粒度的,提高了效率,RDD的读操作可以是粗粒度也可以是细粒度。

RDD有哪些缺陷
  1. 不支持细粒度的写和更新操作
  2. 不支持增量迭代计算,Flink支持

如何从Kafka中获取数据

基于Receiver的方式:这种方式使用Receiver来获取数据,Receiver使用Kafka的高层次Consumer API来实现的,数据存储在spark的Executor内存中(通过zookeeper来连接Kafka队列)
基于Direct的方式:这种方式直接连接Kafka的节点上获取数据。
对于spark的数据倾斜有什么解决方案
避免不必要的shuffle,将reduce-side-join提升为map-side-join
调整合适的并行度,并行度少,task压力大,并行度多,占用资源过多
两阶段聚合,先局部聚合,再全局聚合,减少数据计算量

创建RDD的几种方式

使用程序中的集合创建
使用本地文件系统创建
使用hdfs创建
基于数据库创建
基于Nosql创建
基于数据流创建,如socket

spark怎么设置并行度比较合适

每个core承载24个partition,8core设置1632个partition,

spark数据本地化有几种

PROCESS_LOCAL读取缓存在本地节点的数据,数据和代码在同一个进程中
NODE_LOCAL读取本地节点的数据
ANY读取非本地节点的数据
RDD的操作类型
transformation
action
cronroller(控制算子):cache,persist

spark如何修改默认的task个数

数据数据有很多task,尤其是有很多小文件的时候,多个block对应一个task,每个task对应一个partition,设置spark_home/conf/spark-default.conf中的
spark.sql.shuffle.partitions 50? 针对sparksql的task数量
spark.default.parallelism 10 针对非spark sql程序设置生效

spark为什么要持久化,一般什么情况下使用persist

[]spark所有复杂一点的算法都会有persist,spark计算时默认数据放在内存,非常适合高速迭代,但是非常容易出错,如果没有对父RDD进行persist或cache操作,就需要重头计算,耗费时间和计算资源。
其中cache内部调用了persist方法,persist方法又调用了persist(StorageLevel.MEMORY_ONLY)方法,所以执行cache算子其实就是执行了persist算子且持久化级别为MEMORY_ONLY

以下场景会进行persist

某个步骤非常耗时,需要进行persist持久化
计算链条非常长,重新计算要很多步骤
checkpoint所在的RDD要持久化persist,checkpoint前一定会进行persist。
shuffle之前进行persist,框架默认将数据持久化到磁盘。
shuffle之后后要persist,shuffle要进行网络传输,风险很大,数据丢失重来,恢复代价大

join优化经验

map-side-join:大小表关联效果很好,将小表广播到每个executor中
reduce-side-join:当数据量非常大的时候,shuffle过程中消耗很多网络和磁盘IO,这时候应该用map-side-join

为什么使用parquet

速度更快,压缩技术更好,非常稳定,减少磁盘IO和存储空间,

spark二次排序

rdd.map(a => (a.split(" “)(0),a.split(” ")(1).toInt)).sortByKey(x=>x,false).foreach(println)

spark.shuffle.memoryFraction

默认时20%的内存,在shuffle过程中,如果聚合的数据比较大,那么就会写到磁盘中,降低性能,如果task进度缓慢,表示内存分配的少

Kafka工作原理

producer向broker发送事件,consumer从broker消费事件。
事件由topic区分开,每个consumer都会属于一个group,相同group中的consumer不能重复消费事件,而同一事件将会发送给每个不同group的consumer
不配置spark.deploy.recoveryMode选项为zookeeper,会有什么不好的地方。
如果不设置这个选项,那么集群的所有运行数据在Master重启时都会丢失。

	DataFrame就是按列组织的DataSet,可将DataFrame等同于数据库中的表
	使用dataset通常都会用 case class 定义dataset的数据结构

如何保证kafka数据的准确性(offset)

1.设置wal( writeAheadLog.enable)
2.异步读取kafka数据,读取时间和每次读取offset范围可以由参数设定。
3.当driver 触发batch任务的时候,Receivers中的数据会转移到剩余的executor中去执行。在执行完之后,Receivers会相应更新ZooKeeper的offsets。

基于径向基函数神经网络RBFNN的自适应滑模控制学习(Matlab代码实现)内容概要:本文介绍了基于径向基函数神经网络(RBFNN)的自适应滑模控制方法,并提供了相应的Matlab代码实现。该方法结合了RBF神经网络的非线性逼近能力和滑模控制的强鲁棒性,用于解决复杂系统的控制问题,尤其适用于存在不确定性和外部干扰的动态系统。文中详细阐述了控制算法的设计思路、RBFNN的结构与权重更新机制、滑模面的构建以及自适应律的推导过程,并通过Matlab仿真验证了所提方法的有效性和稳定性。此外,文档还列举了大量相关的科研方向和技术应用,涵盖智能优化算法、机器学习、电力系统、路径规划等多个领域,展示了该技术的广泛应用前景。; 适合人群:具备一定自动控制理论基础和Matlab编程能力的研究生、科研人员及工程技术人员,特别是从事智能控制、非线性系统控制及相关领域的研究人员; 使用场景及目标:①学习和掌握RBF神经网络与滑模控制相结合的自适应控制策略设计方法;②应用于电机控制、机器人轨迹跟踪、电力电子系统等存在模型不确定性或外界扰动的实际控制系统中,提升控制精度与鲁棒性; 阅读建议:建议读者结合提供的Matlab代码进行仿真实践,深入理解算法实现细节,同时可参考文中提及的相关技术方向拓展研究思路,注重理论分析与仿真验证相结合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值