Spark Datafusion Comet 向量化Rust Native--CometShuffleExchangeExec怎么控制读写

诊断数据库ODX标准协议ISO22901定义组成部分 综上所述,简略描述了ODX数据库中UML/XML/Text/Check rules具体功能以及详细内容。 阅读详情

背景

Apache Datafusion Comet 是苹果公司开源的加速Spark运行的向量化项目。
本项目采用了 Spark插件化 + Protobuf + Arrow + DataFusion 架构形式
其中

  • Spark插件是 利用 SparkPlugin 插件,其中分为 DriverPlugin 和 ExecutorPlugin ,这两个插件在driver和 Executor启动的时候就会调用
  • Protobuf 是用来序列化 spark对应的表达式以及计划,用来传递给 native 引擎去执行,利用了 体积小,速度快的特性
  • Arrow 是用来 spark 和 native 引擎进行高效的数据交换(native执行的结果或者spark执行的数据结果),主要在JNI中利用Arrow IPC 列式存储以及零拷贝等特点进行进程间数据交换
  • DataFusion 主要是利用Rust native以及Arrow内存格式实现的向量化执行引擎,Spark中主要offload对应的算子到该引擎中去执行

本文基于 datafusion comet 截止到2026年1月13号的main分支的最新代码(对应的commit为 eef5f28a0727d9aef043fa2b87d6747ff68b827a)
主要分析Rust Native的Shuffle算子 CometShuffleExchangeExec怎么控制 Native Shuffle Writer还是Columnar Shuffle Writer

CometShuffleExchangeExec

在Spark中 ShuffleExchangeExec 这个算子起到了承上启下的作用,他控制了 Shuffle writer的写姿势,也控制了Shuffle read的读姿势,在Spark Comet中CometShuffleExchangeExec也是一样,其中最关键的在于其生成的CometShuffledBatchRDD:

  protected override def doExecuteColumnar(): RDD[ColumnarBatch] = {
    // Returns the same CometShuffledBatchRDD if this plan is used by multiple plans.
    if (cachedShuffleRDD == null) {
      cachedShuffleRDD = new CometShuffledBatchRDD(shuffleDependency, readMetrics)
    }
    cachedShuffleRDD
  }

其中 shuffleDependency是Shuffle Writer的关键,CometShuffledBatchRDD 是Shuffle Read的关键

  • ShuffleDependency

       lazy val shuffleDependency: ShuffleDependency[Int, _, _] =
      if (shuffleType == CometNativeShuffle) {
        val dep = CometShuffleExchangeExec.prepareShuffleDependency(
          inputRDD.asInstanceOf[RDD[ColumnarBatch]],
          child.output,
          outputPartitioning,
          serializer,
          metrics)
        metrics("numPartitions").set(dep.partitioner.numPartitions)
        val executionId = sparkContext.getLocalProperty(SQLExecution.EXECUTION_ID_KEY)
        SQLMetrics.postDriverMetricUpdates(
          sparkContext,
          executionId,
          metrics("numPartitions") :: Nil)
        dep
      } else if (shuffleType == CometColumnarShuffle) {
        val dep = CometShuffleExchangeExec.prepareJVMShuffleDependency(
          inputRDD.asInstanceOf[RDD[InternalRow]],
          child.output,
          outputPartitioning,
          serializer,
          metrics)
        metrics("numPartitions").set(dep.partitioner.numPartitions)
        val executionId = sparkContext.getLocalProperty(SQLExecution.EXECUTION_ID_KEY)
        SQLMetrics.postDriverMetricUpdates(
          sparkContext,
          executionId,
          metrics("numPartitions") :: Nil)
        dep
      } else {
        throw new UnsupportedOperationException(
          s"Unsupported shuffle type: ${shuffleType.getClass.getName}")
      }
    
    
    • 该ShuffleDependency 会根据之前生成的Comet计划的时候的类型(是CometNativeShuffle,还是CometColumnarShuffle)进行不同的判断
      具体可以参考Spark Datafusion Comet 向量化Rule–CometExecRule分析 规则转换分析,简单的说就是如果shuffle的子节点都是CometNative的话,就是CometNativeShuffle,
      此时生成的CometShuffleDependency就是CometNativeShuffle的,否则就是CometColumnarShuffle,且生成的CometShuffleDependency是CometColumnarShuffle,这样在注册到CometShuffleManager 的时候才会根据不同的类型返回不同的ShuffleHandle,这样在MapTask获取不同的Writer的时候才会选择CometNativeShuffleWriter还是CometUnsafeShuffleWriter
    • 规范化Shuffle writer的写的分区布局
      在此前阶段CometShuffleExchangeExec此时的outputPartitioning只是Partitioning的逻辑描述,此后,将会转换为Partitioner类型的具体的可计算的物理算子
      • 对于CometColumnarShuffle而言,会根据不同的Partitioning生成不同的Partitioner ,且传给CometShuffleDependency的RDD是带有partitionId的Product2 类型的RDD,后续会根据这个partitionId进行排序。
      • 对于CometNativeShuffle来说,和CometColumnarShuffle 一样,只不过传给CometShuffleDependency的RDD是partitionId为0的Product2 类型的RDD,后续的写数据是由Rust Native 的dataFusion组建控制,它这里会构建对应的分区算法,所以这里的分区数随便设置为0
  • CometShuffledBatchRDD
    这个是ReduceTask计算的时候用到,会从Map端拉取数据shuffleHandle选择不同的reader,当然这里的reader都是同一个CometBlockStoreShuffleReader

自定义载板RK3588HDMI输入配置完整解决方案 ✅ HDMI输入信号检测✅ 自动时序识别(支持1080p@60Hz等标准格式)✅ V4L2视频设备接口✅ 实时视频流捕获✅ H.264编码录制✅ HDCP内容保护支持问题根因识别:发现了hdmim1模块资源冲突的本质问题硬件设计理解:明确了Orange Pi 5 Plus的真实硬件设计意图功能实现:成功启用HDMI输入功能,替代了无法使用的HDMI1输出完整验证:建立了从硬件检测到视频录制的完整测试流程。 阅读详情

相关推荐

Modscan32连接上了却没数据?一文拆解所有报错(从“Device NOT CONNECTED”到“Checksum Error”)

本文深入解析Modscan32连接异常问题,从状态栏报错到数据异常,提供系统化的诊断思路和解决方案。涵盖物理层问题、配置参数错位、端口占用冲突等常见故障,帮助工程师快速定位和解决Modbus通信中的各类错误。

weixin_30384217的博客 397

Spark DPP(动态分区裁剪)导致的DataSourceScanExec NullPointerException问题分析以及解决

背景 本文基于spark 3.1.2,且运行在yarn模式下 最近在调试 spark sql的时候遇到了空指针的问题,如下: Caused by: java.lang.NullPointerException at org.apache.spark.sql.execution.DataSourceScanExec.$init$(DataSourceScanExec.scala:57) at org.apache.spark.sql.execution.FileSourceScanExec.<in

monkeyboy_tech的博客 3万+

【UE5_蓝图】实时音频采集与动态WAV文件保存实战指南

本文详细介绍了在UE5中使用蓝图实现实时音频采集与动态WAV文件保存的完整流程。从插件配置、录音框架搭建到动态文件名生成和音频参数优化,提供了实用技巧和常见问题解决方案,特别适合需要快速实现音频采集功能的开发者。

weixin_29009669的博客 407

SPARK SQL中 CTE(with表达式)会影响性能么?

背景及问题 本文基于spark 3.1.2 最近在排查spark sql问题的时候,出现了一系列的(CTE)with操作,导致该任务运行不出来,而把对应的(CTE)with 替换成了临时表以后,任务很快的就能运行出来 对应的最简化的sql如下: with temp1 as ( select null as user_id ,a.sku_id ,int(sum(`可申请数量`)) `开放申请数量` from xxx.xxx `a` where pt between '20

monkeyboy_tech的博客 7321

RT-Thread NANO V4.1.1 在Cortex-M0上移植踩坑记:解决内存分配宏导致的线程创建失败

本文详细记录了RT-Thread NANO V4.1.1在Cortex-M0平台移植过程中遇到的内存分配宏配置问题,导致线程创建失败的解决方案。通过分析内存管理算法宏定义,将RT_USING_SMALL_MEM替换为RT_USING_SMALL_MEM_AS_HEAP,成功解决了线程创建问题,为开发者提供了实用的移植经验。

weixin_29189373的博客 306

5分钟搞定kkFileView 4.4.0 Docker部署:小白也能上手的完整配置流程

本文提供了一份针对kkFileView 4.4.0版本的Docker部署完整指南。通过使用预构建的Docker镜像,即使是新手也能在5分钟内完成文件预览服务的搭建,涵盖从环境准备、镜像拉取、容器启动到服务验证的全流程,并分享了进阶配置与生产环境优化建议。

mango的博客 524

Spark task过多导致任务运行过慢甚至超时

背景以及现象 本文基于 spark 3.1.2 设置spark.driver.memory=2g 在调试spark sql任务的时候,发现有几个任务产生了40多万个Task,而且任务长期运行不出来。 分析 运行此sql,可以得到如下的dag(我们只截取产生Task多的Stage),由此可以看到是scan的文件太大了(scan了日志文件半年的数据)。 但是为什么这种情况下会导致任务运行很缓慢甚至会超时呢? 找到driver端, 用jstat -gcutil查看一下对应的gc情况(对应的内存都是调优完后的镜像

monkeyboy_tech的博客 6799

iOS安全攻防:从DarkSword漏洞利用链剖析到纵深防御实践

在移动安全领域,内存破坏漏洞(如堆溢出、释放后使用)是攻击者突破系统防线、实现远程代码执行和权限提升的核心技术原理。这些漏洞利用技术通过精心构造的攻击链,能够绕过沙箱、地址空间布局随机化等安全机制,最终威胁设备内核安全,其技术价值在于揭示了系统安全架构的潜在薄弱环节。在iOS应用开发与系统防护中,理解此类攻击链对于构建有效的纵深防御体系至关重要。应用场景涵盖从安全编码、网络通信加固到运行时应用程序自保护等多个层面。本文以DarkSword工具包为例,深入拆解其利用链,并分享如何通过内存安全实践、代码签名强化

weixin_30357231的博客 479

【k8s系列5】KubernetesClientException: too old resource version 原因分析

背景 公司目前在基于k8s做调度(基于io.fabric8:kubernetes-client:4.2.0),在运行的过程中,遇到了如下问题: OkHttp WebSocket https://10.25.61.82:6443/...] DEBUG io.fabric8.kubernetes.client.dsl.internal.WatchConnectionManager - WebSocket close received. code: 1000, reason: [OkHttp WebSocket

monkeyboy_tech的博客 6040

5分钟搞定Unity+Visual Studio开发环境配置(含C#游戏开发工作负载)

本文提供了一份详细的Unity与Visual Studio开发环境配置指南,帮助开发者在5分钟内完成C#游戏开发工作负载的设置。从Unity Hub安装到Visual Studio关键组件选择,再到常见问题排查,全面覆盖环境搭建的各个环节,显著提升游戏开发效率。

weixin_29014237的博客 248

记录:解决Ubuntu20.04安装ros报错E: Unable to locate package ros-kinetic-desktop-full【亲测有效】

报错:E: Unable to locate package ros-kinetic-desktop-full.尝试好久一直都无法下载,最后得知真相的我眼泪哗哗的直流。

**My Coding Family** 6万+

【mlflow系列1】mlflow 的搭建使用

背景 mlflow是Databrick开源的机器学习管理平台,它很好的解藕了算法训练和算法模型服务,使得算法工程师专注于模型的训练,而不需要过多的关注于服务的, 而且在我们公司已经有十多个服务稳定运行了两年多。 搭建 mlflow的搭建主要是mlflow tracking server的搭建,tracking server主要是用于模型的元数据以及模型的数据存储 我们这次以minio作为模型数据的存储后台,mysql作为模型元数据的存储,因为这种模式能满足线上的需求,不仅仅是用于测试 minio的搭建

monkeyboy_tech的博客 5183

【RT-DETR涨点改进】全网独家创新、细节涨点改进篇 | ICML 2024 | RT-DETR引入ICB交互式卷积模块和ASB自适应频谱模块,助力目标检测、异常检测有效涨点、含多种创新改进点

RT-DETR目标检测模型通过引入ICB和ASB模块实现性能提升。ICB模块采用多尺度卷积交互,有效捕获局部和长程依赖特征;ASB模块通过自适应频域滤波优化特征表示,降低噪声干扰。两者结合使模型在复杂场景中表现更优,显著提升检测精度和鲁棒性。文章详细介绍了模块原理、代码实现及配置方法,并提供了8种改进版本的YAML配置文件,适用于不同网络结构。这些创新改进为RT-DETR模型提供了高效涨点方案,特别适合复杂背景和高噪声环境下的目标检测任务。

Ai缝合怪、助力小伙伴高效发论文 211

【spark系列12】spark remote shuffle service(RSS)杂谈

背景 对于spark shuffle service(以下简称RSS),在社区其实早就有探讨SPARK-25299,只不过一直没有达成一致,且目前的内置的shuffle service 也能满足大部分的场景,也就被搁置了,但是由于kubernetes的越来越火热,spark 社区也慢慢的集成了spark on k8s,当然k8s社区也集成了spark,具体区别见spark on k8s 与 spark on k8s operator的对比. 但是就目前的spark on k8s来说shuffle还是存在问题

monkeyboy_tech的博客 4859

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

FLINK JDBC SQL Connector遇到的类型转换问题

背景 Flink 1.3 最近在写Flink Sql的时候,遇到了java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long 问题 分析 直接上报错的sql,如下: CREATE TABLE `xxx` ( `merchantId` BIGINT, `userId` BIGINT, `status` BIGINT ) WITH ( ); 具体的问题堆栈如下: java.lang.C

monkeyboy_tech的博客 4840

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

SPARK的计算向量化-已有的向量化项目

背景 在SPARK的计算向量化-spark本身的向量化中,我们提到spark是利用代码生成(生成for循环),从而JIT进行向量化。这是有局限的,所以大部分公司都会采用通过其他方式来进行向量化计算。 我们列举几种已知的应用到spark计算引擎的向量化技术。 Velox Meta(也就是Facebook)开源的一个C++实现的SQL执行引擎,输入逻辑执行计划,利用SIMD指令实现向量化操作,输出结果; 结合Apache Arrow作数据交换,可以实现Spark的计算向量化。 项目见facebookincuba

monkeyboy_tech的博客 4315

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

yarn和k8s(kubernetes)混合部署初步方案(利用cgroup资源限制)

版本 yarn 2.6.0 k8s v1.15.2 背景 随着k8s的越来越火热以及k8s的可扩展以及自修复优势,k8s势必是互联网的优势,但是很大一部分公司的资源管理工具依旧是yarn,而且yarn和k8s也必然并行很久一段时间, 但是由于yarn的隔离型相对于k8s来说还是很弱的,好在yarn 2.6.0版本也集成了LinuxContainerExecutor(默认是DefaultContainerExecutor),也就是说yarn在好长一段时间是不支持cpu限制的,LinuxContainerExe

monkeyboy_tech的博客 4159

SPARK Expand问题的解决(由count distinct、group sets、cube、rollup引起的)

背景 本文基于spark 3.1.2 我们知道spark对于count(distinct)/group sets 以及cube、rollup的处理都是采用转换为Expand的方法处理, 这样做的优点就是在数据量小的情况下,能有以空间换时间,从而达到加速的目的。 但是弊端也是很明显,就是在数据量较大的情况下,而且expand的倍数达到上百倍或者千倍的时候,这任务运行的时间很长(这在数分中是非常常见的)。 分析 先来看一组图: 是不是很刺激,数据从2,635,978,109直接扩张到了168,702,598,

monkeyboy_tech的博客 4010

SPARK 是怎么清除Shuffle中间结果数据的

背景 本文基于 SPARK 3.2.1 我们知道在Spark中,shuffle的数据会存在ESS或者BlockManager中的,但是spark什么时候会删除shuffle的中间结果数据呢?这篇文章我们来分析一下 分析 我们知道spark肯定会删除shuffle结果数据,要不然长期以往,磁盘肯定会爆掉。 其中清除的组件就是ContextCleaner,代码如下: private[spark] class ContextCleaner( sc: SparkContext, shuffleDri

monkeyboy_tech的博客 3839

Spark做TPC-DS性能测试

最近由于在做上云的工作,并且公司离线部分引擎是Spark,所以做了一次基于TPC-DS性能比对测试。生产了大约200GB的数据。

monkeyboy_tech的博客 3701

Spark中的WholeStageCodegenExec(全代码生成)

背景 在之前的文章中Spark DPP(动态分区裁剪)导致的DataSourceScanExec NullPointerException问题分析以及解决,我们直接跳过了动态代码生成失败这版本一步部分,这次我们来分析一下,SQL还是在以上提到的文章中。 分析 运行完该sql,我们可以看到如下的物理计划: 我们看到FilterExec和ColumnarRoRowExec并没有在一个WholeStageCodegen 中, 这是为什么呢? 这是因为exists方法是继承自CodegenFallback Tr

monkeyboy_tech的博客 3466

Spark CTAS union all (union all的个数很多)导致超过spark.driver.maxResultSize配置(1G)

spark CTAS nuion all (union all的个数很多)导致超过spark.driver.maxResultSize配置(2G)

monkeyboy_tech的博客 3041

深入理解SPARK SQL 中HashAggregateExec和ObjectHashAggregateExec以及UnsafeRow

感悟和理解 翻译这篇文章是为了更好的理解ObjectHashAggregateExec和UnsafeRow,关于UnsafeRow的文章,可以参考Spark源码修改系列 - UnsafeRow内存布局和代码优化。 其实明显,UnsafeRow是模拟了offheap的分配方式而在堆上进行的操作,它并没有脱离了jvm,而是使用了Java unsafe API(Java提供的底层非安全操作接口),允许用户像操作C++指针一样来申请和访问内存地址,JVM也不会对这部分非安全数据进行额外的类型检查和垃圾回收。 事实上

monkeyboy_tech的博客 2960

Spark Media 问题清单

本项目基于 libdatachannel 构建 C++ WebRTC SFU 服务器,遵循 IETF WHIP/WHEP 标准信令,采用帧级转发实现低延迟多人互动。

qq_43538607的博客 376

【计算机毕业设计】基于Hadoop的公共交通运营数据分析与可视化系统 大数据毕业设计选题 Hadoop Spark Numpy Pandas Echarts

基于Hadoop生态的公共交通运营数据分析与可视化系统,利用Spark处理海量公交数据,结合K-Means聚类、Pandas/Numpy分析,实现线路、站点、区段等多维度统计。通过Django提供接口,Vue+ElementUI搭建前端,Echarts实现城市规模、线路特征、站点网络等动态可视化看板,构建从数据采集到可视化的完整闭环,助力智慧交通决策。支持机器学习模型定制,文末可获取源码。

weixin_19164791635 760

最新大数据毕业设计选题推荐-基于大数据的电影评分与热度数据可视化分析-大数据-Spark-Hadoop-Bigdata

本文介绍《基于大数据的电影评分与热度数据可视化分析系统》,采用Hadoop+Spark构建大数据处理链路,结合Django/Spring Boot后端与Vue+ECharts前端,实现电影评分、热度数据的采集、清洗、分析与可视化。系统支持高分影片管理、评分分布、热度传播趋势等多维度展示,提供可运行、可扩展的毕业设计参考,涵盖完整技术栈与源码,助力学生掌握大数据项目全流程开发。

IT研究室的博客 264
上一篇: Spark Datafusion Comet 向量化Rust Native--Native算子(CometNativeExec)怎么串联执行
下一篇: opencode及oh my opencode安装
鸿乃江边鸟
博客等级 码龄6年 3746粉丝 235原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值