Spark中python和jvm的通信杂谈--ArrowConverter

【PySpark原理详解】【PySpark】 总体而言,PySpark是借助Py4j实现Python调用Java,来驱动Spark应用程序,本质上主要还是JVM runtime,Java到Python的结果返回是通过本地Socket完成。 阅读详情

背景

要提起ArrowConverters,就得说起Arrow这个项目,该项目的初衷是加速进程间的数据交换,从目前的社区发展以及它的周边来看,其实是一个很不错的项目。
那为什么Spark要引入Arrow呢?其实还得从Pyspark中python和jvm的交互方式上说起,目前pyspark采用的py4j与spark jvm进行交互,而数据的交换采用的是jvm和python两个进程间的数据交换(感兴趣的同学可以参考PySpark架构),这个时候引进Arrow恰到好处。

闲说杂谈

spark具体采用的是Arrow IPC,
而IPC中用到了flatbuffers这种高效获取序列化数据的组件,再加上IPC采用的是Java NIO的ByteBuffer零拷贝的方式以及RecordBatch列批的方式,大大提升了进程间的数据交换效率。关于NIO的零拷贝参考NIO效率高的原理之零拷贝与直接内存映射

具体细节

直接到ArrowConverters的类中:
主要看两个方法:toBatchIterator和fromBatchIterator

  • ArrowConverters.toBatchIterator
  private[sql] def toBatchIterator(
      rowIter: Iterator[InternalRow],
      schema: StructType,
      maxRecordsPerBatch: Long,
      timeZoneId: String,
      context: TaskContext): ArrowBatchIterator = {
    new ArrowBatchIterator(
      rowIter, schema, maxRecordsPerBatch, timeZoneId, context)
  }

这个主要是把spark内部的InternalRow转换为ArrowRecordBatches,方法直接就是返回ArrowBatchIterator类型(Iterator[Array[Byte]]类型)的迭代器:

  • ArrowConverters.fromBatchIterator
  private[sql] def fromBatchIterator(
      arrowBatchIter: Iterator[Array[Byte]],
      schema: StructType,
      timeZoneId: String,
      context: TaskContext): Iterator[InternalRow] = new InternalRowIteratorWithoutSchema(
    arrowBatchIter, schema, timeZoneId, context
  )

这个主要是把序列化的ArrowRecordBatche转换为Spark内部的InternalRow,这里也是直接返回了InternalRowIteratorWithoutSchema类型的迭代器,这里就涉及到了内存的零拷贝,具体的方法如下:

    override def nextBatch(): (Iterator[InternalRow], StructType) = {
      val arrowSchema = ArrowUtils.toArrowSchema(schema, timeZoneId)
      val root = VectorSchemaRoot.create(arrowSchema, allocator)
      resources.append(root)
      val arrowRecordBatch = ArrowConverters.loadBatch(arrowBatchIter.next(), allocator)
      val vectorLoader = new VectorLoader(root)
      vectorLoader.load(arrowRecordBatch)
      arrowRecordBatch.close()
      (vectorSchemaRootToIter(root), schema)
    }

其中涉及的调用链如下:

ArrowConverters.loadBatch
   ||
   \/
MessageSerializer.deserializeRecordBatch
   ||
   \/
readMessageBody
  ||
  \/
ReadChannel.readFully
  ||
  \/
buffer.nioBuffer
  ||
  \/
getDirectBuffer

最后的getDirectBuffer直接返回的是DirectByteBuffer直接内存,这样可以避免了JVM内存到native内存的数据拷贝,尤其是在大数据场景下,提升的效率更加明显,且减少了用户态和内核态的切换次数。

  • 怎么运用到python与spark jvm的交互中
    调用网上的Pyspark的架构图
    在这里插入图片描述

    参考具体conversion.py中部分代码如下:

    jrdd = self._sc._serialize_to_jvm(arrow_data, ser, reader_func, create_RDD_server)
    jdf = self._jvm.PythonSQLUtils.toDataFrame(jrdd, schema.json(), jsqlContext)
    

    主要在self._jvm.PythonSQLUtils.toDataFrame这个方法中,python调用spark中方法,把序列化的*Iterator[Array[Byte]]*传给jvm执行,具体的细节,读者可以自行参考源代码.

其他

在最新发布的Spark-3.4.0中有一项SPIP,也是采用了Arrow IPC作为数据传输的格式。
当然Arrow Flight SQL也将是一个很好的技术点。

Spark 之 ArrowColumnVector 构造函数 public ArrowColumnVector(ValueVector vector) { this(ArrowUtils.fromArrowField(vector.getField())); initAccessor(vector); } ArrowColumnVector(DataType type) { super(type); } void initAccessor(ValueVector vector) { if (vector inst 阅读详情

相关推荐

[Spark版本更新]--2.3.0发行说明

自从2017年12月1日发布spark-2.2.1以来,已有3个月时间。2018年2月28日,spark官方发布了一个大版本Spark-2.3.0,解决了1399个大大小小的问题。一、DataBricks做了相关说明今天,我们很高兴地宣布Databricks上的Apache Spark 2.3.0作为其Databricks Runtime 4.0的一部分。我们要感谢Apache Spark社区为S...

欢迎来到我的博客,一起探索代码里的世界! 1万+

PySpark 通过Arrow加速

前言 PySpark是Spark 实现 Unify BigData && Machine Learning目标的基石之一。通过PySpark,我们可以用Python在一个脚本里完成数据加载,处理,训练,预测等完整Pipeline,加上DB良好的notebook的支持,数据科学家们会觉得非常开心。当然缺点也是有的,就是带来了比较大的性能损耗。...

allwefantasy的专栏 938

Plant Simulation数字孪生实战:从零搭建生产车间模型(附SimTalk脚本示例)

本文详细介绍了如何使用Plant Simulation从零构建生产车间数字孪生模型,包括基础建模、SimTalk脚本编程、参数化设计和高级应用。通过实战示例展示动态逻辑控制、设备故障模拟等关键技术,帮助工程师快速掌握数字孪生技术在制造业中的应用。

weixin_42527160的博客 359

调用PySpark定义Spark对象

在本地环境中 spark = SparkSession.builder \ .master('local[*]') \ .appName('cons_test') \ .config("spark.jars", "E:\postgresql-42.2.18.jar") \ .getOrCreate() 在服务器中 def def_spark(app_name='common'): from pyspark.sql import.

cymx66688的博客 343

银行会计第2课:交易和核算分离的思想

核算作为会计的基础,将交易转化为可量化的信息,而会计则通过整合核算结果,实现对经济活动的全面把控。- 本质:指企业或主体之间发生的、能引起经济利益变动的具体事项,比如采购商品、销售货物、支付工资等,是客观发生的经济事实。可售产品(业务视角的核算对象) + 属性条件(核算的分类,限制等) = 核算类型(会计视角,含有科目分类内容)- 核算:会计人员根据采购发票、入库单等,将这笔交易记为“借:原材料,贷:银行存款”(对事实的会计处理)。- 特点:是核算的源头,不涉及会计处理,仅代表经济行为的发生。

ademen的博客 497

交叉验证选型指南:k折、留一法、时序与分层CV实战决策

交叉验证是评估机器学习模型泛化能力的基础技术,其核心在于通过系统性数据重划分,缓解有限样本对真实分布估计的偏差。原理上,它通过控制训练-验证数据的独立性与代表性,诊断过拟合风险并提升性能指标的稳定性。技术价值体现在避免单次切分导致的结果偶然性、数据利用低效及验证集污染等问题。典型应用场景涵盖分类任务中的类别不平衡处理、时间序列预测的因果约束、用户行为建模中的数据泄露防控等。本文聚焦k折交叉验证、留一法、时间序列交叉验证与分层抽样等主流方法的适用边界与工程落地要点,结合过拟合诊断和泛化能力评估两大热词,提供可

dienangpiao2051的博客 476

突破Spark性能瓶颈:Apache Arrow零拷贝数据传输实战指南

你是否还在忍受Spark与Python之间数据传输的漫长等待?当使用`toPandas()`或`pandas_udf`时,数据序列化/反序列化的开销是否让你的大数据分析 pipeline 举步维艰?本文将揭示如何通过Apache Arrow(一种跨语言的内存数据交换格式)实现Spark与Python之间的零拷贝数据传输,将数据处理速度提升5-10倍,同时降低内存占用。 读完本文你将获得: - 理...

gitblog_00618的博客 867

Ubuntu18.04 SoftRoCE安装教程

目标:创建两台Ubuntu18.04虚拟机,安装SoftRoCE环境,一台作为Server,一台作为Client,模拟RDMA通信环境,熟悉RDMA的通信方式。

GGGYL111的博客 1548

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

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

monkeyboy_tech的博客 4315

【ESP32CAM+Android+OpenCV】自定义目标数据集、训练自己的OpenCV模型部署到手机APP并对ESP32CAM无线图传显示并实时检测识别目标_资料编号30

本项目实现自定义目标数据集(想检测什么就检测什么,按照本文教程自己来更换目标)、训练自己的OpenCV模型实时检测识别(pycharm工程)。手机APP(Android studio工程)部署OpenCV模型实现对ESP32CAM(arduino工程)无线WIFI图传过来的图像实时检测识别。 本文以火焰检测识别为例进行演示,通过该过程,结合本文可自定义尝试更换为其它目标的检测,例如更换为车辆、车牌、手势、人脸面部活动、人脸表情、火焰烟雾、行人、口罩、行为、水果、植物、农作物、建筑、损伤等等部署进行检测。

嵌入式阿齐Archie 3478

【人工智能】全面盘点国内AI九大模型:各擅胜场的智能先锋(豆包、文心一言、讯飞星火、通义千问、Kimi、智谱清言、腾讯元宝、秘塔、天工AI)

追求性价比与全能:选豆包,适合个人与中小企业日常使用;侧重中文创作与理解:选文心一言,文学与商业文案创作首选;需要专业语音交互:选讯飞星火,智能客服、车载场景必备;看重生态与多场景:选通义千问,适配电商、办公等企业需求;处理超长文本任务:选Kimi,文档分析、学术研究的利器;专注深度推理创作:选智谱清言,学术与创意写作的伙伴;依赖腾讯生态协同:选腾讯元宝,日常轻量需求的便捷之选;深耕法律学术领域:选秘塔,专业文本处理的权威工具;布局前沿技术体验:选天工AI,享受接近国际顶尖的智能服务。

奶爸的编程之路,也就一周冷个三天 1121

Spark译文(二)

PySpark Usage Guide for Pandas with Apache Arrow(使用Apache Arrow的Pandas PySpark使用指南) Apache Arrow in Spark Ensure PyArrow Installed Enabling for Conversion to/from Pandas Pandas UDFs (...

697

博途PLC模糊PID控制(附SCL完整源代码)

操作人员根据对象的当前状态和以往的控制经验,用手动控制的方法给出适当的控制量,对被控对象进行控制。用电脑模拟操作人员手动控制的经验,对被控对象进行控制。用模糊数学的知识模仿人脑的思维方式,对模糊现象进行识别和判决,给出精确的控制量,对被控对象进行控制。与经典控制理论和现代控制理论相比,模糊控制的特点是不需要建立对象的精确模型。根据操作人员手动控制的经验,总结的完整控制规则,在根据系统当前的运行状态,经过模糊推理,模糊判决等运算,求出控制量,实现对被控对象的控制。......

RXXW_Dor的博客 8961

Spark简介

1. 简介     Apache Spark是自由开源的分布式内存计算平台,目前已经成为 Apache 基金会的顶级项目。该平台可以快速、多计算范式、可靠地处理海量数据,除了基本批处理型外,还支持流计算、图计算、SQL分析和机器学习。

MyArrow的专栏 1050

亿图机床采集数据

这个数控系统的英文名是HUST,在台湾知名度还可以,但大陆这边我做这么多年项目也只接触过屈指可数的几次,可见市场占有率并不大,联网采集不复杂。

若云流风的专栏 2490

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

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

Apache Spark+PyTorch 案例实战

Apache Spark+PyTorch 案例实战 随着数据量和复杂性的不断增长,深度学习是提供大数据预测分析解决方案的理想方法,需要增加计算处理能力和更先进的图形处理器。通过深度学习,能够利用非结构化数据(例如图像、文本和语音),应用到图像识别、自动翻译、自然语言处理等领域。图像分类:识别和分类图像,便于排序和更准确的搜索。目标检测:快速的目标检测使自动驾驶汽车和人脸识别成为现实。自然语言处理:准确理解口语,为语音到文本和智能家居提供动力。 深度学习面临的挑战:虽然大数据和人工智能提供了大量的潜力,但从.

大模型与Agent智能体 9497

蓝牙模块HM-10手册

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

Apache Arrow与Spark集成:大数据处理效率提升终极指南

Apache Arrow作为**多语言内存数据交换标准**,与Spark的集成能够显著提升大数据处理效率。这种强大的组合通过**零拷贝数据交换**机制,让数据在不同系统和语言间无缝流动,为数据工程师和分析师带来革命性的性能优化方案。 Apache Arrow项目提供了跨语言的内存数据格式,支持C++、Java、Python、Go等多种编程语言,而Spark作为最流行的大数据处理框架,二者的结合创

gitblog_00615的博客 680

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

面向大数据的分布式计算框架:Apache Arrow的高性能数据存储

1.背景介绍 大数据时代,数据量越来越大,传统的数据处理方法已经不能满足需求。分布式计算框架成为了解决大数据问题的重要手段。Apache Arrow 是一种高性能的数据存储和处理框架,专为分布式计算环境设计。它通过提供一种高效的内存布局和数据结构,以及一种跨语言的数据交换格式,来帮助开发者更高效地处理大数据。 本文将从以下几个方面进行阐述: 背景介绍 核心概念与联系 核心算法原理和具体操作...

AI天才研究院 2209

Arrow之 RecordBatch

目录RecordBatchRecordBatch::MakeSimpleRecordBatch RecordBatch arrow/cpp/src/arrow/record_batch.h /// \class RecordBatch /// \brief Collection of equal-length arrays matching a particular Schema /// /// A record batch is table-like data structure that is sema

zhixingheyi_tian的博客 1189

Apache Arrow-RS 开源项目指南

Apache Arrow-RS 开源项目指南 一、项目介绍 Apache Arrow 是一个跨平台的数据交换层,用于加速数据密集型应用在云环境中的运行效率。Arrow 提供了零拷贝读写二进制序列化机制以及丰富的列式存储库支持,从而使得数据处理和移动变得更为高效。 Apache Arrow-RS 是 Arrow 在 Rust 编程语言上的实现,利用 Rust 的内存安全特性,为高性能计算提供了坚实的...

gitblog_01077的博客 1209

Apache Arrow 的列式内存格式

Apache Arrow 的列式存储格式是一种内存数据组织标准,它通过物理布局、Array(数组)、Schema(模式)和 RecordBatch(记录批次)等,优化了大数据的存储与处理。这种格式以列而非行来存储数据,从而提高了数据访问效率,支持跨平台和多种编程语言,且无需序列化开销,适应现代硬件架构,特别适合于高效的数据分析操作。

王清欢的博客 8520

PySpark的Pandas API on Spark内部使用PyArrow实现高性能

PyArrow是Apache Arrow的Python接口,它是一个跨语言的列式内存格式,主要用于高效的数据交换。Arrow设计的目的是消除不同数据处理工具之间的内存复制和格式转换,使得数据可以在不同的系统和工具之间高效传递。它可以在内存中表示数据,并能够高效地序列化和反序列化。PySpark的Pandas API on Spark利用PyArrow的高效内存格式和数据传输特性,实现了Pandas风格的数据操作,同时在Spark的分布式环境下提供了高性能的数据处理。

weixin_49526058的博客 740

PySpark源码分析之Driver端基于Py4j的通信详解

文章目录概述服务端启动Python客户端编程示例 概述 接上文 PySpark源码分析之AM端运行流程(Driver) 的最后部分可知,PySpark是通过Py4j来实现与Scala端JVM通信交互的(注:Py4j只用于Driver端Python调用JVM中方法;Executor端是直接通过socket通信的。),PySpark主要提供一层Python API的封装。其过程主要是JVM会开启一个Socket端口提供RPC服务,Python需要调用Spark API时,它会作为客户端将调用指令序列化成字节流发

Haiwi-Song 2251

数据存储格式——Arrow

Apache Arrow 是 Apache 基金会全新孵化的一个顶级项目。它设计的目的在于作为一个跨平台的数据层,来加快大数据分析项目的运行速度。

weixin_54379099的博客 3829

Apache Spark 2.3 重要特性介绍

本文翻译自:https://databricks.com/blog/2018/02/28/introducing-apache-spark-2-3.html为了继续实现 Spark 更快,更轻松,更智能的目标,Spark 2.3 在许多模块都做了重要的更新,比如 Structured Streaming 引入了低延迟的连续处理(continuous processing);支持 stream-to

Hadoop技术博文 4410

SQL中JOIN和UNION区别、用法及示例

1.JOIN和UNION区别join 是两张表做交连后里面条件相同的部分记录产生一个记录集,union是产生的两个记录集(字段要一样的)并在一起,成为一个新的记录集 。JOIN用于按照ON条件联接两个表,主要有四种:INNER JOIN:内部联接两个表中的记录,仅当至少有一个同属于两表的行符合联接条件时,内联接才返回行。我理解的是只要记录不符合ON条件,就不会显示在结果集内。L

deepwishly专栏 2万+
上一篇: Apache Hudi初探(一)(与flink的结合)
下一篇: Flink中KeyedStateStore实现--怎么做到一个Key对应一个State
鸿乃江边鸟
博客等级 码龄6年 3746粉丝 235原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值