spark原理概念

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。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值