Spark框架基本知识总结

RDD

  • RDD闭包检测:检查闭包内对象是否可以序列化进行网络传输

  • 血缘关系:当部分分区数据丢失时,根据血缘关系图,重新生成数据分区

  • 宽依赖(父亲(前)有多个儿子(后)

  • 窄依赖(父亲最多只有一个儿子)

任务划分:

  • Application:初始化一个sparkcontext就会生成一个application
  • job:一个action算子就会生成一个job
  • stage:等于宽依赖个数加1
  • task:一个stage中最后一个rdd的分区个数就是task的个数

RDD检查点

  • 对RDD进行的checkpoint不会立即执行,必须执行了action之后才能触发

  • 在Spark core中对Rdd做checkpoint,将Rdd数据保存在HDFS中

  • 在spark streaming中,生成一个batch就存储一个checkpoint,保存DStreamGraph等相关配置信息.

  • 对于Kafka的就是重写DStreamCheckpointData的update和restore方法,保存的就是topic,partion,fromOffset和untilOffset(偏移量)

缓存和检查点的区别

  • 缓存的是rdd数据,不切断血缘依赖
  • checkpoint切断血缘依赖
  • 缓存存储在磁盘、内存中可靠性不强
  • checkpoint数据存在hdfs等高容错的文件系统中,建议对checkpoint做缓存处理

RDD分区器

  • Hash分区器
  • Range分区器
    • (只有Key-Value类型才有分区器)默认hasHash分区器

RDD文件读取:

  • txt:sc.textFile(‘input/1.txt’)
  • sequence:
    • dataRDD.SaveAsSequenceFile(‘path’)
    • sc.sequenceFile(INT,INT)(‘paht’)
    • collect().foreach()
  • object:
    • dataRDD.saveAsObjectFile(‘paht’)
    • sc.objectFileINT.collect().foreach()

累加器:

  • 累加器就是把executor变量信息聚合到Drive,在Drive定义的变量,每个Execute都会得到一个新的副本,然后更新之后传回Drive进行merge,drive端定义,executor端修改也会导致drive端修改

广播变量

  • drive端定义的某个值或者list,executor需要使用。每个executor里面的BlockManager里面存放广播变量,当前tasks都可以读取

spark通讯架构:

  • EndPoint:每个节点都有一个RPC终端,实现RpcEndpoint结构,根据不同端点的需求,设计不同的消息和不同的业务处理。生命周期(constructor,onStart,receive,Onstop)

  • RpcEnv:消息调度器,针对RPC终端需要发送或者从远程RPC接收到的消息,分发到不同的收件箱(发件箱),接收方是自己收件箱,不是自己发件箱

  • Inbox:指令消息收件箱。一个endpoint对应一个收件箱,Dispatcher每次向inbox存入消息时,都将对应的endpointData加入内部ReceiverQueue中,并创建单独的线程轮询RQ

  • RpcEndpointRed:对远程Rpcendpoint的一个引用,需要向指定发送消息时,需要获取其引用

  • outbox:指令消息发件箱,一个目标Rpcendpoint对应一个发件箱,如果对多个endpoint发送消息则有多个发件箱通过TransportClient发送消息

  • RpcAddress:表示远程的RpcendpointRef地址,Host+port

  • TransportClient:Netty的通信客户端,一个Outbox对应一个,不断轮询OutBox对应请求远程TransportServer

  • TransportServer:netty的通信服务端,一个Rpcendpoint对应一个TransportServer,接受远程消息调用Dispatcher分发消息

Spark任务调度:

  • 深度优先遍历

Spark 内存管理:

  • 堆内内存和堆外内存,动态占用

Spark shuffle:

  • hashShuffle:同个executor同任务文件根据key合并成一个
  • sortShuffle:根据key排序,然后文件读取使用索引读取,实现二分查找形式,多一次排序过程,减少查找时间
  • bypass SortShuffle:reduce task数量小于Threshold值,默认为200,非聚合类算子,比如reduceBykey;经过hash索引写入内存或溢写磁盘(好处不排序)

shuffle发生会有哪些工作

  • map端:input split->buffer in memory->partitions->merge on disk
    • map先分片,然后数据处理转换为新的key value,缓存在内存里,内存中parition,然后每个partition根据key排序根据key分组,每个分组调用一次reduce,同key如何设置combiner就会同key合并数据(相当于reducer)内存不够则溢写磁盘(溢写的文件多就会多次调用combiner),map结束会把spill出的文件合并一个,map端shuffle完成后reduce取数据
  • reduce:fetch->merge->reduce->output
    • 先取数据到内存Copy phase,然后sort phase(阶段),使用merge sort生成更大的有序文件,如果设置combiner,merge过程会调用combiner,然后reduce phase过程, reduce job开启,输入数据是shuffle sort merge产生的数据

数据倾斜

类型1

  • 数据源
    • 数据本身存在很多相同key->数据切分,然后使用多个task并行计算
    • 解决办法:尽量使用可切割的文本存储,生成尽量多的task进行并行计算

类型2

  • shuffle过程中
    • shuffle过程中对key取模造成hash分到一起
    • 解决办法:调整reduce task并行度,增大 reduce task数量(例如在groupbykey时增大task),(自定义分区)通过hash取模分配的更加均匀,可以有效减少数据倾斜

其他

  • reparation:强制重新分区
  • mapjoin:把小表broadcast到exector 和大表join

python 单词统计案例


def cal(key):
    return (key,1)
sc = SparkContext(appname='test')
line = sc.textFile('path')
map_line = line.map(lambda l:cal(l))
reduce_line = map_line.reduce(lambda a,b:a+b)
result = reduce_line.collect()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值