- 博客(44)
- 收藏
- 关注
原创 Flink Credit-based机制解析
tcp-based和credit-based介绍可以看:flink1.5之前是基本tcp实现的反压。同一个TaskManager的任务共享TCP缓冲区。一个任务产生背压,会影响TaskManager内的其他任务接受消息。
2025-03-28 15:39:24
504
原创 Flink TaskManager之间数据传输(NetworkManager)
NetworkManager可以看到只存在于TaskManager中,用于TaskManager之间的数据传输。是基于netty实现的。
2025-03-28 15:38:44
862
原创 MCP Server简单开发
官网:https://modelcontextprotocol.io/introductionMCP采用的client-server架构,mcp server是对应的工具实现,用于实际与外部世界交互。mcp client需要对应的大模型进行开发适配。mcp client和mcp server通过mcp protocol交互,类似http协议。与web开发一样,重点是在实现各种mcp server。
2025-03-23 12:21:05
1071
原创 flink JobGraph解析
JobGraph主要是StreamGraph经过优化后生成的,主要优化的就是对符合条件节点进行chain,这样可以减少数据流动的序列化和传输。JobGraph主要由三部分组成。
2025-02-10 17:09:39
1271
原创 flink StreamGraph解析
Flink程序有三部分operation组成,分别是源source、转换transformation、目的地sink。这三部分构成DAG。DAG首先生成的是StreamGraph。用户代码在添加operation的时候会在env中缓存(变量transformations),在env.execute()执行的时候才会生成对应StreamGraph。
2025-01-27 17:39:07
1379
2
原创 flink state源码解析
其实原理很简单:StateMap 和 Snapshot 共享了一大堆数据,既然 Snapshot 要求数据不能修改,那么 StateMap 在修改某条数据时可以将这条数据复制一份产生一个副本,所以 Snapshot 和 StateMap 就会各自拥有自己的副本,所以 StateMap 对数据的修改就不会影响 Snapshot 的快照。:并发度在改变的时候,会将并发上的每个List都取出,然后把这些List合并到一个新的List,然后根据元素的个数在均匀分配给新的Task;然后不做划分,直接交给用户;
2025-01-06 17:23:35
899
原创 flink并行度
的多个Task,那么其中几个Task是可以共享使用同一个TaskSlot的。例如图中,source/map,keyBy/windows/appy,sink这三个Task共享使用了一个TaskSlot。例如图中,每个TaskManager上面有3个TaskSlot,那么意味着每个TaskSlot有三分之一TaskManage内存。例如图中,source/map组成的Task的并行度为2,它就分别占用两个TaskManager上各一个TaskSlot。一个taskSlot中可以有多个task。
2025-01-06 17:22:03
629
原创 flink的EventTime和Watermark
Nullable@Override// 生成watermark@Override//获取事件时间@OverrideSystem.out.println("系统当前时间:"+ DateUtil.date());System.out.println("当前水位时间:"+DateUtil.date(context.currentWatermark()));
2025-01-06 17:20:43
1135
原创 flink异步流(async stream)解析
异步流都在 org.apache.flink.streaming.api.operators.async 包下面AsyncResult是存放在queue的中间结果,可以是watermark(AsyncCollectionResult),也可以是用户record(AsyncCollectionResult)。方法有四个,分别是判断watermark、判断result、获取watermark、获取resultStreamElementQueueEntry是一个抽象类,实现了大部分逻辑,剩下主要业务逻辑是getF
2025-01-06 17:19:48
1330
原创 CAP与BASE分布式理论
强一致性:写入数据的时候,要不全部节点都写入成功,要不都写入失败(类似数据库的事务性)。读取数据的时候,从哪个节点上都读取到最新的值。即所有节点时刻保持一样的值。可用性:系统对外提供的服务一直处于可用的状态。用户每一次请求都能返回正确的结果。分区容错性:集群的节点之间会发生通信,由于网络原因,集群通信出现问题。此时系统仍然能对外提供服务一个分布式系统无法同时满足这三个条件,只能满足两个。P是必须的,一般为CP和AP。
2024-11-15 18:06:01
779
原创 SparkSQL——OptimizedLogicalPlan生成
SQL示例:SELECTnameFROMstudentWHEREage>18方法入口。
2024-08-09 17:52:31
279
原创 SparkSQL——AnalyzedLogicalPlan生成
SparkSQL中对LogicalPlan的解析、优化、还有物理执行计划生成都是分成一个个Rule进行的。RuleExecutor是一个规则引擎,它收集Rule,并对plan按照rule进行执行。每一个Rule的实现类都要实现apply方法,具体逻辑都放在这个方法中。RuleExecutor核心是batches存放要执行的rule、execute执行batches的rule。batches中有很多Batch对象。相同执行策略、相似功能的rule会生成一个Batch对象。
2024-08-09 17:02:59
372
原创 SparkSQL——UnresolvedPlan生成
fromClause下面的relation节点下面的relationPrimary节点调用plan方法,上面也说到plan方法,是调用visit的对应的方法。queryTerm节点的accept方法对应就是QueryTermDefaultContext的accept方法,就是visitor的visitQueryTermDefault方法。visitQueryTermDefault的子节点是queryPrimary,所以是调用对应实现类QueryPrimaryDefaultContext的accept方法。
2024-08-09 11:45:39
884
原创 SparSQL——基本类和常见概念
TreeNode一直在内存里维护,不会dump到磁盘以文件形式存储,且无论在映射逻辑执行计划阶段,还是优化逻辑执行计划阶段,树的修改都是以替换已有节点的方式进行的。在Catalyst中,TreeNode 类是 SparkSQL 中所有树结构的基类,定义了 系列通用的集合操作和树遍历操作接口。eval方法是调用child的eval方法(形成循环调用,直到叶子节点),根据返回值调用nullSafeEval方法。Literal是LeafExpression的一个实现类,是用来包装常量的。叶子节点,没有子节点。
2024-08-05 10:47:22
868
原创 spark 广播变量broadcast
broadcast使用如下图,可以看到创建broadcast是val barr1 = sc.broadcast(arr1),使用broadcast是barr1.value创建broadcast是使用的broadcastManager。
2024-07-22 15:29:20
1126
1
原创 spark 事件总线listenerBus
图片来源:https://blog.youkuaiyun.com/sinat_26781639/article/details/105012302。
2024-07-17 17:59:32
754
原创 spark 读操作
Shuffle read的入口是ShuffleRDD的compute方法。它获取shuffleReader,执行对应的read方法。创建reader的时候首先获取要读的shuffle block对应的信息,创建shuffle reader。read创建wrappedStreams:Iterator[(BlockId, InputStream)],一个block对应一个input streamrecordIter 将stream中数据反序列成(k,v)metricIter 遍历统计。
2024-07-15 14:48:30
1440
1
原创 spark shuffle写操作——UnsafeShuffleWriter
使用long类型packedRecordPointer存储数据。数据结构为:[24 bit partition number][13 bit memory page number][27 bit offset in page]
2024-07-10 17:25:40
980
原创 spark shuffle写操作——SortShuffleWriter
写入的简单流程:1.生成ExternalSorter对象2.将消息都是插入ExternalSorter对象中3.获取到mapOutputWriter,将中间产生的临时文件合并到一个临时文件4.生成最后的data文件和index文件可以看到写入的重点类是ExternalSorter对象。
2024-07-08 11:50:48
1045
原创 spark shuffle写操作——BypassMergeSortShuffleWriter
每一个分区都生成一个临时文件,创建DiskBlockObjectWriter对象,放入partitionWriters。
2024-07-05 15:44:09
534
原创 spark shuffle——shuffle管理
shuffle系统的入口。ShuffleManager在driver和executor中的sparkEnv中创建。在driver中注册shuffle,在executor中读取和写入数据。registerShuffle:注册shuffle,返回shuffleHandleunregisterShuffle:移除shuffleshuffleBlockResolver:获取shuffleBlockResolver,用于处理shuffle和block之间的关系。
2024-07-05 11:09:48
1134
原创 spark调度体系——task执行
executor收到LaunchTask消息后,先将消息解码成TaskDescription对象,再调用launchTask方法执行。runTask是抽象方法,具体实现是在子类ResultTask和ShuffleMapTask中。taskBinary反序列化成(rdd, func),调用func方法返回结果。创建TaskRunner的线程包装类,用于执行task。Task是抽象类,run方法中是调用了runTask方法。ResultTask是结果task,最终是返回结果。
2024-06-27 19:23:04
362
原创 spark调度体系——stage/task提交
stage提交入口是在DAGScheduler类的handleJobSubmitted方法最后,调用submitStage提交最后一个stage。遍历stage,根据isAvailable判断stage是否完成。这里只会向上找一层的shuffleMapStage。如果shuffle输出结果数量达到对应numPartitions,则表示shuffle完成,即shuffleMapStage完成。
2024-06-24 14:35:46
478
原创 spark调度体系——stage划分
rdd中的action算子,会触发job任务计算。以collect算子举例,可以看到最后是调用的DAGScheduler的submitJob方法DAGScheduler的runJob调用的是submitJob方法。submitJob是先生成新的jobId,发送JobSubmitted的消息。DAGScheduler收到JobSubmitted消息后,调用handleJobSubmitted方法。handleJobSubmitted调用createResultStage方法。
2024-06-20 18:15:21
625
原创 spark存储体系——BlockManager
BlockManager类是在driver和executor上运行,提供了存储的接口。用户只需要调用BlockManager相关的方法就可以完成存储相关的功能。
2024-06-07 20:24:47
858
原创 spark存储体系——blockManager的RPC
blockManager的RPC:● BlockManagerMasterEndpoint:rpc节点,管理所有的BlockManager● BlockManagerMasterHeartbeatEndpoint:rpc节点,处理blockManager的心跳● BlockManagerMaster:封装了主节点和心跳节点● BlockManagerSlaveEndpoint:rpc节点,用来处理block相关的消息。
2024-06-07 16:53:07
229
原创 spark存储体系——blockInfo管理(锁)
● BlockInfoManager:管理block的元数据,同时也提供了block加锁的功能。
2024-06-07 14:15:02
457
原创 spark 存储体系——磁盘
磁盘存储主要是DiskBlockManager和DiskStore两个类。比较简单。DiskBlockManager:block和磁盘文件对应关系DiskStore:将block实际写入磁盘文件。
2024-06-06 19:40:57
429
原创 spark 内存管理(源码)2
管理单个任务分配的内存。一个task对应一个TaskMemoryManager.一个TaskMemoryManager包含多个consumer.
2024-05-24 11:16:56
426
1
原创 spark 内存管理(源码)1
spark的内存管理相关的类主要是org.apache.spark.memory包下面(java和scala两部分).spark的内存管理实际上是对jvm内存的管理的一个逻辑规划,包括分配内存、释放内存等。org.apache.spark包重点介绍了相关实现类。MemConsumer是spark中不同组件和场景使用内存的客户端(TaskMemoryManager的客户端),使用它来操作内存。TaskMemoryManager是管理task的内存,它是MemoryManager的客户端。
2024-05-23 10:23:41
699
1
原创 spark worker组件分析
Worker是Spark在local-cluster部署模式和Standalone部署模式中对工作节点的资源和Executor进行管理的服务。Worker一方面向Master汇报自身所管理的资源信息,一方面接收Master的命令运行Driver或者为Application运行Executor。同一个机器上可以同时部署多个Worker服务,一个Worker也可以启动多个Executor。当Executor完成后,Worker将回收Executor使用的资源。
2024-01-05 08:49:45
718
1
原创 spark master组件分析
master只有在local-cluster和standalone部署模式下存在。Master的职责包括Worker的管理、Application的管理、Driver的管理等。Master负责对整个集群中所有资源的统一管理和分配,它接收各个Worker的注册、更新状态、心跳等消息,也接收Driver和Application的注册。
2023-12-29 18:18:16
1378
1
原创 spark rpc(组件间通信)
spark 组件间通信原本使用的是akka。后来改成了用netty实现了一个类似akka的框架。主要类在 spark-core的rpc包下面。
2023-12-24 22:58:52
1060
1
原创 spark rpc(网络通信)
TransportContext:传输上下文,包含了用于创建传输服务端(TransportServer)和传输客户端工厂(TransportClientFactory)的上下文信息,并支持使用Transport-ChannelHandler设置Netty提供的SocketChannel的Pipeline的实现。TransportConf:传输上下文的配置信息。RpcHandler:对调用传输客户端(TransportClient)的sendRPC方法发送的消息进行处理的程序。
2023-12-20 16:44:52
1298
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人