自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(49)
  • 收藏
  • 关注

原创 DataX(4)——加载插件

加载外部插件,为了避免依赖冲突,需要自定义类加载器,然后用自定义类加载器创建reader类,最后类加载器要换回原本的。首先获取pluginConf,pluginConf是在一开始生成configuration就已经注册了。内容就是插件下面的plugin.json文件内容。plugin.json(pluginConf) 中最主要的是name和class,name跟job配置中一致,class是对应的要加载的类的全限定路径名。

2025-07-04 16:01:01 235

原创 Spark 写入hive表解析

摘要:FileOutputCommitter在Spark中提供v1和v2两种文件提交算法。v1版本采用两阶段提交(先写临时目录再移动),存在单线程瓶颈;v2版本直接写结果目录,效率更高但存在数据可见性问题。与Hive集成时,通过临时目录机制保证原子性,Hive采用多线程移动文件提升性能。建议生产环境使用v2算法,其整体流程更高效,特别是在Hive的多线程支持下能有效解决原子性问题,同时保持高性能。

2025-06-27 17:48:45 832

原创 DataX(3)—— 核心流程源码

确保所有任务的最终状态都汇报了。

2025-06-25 17:58:20 777

原创 DataX(2)—— 核心流程

DataX的核心执行流程:

2025-06-23 17:45:47 233

原创 DataX(1)——部署

ps:为了打包速度,可以只选择需要的writer和reader打包。

2025-06-23 17:44:50 289

原创 Flink Credit-based机制解析

tcp-based和credit-based介绍可以看:flink1.5之前是基本tcp实现的反压。同一个TaskManager的任务共享TCP缓冲区。一个任务产生背压,会影响TaskManager内的其他任务接受消息。

2025-03-28 15:39:24 557

原创 Flink TaskManager之间数据传输(NetworkManager)

NetworkManager可以看到只存在于TaskManager中,用于TaskManager之间的数据传输。是基于netty实现的。

2025-03-28 15:38:44 919

原创 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 1306

原创 flink JobGraph解析

JobGraph主要是StreamGraph经过优化后生成的,主要优化的就是对符合条件节点进行chain,这样可以减少数据流动的序列化和传输。JobGraph主要由三部分组成。

2025-02-10 17:09:39 1317

原创 flink StreamGraph解析

Flink程序有三部分operation组成,分别是源source、转换transformation、目的地sink。这三部分构成DAG。DAG首先生成的是StreamGraph。用户代码在添加operation的时候会在env中缓存(变量transformations),在env.execute()执行的时候才会生成对应StreamGraph。

2025-01-27 17:39:07 1415 2

原创 flink state源码解析

其实原理很简单:StateMap 和 Snapshot 共享了一大堆数据,既然 Snapshot 要求数据不能修改,那么 StateMap 在修改某条数据时可以将这条数据复制一份产生一个副本,所以 Snapshot 和 StateMap 就会各自拥有自己的副本,所以 StateMap 对数据的修改就不会影响 Snapshot 的快照。:并发度在改变的时候,会将并发上的每个List都取出,然后把这些List合并到一个新的List,然后根据元素的个数在均匀分配给新的Task;然后不做划分,直接交给用户;

2025-01-06 17:23:35 921

原创 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 649

原创 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 1183

原创 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 1373

原创 CAP与BASE分布式理论

强一致性:写入数据的时候,要不全部节点都写入成功,要不都写入失败(类似数据库的事务性)。读取数据的时候,从哪个节点上都读取到最新的值。即所有节点时刻保持一样的值。可用性:系统对外提供的服务一直处于可用的状态。用户每一次请求都能返回正确的结果。分区容错性:集群的节点之间会发生通信,由于网络原因,集群通信出现问题。此时系统仍然能对外提供服务一个分布式系统无法同时满足这三个条件,只能满足两个。P是必须的,一般为CP和AP。

2024-11-15 18:06:01 799

原创 Sparksql 动态shuffle partition

spark 动态shuffle 合并shuffle

2024-10-23 20:32:17 1614

原创 spark读取parquet文件

spark读取parquet文件,拆分文件生成task数量

2024-10-22 16:26:48 1002

原创 SparkSQL——OptimizedLogicalPlan生成

SQL示例:SELECTnameFROMstudentWHEREage>18方法入口。

2024-08-09 17:52:31 287

原创 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 399

原创 SparkSQL——UnresolvedPlan生成

fromClause下面的relation节点下面的relationPrimary节点调用plan方法,上面也说到plan方法,是调用visit的对应的方法。queryTerm节点的accept方法对应就是QueryTermDefaultContext的accept方法,就是visitor的visitQueryTermDefault方法。visitQueryTermDefault的子节点是queryPrimary,所以是调用对应实现类QueryPrimaryDefaultContext的accept方法。

2024-08-09 11:45:39 899

原创 SparSQL——基本类和常见概念

TreeNode一直在内存里维护,不会dump到磁盘以文件形式存储,且无论在映射逻辑执行计划阶段,还是优化逻辑执行计划阶段,树的修改都是以替换已有节点的方式进行的。在Catalyst中,TreeNode 类是 SparkSQL 中所有树结构的基类,定义了 系列通用的集合操作和树遍历操作接口。eval方法是调用child的eval方法(形成循环调用,直到叶子节点),根据返回值调用nullSafeEval方法。Literal是LeafExpression的一个实现类,是用来包装常量的。叶子节点,没有子节点。

2024-08-05 10:47:22 881

原创 spark 3.0.0源码环境搭建

Spark版本:3.0.0java版本:1.8scala版本:2.12.19Maven版本:3.8.1。

2024-07-29 15:11:10 633

原创 spark 广播变量broadcast

broadcast使用如下图,可以看到创建broadcast是val barr1 = sc.broadcast(arr1),使用broadcast是barr1.value创建broadcast是使用的broadcastManager。

2024-07-22 15:29:20 1168 1

原创 spark 动态资源分配dynamicAllocation

动态资源分配,主要是spark在运行中可以相对合理的分配资源。

2024-07-19 17:32:19 2287

原创 spark 事件总线listenerBus

图片来源:https://blog.csdn.net/sinat_26781639/article/details/105012302。

2024-07-17 17:59:32 776

原创 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 1467 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 1001

原创 spark shuffle写操作——SortShuffleWriter

写入的简单流程:1.生成ExternalSorter对象2.将消息都是插入ExternalSorter对象中3.获取到mapOutputWriter,将中间产生的临时文件合并到一个临时文件4.生成最后的data文件和index文件可以看到写入的重点类是ExternalSorter对象。

2024-07-08 11:50:48 1060

原创 spark shuffle写操作——BypassMergeSortShuffleWriter

每一个分区都生成一个临时文件,创建DiskBlockObjectWriter对象,放入partitionWriters。

2024-07-05 15:44:09 553

原创 spark shuffle——shuffle管理

shuffle系统的入口。ShuffleManager在driver和executor中的sparkEnv中创建。在driver中注册shuffle,在executor中读取和写入数据。registerShuffle:注册shuffle,返回shuffleHandleunregisterShuffle:移除shuffleshuffleBlockResolver:获取shuffleBlockResolver,用于处理shuffle和block之间的关系。

2024-07-05 11:09:48 1158

原创 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 377

原创 spark调度体系——stage/task提交

stage提交入口是在DAGScheduler类的handleJobSubmitted方法最后,调用submitStage提交最后一个stage。遍历stage,根据isAvailable判断stage是否完成。这里只会向上找一层的shuffleMapStage。如果shuffle输出结果数量达到对应numPartitions,则表示shuffle完成,即shuffleMapStage完成。

2024-06-24 14:35:46 498

原创 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 649

原创 spark on yarn 作业提交流程源码

借图。

2024-06-17 16:40:04 559

原创 spark存储体系——BlockManager

BlockManager类是在driver和executor上运行,提供了存储的接口。用户只需要调用BlockManager相关的方法就可以完成存储相关的功能。

2024-06-07 20:24:47 887

原创 spark存储体系——blockManager的RPC

blockManager的RPC:● BlockManagerMasterEndpoint:rpc节点,管理所有的BlockManager● BlockManagerMasterHeartbeatEndpoint:rpc节点,处理blockManager的心跳● BlockManagerMaster:封装了主节点和心跳节点● BlockManagerSlaveEndpoint:rpc节点,用来处理block相关的消息。

2024-06-07 16:53:07 252

原创 spark存储体系——blockInfo管理(锁)

● BlockInfoManager:管理block的元数据,同时也提供了block加锁的功能。

2024-06-07 14:15:02 468

原创 spark 存储体系——磁盘

磁盘存储主要是DiskBlockManager和DiskStore两个类。比较简单。DiskBlockManager:block和磁盘文件对应关系DiskStore:将block实际写入磁盘文件。

2024-06-06 19:40:57 442

原创 spark 存储体系——内存

spark内存存储 MemoryStore

2024-05-24 18:17:43 484 1

原创 spark 内存管理(源码)2

管理单个任务分配的内存。一个task对应一个TaskMemoryManager.一个TaskMemoryManager包含多个consumer.

2024-05-24 11:16:56 449 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除