【Spark精讲】一文搞懂Spark钨丝Tungsten

news2025/3/1 4:27:40

Tungsten 内存管理机制

催生 Tungsten 内存管理优化的原因主要来自两个方面 。

• Java对象占用内存空间大。 相对于 C/C++等更加底层的程序语言, Java对象的存储密度相对偏低。 例如,即使最简单的 “abed” 字符串,用Java的UTF-16编码的情况下也需要8 字节进行存储, 加上Java内存布局的其他信息(如header等),共需要48字节的空间来 存储“abed”字符串 。

• JVM垃圾回收(GarbageCollection)的开销大。 在海量数据场景下,数据分析通常会涉及转换、 清洗、处理等步骤,这个过程伴随着海量的 Java对象创建与回收, JVM垃圾回收的执行效率对应用性能有着很大影响。 JVM 调优能够在一定程度上提升性能,但是过程非常烦琐,且需要用户对应用、分布式计算框架和 JVM 都有深入的了解 。

Tungsten 优化中堆外内存的引入有效解决了上述问题 。

Tungsten 内存管理机制较核心部分的实现在 TaskMemoryManager类中, 如下图所示。 可 以看到, Tungsten 按照内存页表 (pageTable)的方式来管理 内存,pageTable 本质上是一个 MemoryBlock 的数组 ,这些内存会被 Task 内部的内存消费者( MemoryConsumer)使用 。

每个Task的内存空间被划分为多个内存页(page) ,每个内存页本质上都是一个内存块 (MemoryBlock) 。 为统一堆内和堆外的内存访问方式, TaskMemoryManager 引入了类似操作系统中虚拟内存逻辑地址的概念,并将逻辑地址映射到实际的物理地址。 逻辑地址由一个 64bits 的长整型表示,其中处于高位的 13bits用来表示页编号(pageNumber),处于低位的 5lbits用来表示在该内存页内部的偏移( offsetlnPage)。 这样内存映射的过程,实际上就是先根据内存页编号查询页表(pageTable),得到对应的内存页 ,然后得到该页的物理地址,最后在物理地址上加上偏移,得到实际内存物理地址。因此,所有内存地址都可由 pageNumber和 offsetinPage决定。

Note: 对于堆外内存,当给定内存地址时,可以使用与 CIC++ 语言中操作指针 一样的方法,在 一 个数据结构中指向另一个数据结构来访问内存空间中的数据。然而,在 JVM 堆内内存模式下, GC 会导致堆内结构重 新组织 , Java 对 象 的内存地扯不 是固定 不变的,无法直 接使 用对象指针(地址〉来访问 。

Shuffle实现

Unsafe Shuffle 的实现在 一定程度上可以算是 Tungsten 内存管理优化最主要的应用场景。 在前面的内容中已经介绍过, Tungsten 方式的 Shuffle 过程中, ShuffleMapTask 的输出数据能够先序列化为二进制数据存储在内存中,再执行相关的操作 。 Tungsten Shuffle 的写操作由 UnsafeShuffleWriter 完成,与常规的 SortShuffleWriter 的不同之处在于 UnsafeShuffleWriter 中不涉及数据的反序列化操作 。

UnsafeShuffleWriter里面维护着一个 ShuffleExternalSorter,用来进行外部排序,与 SortShuf­fleWriter中的ExternalSorter功能类似。 当UnsafeShuffleWriter在逐条写入RDD的(K,V)记录时, 首先会由 Partitioner根据 K得到 partitionld,并依次将 K和 V序列化写入临时的 serOutputStream 中,然后写入 ShuffleExternalSorter。 因此, ShuffleExternalSorter 是 Tungsten Shuffle 写实现的核 心所在 。

缓存敏感计算( Cache-aware computation)

缓存敏感计算(Cache-awarecomputation)是 Tungsten 中一个比较重要的优化,主要对比的是普通的内存计算 。 在硬件层面,访问 CPU 的 Ll/L2/L3 级缓存比访 问内存速度快,大数据处理系统可以利用这个特性优化性能 。 而要将数据存储在 Ll/L2/L3 中,数据大小需要满足特定条件 。

基于该目标, Tungsten 缓存敏感计算机制通过设计缓存友好的数据结构来提高缓存命中率 (Cache hit)和本地化( Cache locality)的特性 。 到目前为止, Spark 中缓存敏感的计算优化针对 的主要是排序(Sort)操作,相应的实现是 UnsafeExterna!Sorter和 UnsafeinMemorySorter类(参 见 org叩ache叩ark.ut且unsafe.sort包)。 实际上, cache-aware排序方式在 Spark1.5版本中已经实现,其主要思想受微软 AlphaSort 研究工作的启发 。

Tungsten 中 cache-aware 排序原理如下图所示。 常规的做法是每个 record (<key, value>) 中有一个指针指向该 record,对两个 record排序先根据指针定位到实际数据,然后对实际数据 进行比较,这个操作涉及的都是内存的随机访问(Random access),缓存本地化(Cachelocality)会变得很低。 针对该缺陷,缓存友好的存储方式会将 key和 record指针放在一起,以 key为前 缀,排序操作是按照线性方式查询 key-pointer 对,避免内存的随机访问 。

动态代码生成( Code generation)

Spark引入代码生成主要用于 SQL和 DataFrames中的表达式求值(Expression evaluation) 。表达式求值的过程是在特定的记录上计算一个表达式的值。 当然,这里指的是运行时,而不是在一个缓慢的解释器中逐行做单步调试。 对比解释器,代码生成去掉了原始数据类型的封装,更重要的是,避免了昂贵的多态函数调度。

当今绝大多数数据库系统处理 SQL查询的方式都是将其翻译成一系列的关系代数算子或表达式,然后依赖这些关系代数算子逐条处理输入数据并产生结果。 从本质上看,这是一种迭代的模式,某些时候也被称为 Volcano形式的处理方式,由 Graefe在 1993年提出 。

该模式可以概括为.每个物理关系代数算子反复不断地调用 next 函数来读入数据元组 (Tuple)作为算子的输入,经过表达式处理后输出一个数据元组的流( Tuple stream)。 这种模式简单而强大,能够通过任意组合算子来表达复杂的查询 。

这种迭代处理模式提出的背景是减轻查询处理的 IO瓶颈,对 CPU 的消耗则考虑较少。 首先,每次处理一个数据元组时, next 函数都会被调用,在数据量非常大时,调用的次数会非常多。 最重要的是,next函数通常实现为虚函数或函数指针,这样每次调用都会引起CPU中断并使得 CPU 分支预测( Branch Prediction)下降,因此相比常规函数的调用代价更大。 此外,迭代处理模式通常会导致很差的代码本地化能力,并且需要保存复杂的处理信息。例如,表扫描算子在处理一个压缩的数据表时,在迭代模式下,需要每次产生一个数据元组,因此表扫描算子中需要记录当前数据元组在压缩数据流中的位置,以便根据压缩方式跳转到下一条数据元组的位置 。

正是基于这些考虑及实际性能上的观察,一些现代的数据库系统开始尝试摆脱单纯的迭代模式,考虑面向数据块( Block)的方式(一次读取一批数据)来获得数据向量化的处理优势。 具体包含两方面,一方面是每次解压一批数据元组,然后每次迭代读取数据时只在这批数据中读取;另一方面是直接在 next 函数读取数据时就读取多个数据元组,甚至一次性读取所有的数据元组。上述面向数据块的处理方式在一定程度上确实能够消除在大数据量情况下的调用代价, 然而在另一方面却丢掉了迭代模式一个重要的优点,即所谓的能够按照管道方式传输数据 (Pipelining data) 。 管道方式意味着数据从一个算子传输到另一个算子不需要进行额外复制或序列化处理。 例如,select就是一个具有管道方式的算子,能够在不修改数据的前提下传输数据元组到下一个算子。然而,在面向数据块的处理方式中,一次产生多条数据元组往往需要序列化保存,虽然能够带来向量化处理的优势,但是破坏了管道方式的优点,并且在通常情况下会消耗更多的内存与网络带宽。

因此,当内存与IO不再成为瓶颈后,CPU成为现代数据库系统的主要瓶颈。MonetDB系列的数据库处理系统采用的是面向数据块的思路。 另一个思路则是将查询编译成中间可执行的格式,即动态代码生成( Code generation),来取代解释性的结构。在实际数据处理中,比较有意思的一个发现是开发人员手写的程序明显比向量化的数据库系统性能高。

总的来讲,动态代码生成能够有效地解决 3 个方面的问题 。

  1. 大量虚函数调用,生成的实际代码不再需要执行表达式系统中统一定义的虚函数(如Eva!、 Evaluate 等) 。
  1. 判断数据类型和操作算子等内容的大型分支选择语句 。
  2. 常数传播( Constants propagation)限制,生成的代码中能够确定性地折叠常量。

近年来,在代码生成方面, 学术界与企业界也做了大量的工作。例如,将查询逻辑转换为 Java字节码、HIQUE 系统将查询翻译为C代码。 代码生成技术在大数据系统中的应用也非常广泛,例如, Impala中采用 LLVM (Low-LevelVirtualMachine)作为中间代码加速数据处理、 SparkSQL生成 Java中间代码来提升效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1346755.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ssm基于web 的个人时间管理系统+vue论文

基于web 的个人时间管理系统的设计与实现 摘要 当下&#xff0c;正处于信息化的时代&#xff0c;许多行业顺应时代的变化&#xff0c;结合使用计算机技术向数字化、信息化建设迈进。传统的个人时间信息管理模式&#xff0c;采用人工登记的方式保存相关数据&#xff0c;这种以人…

Ksher H5页面支付实例指导 (PHP实现)

前文 背景介绍 前两天&#xff0c;公司的项目&#xff0c;为了满足泰国客户的支付需求&#xff0c;要求使用 Ksher (开时支付) 对接任务突然就给了鄙人&#xff0c;一脸懵 … 通过了解客户的使用场景、以及参考官网指导 发现&#xff1a;Ksher支付 最令人满意的便是 —— 提供了…

GitHub 一周热点汇总 第3期 (2023/12/24-12/30)

GitHub一周热点汇总第三期 (2023/12/24-12/30)&#xff0c;梳理每周热门的GitHub项目&#xff0c;了解热点技术趋势&#xff0c;掌握前沿科技方向&#xff0c;发掘更多商机。元旦就要到了&#xff0c;提前祝大家新年快乐。 #1 StreamDiffusion 项目名称&#xff1a;StreamDiff…

Powermill各版本安装指南

下载链接 https://pan.baidu.com/s/1CsrYEUQNmDa820RxDV2G6Q?pwd0531 1.鼠标右击【PowerMill2024(64bit)】压缩包&#xff08;win11及以上系统需先点击“显示更多选项”&#xff09;【解压到 PowerMill2024(64bit)】。 2.打开解压后的文件夹&#xff0c;双击打开【Setup】文…

Qt基础之四十五:Qt国际化(I18N)

国际化的英文表述为Internationalization,通常简写为I18N(首尾字母加中间的字符数),这种奇葩的缩写方式,让我想起了NBA球星“字母哥”。 下面看下Qt实现的动态语言切换效果。 一.效果 二.源码 QHSettingDialog.h #ifndef QHSETTINGDIALOG_H #define QHSETTINGDIALOG_H#…

获取Windows10系统原始安装日期

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 目标 获取Windows10系统最原始的安装日期&#xff1b;例如&#xff1a;刚买电脑时安装系统的时间。 步骤 第一步&#xff0c;请打开PowerShell&#xff0c;单击Windows P…

PAT 乙级 1033 旧键盘打字

旧键盘上坏了几个键&#xff0c;于是在敲一段文字的时候&#xff0c;对应的字符就不会出现。现在给出应该输入的一段文字、以及坏掉的那些键&#xff0c;打出的结果文字会是怎样&#xff1f; 输入格式&#xff1a; 输入在 2 行中分别给出坏掉的那些键、以及应该输入的文字。其…

使用Android Studio等idea工具开发flutter应用,必备的debug调试技能,非常好用

我们程序员不论开发什么软件&#xff0c;都需要一把锋利的调试工具&#xff0c;这是必不可少的&#xff0c;不然出现问题了&#xff0c;你都不知道问题是啥&#xff0c;出现在哪&#xff0c;就更别说怎么解决了。所以我这里就介绍一下android studio开发flutter必备的调试技能&…

ssrf之dict协议和file协议

1.dict协议 dict是什么协议呢&#xff1f; 定义&#xff1a;词典网络协议&#xff0c;在RFC 2009中进行描述。它的目标是超越Webster protocol&#xff0c;并允许客户端在使 用过程中访问更多字典。Dict服务器和客户机使用TCP端口2628。 官方介绍&#xff1a;http://dict.o…

【STM32】STM32学习笔记-PWM驱动LED呼吸灯 舵机 直流电机(16)

00. 目录 文章目录 00. 目录01. 输出比较相关API1.1 TIM_OC1Init1.2 TIM_OCInitTypeDef结构体1.3 TIM_OCMode1.4 TIM_OutputState1.5 TIM_OutputNState1.6 TIM_OCPolarity1.7 TIM_OCNPolarity1.8 TIM_OCPolarity1.9 TIM_OCNPolarity 02. PWM实现呼吸灯接线图03. PWM实现呼吸灯示…

livox avia平台搭建

硬件平台搭建 硬件平台的搭建除了livox雷达外还需要以下物料 焊接12V稳压模块接口 livox雷达需要12V的稳定电压供电,因此需要在电池与雷达之间加入8-35V转12V的稳压模块 组装 将各组建组装起来即可。 220V交流电供电 电池供电

数据结构 模拟实现LinkedList单向不循环链表

目录 一、链表的简单介绍 二、链表的接口 三、链表的方法实现 &#xff08;1&#xff09;display方法 &#xff08;2&#xff09;size得到单链表的长度方法 &#xff08;3&#xff09;addFirst头插方法 &#xff08;4&#xff09;addLast尾插方法 &#xff08;5&#xf…

迈向通用异常检测和理解:大规模视觉语言模型(GPT-4V)率先推出

PAPERCODEhttps://arxiv.org/pdf/2311.02782.pdfhttps://github.com/caoyunkang/GPT4V-for-Generic-Anomaly-Detection 图1 GPT-4V在多模态多任务异常检测中的综合评估 在这项研究中&#xff0c;我们在多模态异常检测的背景下对GPT-4V进行了全面评估。我们考虑了四种模式&#…

【起草】【第十二章】定制ChatGPT数字亲人

身为普普通通的我们&#xff0c;不知道亲人们在哪一天就要离开这个世界 &#xff1f; 作为普普通通的程序员&#xff0c;我们可以为我们的亲人做点什么 &#xff1f; 让他们以数字资产形式留在人世间 ? 对话&#xff5c;6岁女孩病逝捐器官&#xff0c;妈妈&#xff1a;她去…

缺失的第一个正数(LeetCode 41)

文章目录 1.问题描述2.难度等级3.热门指数4.解题思路4.1 暴力4.2 排序4.3 哈希表4.4 空间复杂度为 O(1) 的哈希表4.5 置换 参考文献 1.问题描述 给你一个未排序的整数数组 nums &#xff0c;请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级…

【分布式配置中心】聊聊Apollo的安装与具体配置变更的原理

【管理设计篇】聊聊分布式配置中心 之前就写过一篇文章&#xff0c;介绍配置中心&#xff0c;但是也只是简单描述了下配置中心的设计点。本篇从apollo的安装到部署架构到核心原理进一步解读&#xff0c;大概看了下apollo的原理&#xff0c;感觉没有必要深究&#xff0c;所以就…

vscode软件安装步骤

目录 一、下载软件安装包 二、运行安装包后 一、下载软件安装包 打开vscode官方网址&#xff0c;找到下载界面 链接如下&#xff1a;Download Visual Studio Code - Mac, Linux, Windows 我是windows电脑&#xff0c;各位小伙伴自己选择合适的版本&#xff0c;点击下载按钮…

常用设计模式全面总结版(JavaKotlin)

这篇文章主要是针对之前博客的下列文章的总结版本: 《设计模式系列学习笔记》《Kotlin核心编程》笔记:设计模式【Android知识笔记】FrameWork中的设计模式主要为了在学习了 Kotlin 之后,将 Java 的设计模式实现与 Kotin 的实现放在一起做一个对比。 一、创建型模式 单例模…

2023 AI开发者生态报告

随着人工智能技术的飞速发展&#xff0c;全球IT市场对AI的投入持续增长&#xff0c;预计到2027年将达到4236亿美元。中国作为AI领域的重要参与者&#xff0c;其投资规模预计将占全球的9%。在这样的背景下&#xff0c;2023年的《AI开发者生态报告》为我们揭示了人工智能时代的技…

12.30_黑马数据结构与算法笔记Java

目录 320 全排列无重复 Leetcode47 321 组合 Leetcode77 分析 322 组合 Leetcode77 实现 323 组合 Leetcode77 剪枝 324 组合之和 Leetcode 39 325 组合之和 Leetcode 40 326 组合之和 Leetcode 216 327 N皇后 Leetcode51-1 328 N皇后 Leetcode51-2 329 解数独 Leetco…