2025年8月29日
把Spark和Flink在计算模型和运维方式上的差异放到一起看,重点包括:
- 先看 Spark 处理流 与 Flink 处理批 的天然短板,理解为什么 Spark 更偏微批、Flink 更偏实时,而不是简单说谁“全能”
- 重点拆 Shuffle、checkpoint、反压、内存模型、代码生成 这些底层机制,解释两者性能差异为什么会落到 I/O、CPU 和延迟上
- 再把 spark-submit、Thrift Server、Spark Operator、Livy 与 flink run、Flink Kubernetes Operator、REST API、SQL Client、Application Mode 摆在一起比较
- 最后落到实用选择:如果目标是 批处理吞吐、流式低延迟、K8s 原生部署、CI/CD 自动化、SQL 接入,Spark 和 Flink 分别更适合什么场景
阅读全文
2024年11月25日
SparkContext、存储体系、RPC、Web-UI。
存储体系,BlockManager和BlockManagerMaster、MemoryManager、MemoryStore、DiskBlockManager、DiskStore。监控体系:MapOutputTracker、MapOutputTrackerMaster、MapOutputTrackerWorker。 Web-UI体系:对应的层级结构为: SparkUI -> WebUITab -> WebUIPage。执行环境:安全体系(SecurityManager、用于设置 yarn,hadoop 的 secret key);SparkContext 会附带初始化:Metrics 体系、Listener、SparkUI、RPC 整套体系、BlockManager,storage 体系、Executor 体系、Heartbeater、KVStore、SerializerManager,还有度量类、日志体系。 PRC 体系:MessageLoop 中维护了 Inbox 的链表、每个Inbox 中为了 InboxMessage 的链表,InboxMessage包含很多实现类,如 HeartbeatReceiver ,包括了 receiveAndReply。RPC中用到了 netty的通讯体系,根据发送地址,选择对应的 Outbox,每个 Outbox维护一个 OutboxMessage的链表,再通过netty 的 NettyChannel 发送出去
阅读全文
2024年10月23日
web-ui观察 executor指标:失败,shuffle,cache,CPU,内存,RDD数量,GC;stage关注 DAG,也是shuffle等数据,还有 Event Timeline。shuffle优化方式:增加并行度,group by变成局部聚合+全局聚合;转为 BHJ,大表 join 大表的 外表加盐,内表复制N份,再去盐gourp原始id,最后聚合;shuffle原理,HashShuffleManager(废除),SortShuffleManager。 with 缓存优化,查询下推,自动倾斜join优化,LIMIT大数量优化,bucked join,4表join转为2个2个join增加并行度。RSS,向量化, AQE
阅读全文
2024年9月9日
spark streaming的基本原理,包括MicroBatchExecution,ContinuousExecution,通过IncrementalExecution + 状态实现micro-batch 并复用了spark 的所有查询逻辑;Source接口支持 getOffset,commit,可以自定义各种扩展实现;Sink包括:FileStreamSink、KafkaSink、DeltaSink、、ForeachBatchSink,ForeachWriteTable;Stateful将信息存如StateStoreRDD,保存到 HDFSBackedStateStoreProvider、RocksDBStateStoreProvider 中;Stream-Stream Join使用了StreamingSymmetricHashJoin,需要保证状态;Session Window同样也是通过插入一些流相关的算子 + 状态保存实现的
阅读全文
2024年9月1日
Distribution及相关类,Partitioning类,Partitioner类,排序的物理算子,UnsafeExternalSorter 和UnsafeInMemorySorter,spill和归并排序;shuffle操作,ShuffleDependency,ShuffleRowRDD,map端的ShuffleMapTasks,reduce端 ShuffleDependency 从shuffle manager 那里读取数据,拿到MapStauts 状态;ShuffleManager 包含了ShuffleWriter,ShuffleReader;BypassMergeSortShuffleWriter 、UnsafeShuffleWriter、SortShuffleWriter、、BlockStoreShuffleReader
阅读全文
2024年5月6日
入口点:CollapseCodegenStages,插入WholeStageCodegenExec;对于不支持的,或者 SortMergeJoinExec、ShuffledHashJoinExec 会插入 InputAdapter;代码生成可以看作是两个方向相反的递归过程:代码的整体框架由 produce/doProduce 方法负责,父节点调用子节点。代码具体处理逻辑由 consume/doConsume 方法负责,由子节点调用父节点。整个物理算子树的执行过程被InputAdapter分隔开。boradcast-hash-join跟普通的bhj类似,分割部分插入了InputAdapter。shuffle-hash-join,跟 bhj 类似,只是左右两个子节点都增加了 InputAdapter,作为code-gen 的分割。sort-merge-join 左右两边都是 InputAdapter,对code-gen做了分割,之后调用SortExec 再次增加 InputAdapter,然后是shuffle逻辑,会生成5个代码片段。BroadcastNestedLoopJoin:广播+nested loop实现。CartesianProduct 没有 code-gen
阅读全文
2024年4月27日
join的语法定义,join类型,解析、优化过程,join选择策略:hint、等值、数据size,父hash join: streamedlter 和 buildlter,数据的节点分布,对子节点的要求,JoinedRow 类型;BroadcastHashJoin 和 BroadcastExchange; ShuffleHashJoin 和 ClusteredDistribution,先将数据物化再通过AQEShuffleRead 读取; Shuffle Sort Merge Join,Sort ,Exchange,SortMergeJoinScanner(ExternalAppendOnlyUnsafeRowArray);BroadcastNestedLoopJoinExec ,BroadcastDistribution 等价两个for循环; CartesianProduct 对子节点无要求也是两个for循环; 排序算子执行过程
阅读全文
2024年4月27日
cube,rollup,grouping set,窗口函数执行过程,lateral,pivot,unpivot,with cube 的代码生成
阅读全文