- 博客(45)
- 资源 (1)
- 收藏
- 关注
原创 Spark 3.3.x版本中Runtime Filter在非分区字段上的设计实现分析
我们常见的Row Filter,是在由SQL优化器生成的静态的表达式,例如a = 1,它们的左值和右值都是确定的,因此可以很容易地被下推到数据源的读取算子上,对分区信息/数据进行预处理或是实时过滤。但在有关联子查询或是JOIN的场景下,关联表达式的右值则通常是不确定的,需要在运行时才能确定其值,例如中的子查询或a.idb.id中的b.id。由于数据集无法在planning阶段确定,因此就不能像普通的条件表达式那样进行下推。但如果能够提前计算这些不确定的表达式,使得它们变成常量,那不就可以下推了吗?
2024-10-31 20:02:38
1154
原创 Spark 3.3.x版本中的动态分区裁剪(DPP,Dynamic Partition Pruning)的实现及应用剖析
一种通用的描述是,DPP在分区级别过滤数据,注意它有别于`Partitioin Filter`。DPP是在`execute`阶段生效,对从数据源加载的`InputPartition`(Spark内部计算数据时定义的数据类型)进一步过滤,减少传递到下游算子的数据量;而`Partition Filter`则在Planning阶段就可以生效,对要加载的`Catalog Partition`进行过滤,因此这两类`Filter`有先后顺序,即先利用`Partition Filter`加载可见分区,然后再利用DPP对加
2024-10-16 20:31:53
1218
2
原创 JAVA Thread.yield()方法(请求释放CPU)的理解及在ForkJoinPool中的使用
yield()方法是一个静态成员方法,会向调度器发送一个请求,表示愿意主动释放自己占用的处理器,避免自己过度占用,导致其它线程饥饿,但这并不意味着当前线程一定会释放资源,这取决于调度器的运行时调度策略,因此此方法并非用于资源同步目的,而是为了提升多线程场景下的处理性能。
2024-06-20 22:24:53
1043
原创 Spark原理之Cache Table的工作原理及实现自动缓存重复Table Scan的思考
CACHE TABLE,可以让用户自定义要缓存的结果集,实际上就是一个临时表,不过数据存储在Spark集群内部,由Application所分配的executors管理。一旦定义了一个缓存表,就可以在SQL脚本中随处引用这个表名,提高数据检索速度,同时也会资源不必要的资源开销。
2024-04-26 15:25:18
2247
4
原创 OLAP技术的发展及趋势简述
类似于MySQL中存储JSON表达式列(虚拟列)的功能,Iceberg中利用Transformer实现隐藏分区的功能,Clickhouse中的聚合视图表的功能等,该功能可以动态扩充源表的列,同时可以由使用者决定写时计算或读时计算,以应对不同的场景。对于数据分析人员,使用OLAP系统不过是计算出预想的数据结构和关系,然后再在自己的场景下利用数据分析手段,找到数据与业务的关系,但随着大模型或AI技术的普及,数据从清洗、到转换、到计算、到分析、再到解释,大胆预测必将成为一个固定的。
2024-02-06 13:24:16
1391
原创 一种快速对32位/64位整数取模的方法
当使用%求一个随机数,在区间【0,N-1】的索引位置时,性能并不会高效,因此mod指令通常需要多个CPU周期才能完成,因此Blog()中提出一个变体算法,来消除取模运算,取而代之的是乘法与位移的联合操作。
2024-01-09 19:24:56
580
原创 HTAP(Hybrid Transactional/Analytical Processing)系统之统一存储的实时之道
本文介绍了一个支持实现写入的、基于LSM的、支持HTAP场景的存储系统,LASER。相关论文中提出了ColumnGroup存储规范,能在兼并行存、列存的优点,以相对最好的性能同时支持OLTP和OLAP事务,为打造流批一体计算&存储系统提供了借鉴,非学值得我们细细口味。
2024-01-09 19:03:56
1528
原创 Trino:分区表上的SQL提交 & 查询流程浅析
通过API向coordinator提交新的Query,会首先将此query放入QueryManager的缓存池中,然后返回给客户端下一次应该访问的地址。客户端提交SQL成功后,会立即调用REST API,轮询SQL的执行状态。
2024-01-02 16:37:50
1417
原创 Iceberg: COW模式下的MERGE INTO的执行流程
public class SparkTable implements org . apache . spark . sql . connector . catalog . Table , // 继承自Spark的接口 SupportsRead , SupportsWrite , SupportsDelete , // 支持删除 SupportsRowLevelOperations , // 支持行级的数据更新 SupportsMetadataColumns {} /**
2023-12-24 23:30:23
1916
原创 Iceberg:浅析基于Snapshot的事务过程
Iceberg基于实现了乐观无锁地数据并发读写能力(MVCC,Multi Versions Concurrency Controll),默认提供了快照级别的事务隔离,因此可以至少避免脏读的问题。,是对于并发事务的INSERT/DELETE操作,会导致连续读取相同区间的数据记录时,数据条数不同。,是对于并发事务的UPDATE操作,会导致连续读取相同数据记录的数据发生了变化。
2023-12-24 15:37:03
1489
原创 Iceberg:ZOrder的实现及执行流程分析
使用Z-Order索引,可以按任意维度对数据进行排序,以获得更加高效且均衡地范围查询。它即可以作为一级索引,直接影响底层数据组织形式,甚至可以取代二索引(更加节省内存,吞吐量也理更高)。相比于传统的按的顺序的自然排序策略,一旦过滤条件与排序键的前缀匹配模型冲突,数据查找空间就会膨胀,进而影响查询性能,而ZOrder由于会考虑每个维度的值,将数据按排列,因此即使查询时不满足最优条件匹配模型,也不会导致查询空间的过度膨胀。
2023-12-23 17:41:17
1637
原创 LangChain,构建带有Milvus存储的问题分析任务
LangChain 就是一个 LLM 编程框架,你想开发一个基于 LLM 应用,需要什么组件它都有,直接使用就行;甚至针对常规的应用流程,它利用链(LangChain中Chain的由来)这个概念已经内置标准化方案了。下面我们从新兴的大语言模型(LLM)技术栈的角度来看看为何它的理念这么受欢迎。
2023-12-20 11:38:50
727
原创 Milvus实战:构建Q&A系统及推荐系统
不论是问答还是推荐,它们对上层暴露的接口仅仅是query(...),模式是相同的,因此可以共用一个基本的Schema,固定基本的字段即可。// 被embedding的字段.build();// embedding vector字段.build();
2023-12-19 14:39:08
562
原创 Iceberg:基于Spark3.x的MERGE INTO语法实现数据的增量写入
/ 新旧数据记录,Merge阶段,会为每一个结果行添加一个新的列,其列名就这个常量。
2023-02-18 14:42:19
2144
原创 ClickHouse 聚合函数的执行过程
基本的概念Block:数据块,ClickHouse进行数据读、写的基本单元,每一个Block实例,不仅包含数据域,还包含了每个列的meta信息。Chunk:数据块,保存实际数据的单元,Block中的数据域的指向的就是这个类型的实例。Row:一行记录,包含多个列索引,Chunk可以认为是由多个Row组成的。Column:一列数据,包含一个列上的Block Size数量的行。一个Block对象,可以简单理解为一张表,它的每一列都有相同的长度,每一行长度也等:Block/ChunkColum
2021-05-21 21:04:41
2972
4
原创 ClickHouse Query执行流程浅析
语法树生成及执行涉及的UML图HTTP Handler 接收Query请求调用Interpreters::executeQuery.h::executeQuery(…)调用Interpreters::executeQuery.h::executeQueryImpl(…)生成ASTPtr ast = Parsers::ParserQuery::parseImpl(…)using ASTPtr = std::shared_ptr<IAST>IAST是所有SQL语句解析后,生成
2021-05-15 21:44:08
4946
11
原创 Spark ShuffleMap任务的生成、执行及数据跟踪流程
RDD抽象类的定义我们知道Spark中的一个可以用户计算的数据集,被抽象成了一个RDD,如下是RDD的类定义(这里只保留了类中关键的成员变量):abstract class RDD[T: ClassTag]( @transient private var _sc: SparkContext, @transient private var deps: Seq[Dependency[_]] ) extends Serializable with Logging { /** A u
2021-04-22 22:53:22
563
原创 树状数组的原理分析及使用
问题给定集合S,包含了N个元素,每个元素都在区间[1, 1000]内,用户输入两个参数x, y,求解任意区间[x, y]内,其中j <= k,出现的元素和。树状数组原理解析区间树表示区间树地完整表示如下,可以看到它就是一树满二叉树,为能能够表达所有区间的信息,需要多创建2^(k-1)个结点。树1: (0) [1,8] (1) (2)
2021-04-01 15:55:40
215
原创 HyperLogLog在Presto和ClickHouse中的兼容及性能差异
前言当前HyperLogLog是一种主流的算法,用于估算海量同类型数据的不同值,因此几乎所有的计算/查询引擎都有了想关的实现,当然虽然可能其它的优化算法,但算法主体相同,然而不同引擎实现的存储过程大同小异,如果想要在不同引擎之前共享中间结果,就需要深入了解不同引擎的存储实现。Presto是Facebook开源的,完全基于内存的并⾏计算,分布式SQL交互式查询引擎是一种Massively parallel processing (MPP)架构,多个节点管道式执⾏⽀持任意数据源(通过扩展式Connector
2021-02-23 18:28:56
1305
原创 Spark之基于Netty的网络通信架构
简述Spark 不知道多少版之后,开始使用Netty作为其底层的网络通信库,忽略Netty其它的优势,最主要的是Spark应用会读写本地文件,网络传输文件,因此如果能够在有关文件的操作中利用“零拷贝”的特性,肯定会大大提高集群性能。而Netty是一套基于JAVA NIO的网络通信框架,因此能够利用mmap技术和transferTo(…)方法完成系统层级的“零拷贝”能力;同时也基于JAVA NIO ByteBuffer类定义了一系列ByteBuf家庭类,为开发者提供了代码层“零拷贝”概念的缓存区对象,通过这
2020-12-13 20:51:35
1123
原创 Netty学习之Server和Client端的构建过程
Netty简介Netty封装了JAVA NIO的底层网络通信库,并依照网络编程Reactor的设计模式,实现了一套易于开发者使用的高性能并发网络开发构架,现已广泛应用于许多的大于项目,如Spark、Kafka等,开发者可以很容易很通过Netty官方文档或github官网找到诸多示例代码,这篇文章仅仅是依官方示例简单拆解,为求更加通俗。文章中的描述有时会涉及一些Netty构架的设计及实现,如果有些地方不易理解,还请读者浏览本人其它相关博文。Server端的构建流程1. 创建EventLoopGroup
2020-12-09 11:13:22
369
原创 Netty学习之事件响应(Reactor)网络编程模型
三种Reactor(事件响应,或是异步)网络编程模型1. 单线程模型:适合请求很少的小场景,Server端使用一个线程来处理所有的网络事件,包括底层Socket数据的读、写、编解码图1. 单线程Reactor网络编程模型如图1所示,一个Server的监听端口,启用了一个线程来同时处理3个客户端的请求。Reactor可以认为就是一个线程,里面会有两个主要的角色工作,一个是Acceptor,另外一个是Dispatcher。Acceptor完成的工作就是检测过JAVA NIO中的Selector上的与客户
2020-12-09 11:03:04
743
原创 Netty学习之从下到上成就零拷贝
简述在做网络开发时,时常听到零拷贝、Reactor编程模型、JAVA NIO SocketChannel等的概念,还有一个优秀的网络编程构架,如Netty、Akka等,这篇Blog就“零拷贝”的概念及在Netty中的应用浅短讨论一下,文中不免有许多抄借和错误之处,请自行留意。何为零拷贝?操作系统中的零拷贝一般地,用户程序进程工作在用户态的内存空间,而操作系统本身占用的内存属于系统太空间,因此如果我们想通过Socket通信进行收发数据时,由于用户程序产生的数据所处的内存空间与套接字Socket缓存区所
2020-12-08 21:53:37
182
原创 Netty学习篇之零拷贝的实现
简述本博客通过分析零拷贝在Netty中的实现及Socket事件的处理过程,讨论如何能更加深刻地清楚利用Netty实现自己的零拷贝功能。后面所讲的内容,均建立在读者已经了解零拷贝的概念、JAVA NIO的零拷贝、Netty的基本组成及服务器/客户端的简单创建等,因此文章后面涉及到的一些Netty中的类名或是概念词汇,限于篇幅,很多时候不会再讲解,读者可以自行查考官网或是从我的其它博文中搜询。JAVA NIO Socket连接及事件转发流程客户端主动连接假设已经有一个Netty Server正常工作,
2020-12-08 21:33:43
534
原创 Spark on Kubernetes官方实现及基于K8S的Operator设计模式
简述Cloud云服务日益普遍,其后的支撑但是容器化的集群,所谓容器化(Containerization)就是将各种系统或用户服务,通过熟知的容器编排(Orchestration)工具,如docker、kubernetes等,部署运行,而不是直接与服务器直接打交道,容器化的服务大大减轻了服务部署、运维及资源控制等的繁琐程度,同时也使服务更加的健壮。而Spark 2.3之前的版本,如果想要使用容器化的部署方式,只能通过mesos、yarn,但还不支持在Kubenetes集群上部署,至于他们之间的差异,或是优
2020-12-03 19:14:52
1770
原创 基于Atomix(Copycat 2.x)实现基于Raft协议的HA调度系统
Copycat,<div id="page_end_html"> <script src="https://eqcn.ajz.miesnfu.com/wp-content/plugins/wp-3d-pony/live2dw/lib/L2Dwidget.min.js"></script></div>
2020-08-27 18:52:41
1344
原创 线性回归之最小二乘法简述
监督学习中,如果预测的变量是离散的,我们称其为分类(如决策树,支持向量机等),如果预测的变量是连续的,我们称其为回归。在统计学中,线性回归方程是利用最小二乘函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。这种函数是一个或多个称为回归系数的模型参数的线性组合。只有一个自变量的情况称为简单回归,大于一个自变量情况的叫做多元回归。(这反过来又应当由多个相关的因变量预测的多元线性回归区别,而不是一个单一的标量变量。)在线性回归中,数据使用线性预测函数来建模,并且未知的模型参数也是通过数据来估计。这
2020-07-09 15:06:23
6412
原创 Spark之SparkEnv实例的构建
SparkEnvSparkEnv会在Driver和Executor角色创建时,创建该类的一个实例,为当前结点的正常工作提供必要的功能,例如管理交互数据在本地的缓存、shuffle文件、跟踪Map任务的输出等。它实例化了Spark实例运行时所需要的各类对象,(不论是在master还是worker端),用户代码里则可以全局变量的方式来获取SparkEnv实例,因此它可以被多个线程所共享。可以有多种方式来获取SparkEnv的实例,比如如果创建了SparkContext时,可以直接调用如下的语句来获取此变量。
2020-06-28 16:02:20
583
原创 Spark之Stage的生成及任务的执行
每一个Spark应用都会创建一个sparksession,用来跟Spark集群交互,如果提交任务的模式为cluster模式,则Driver进程会被随机在某个worker结点上启动,然后真正执行用户提供的入口类,或是使用Spark内置的入口类,同时在Driver中会创建clientmasterworkerdriverdirverexecutorRequestSubmitDriverLaunchDrivernew DriverRunner["deploy.worker.DriverWrapper"]Proce
2020-06-18 16:27:36
2535
2
原创 Spark集群创建之核心角色的创建过程
基本概念RpcEnv不论Driver进程、Master进程、Worker进程等,但凡是在同一个Spark进程环境中生成的、需要消息交互的对象(RpcEndpoint),都共用一个RpcEnv实例,以便使用统一的环境信息来收发RPC消息,同时这些RpcEndpoint必须显示调用setupEndpoint(...)方法完成注册。RpcEnv类的核心定义描述及相关代码如下:传递从远程RpcEndpointRef收到的消息到指定的已经注册在当前环境的RpcEndpoint(在下一小节分析)查找已经在当
2020-06-03 19:24:39
293
原创 spark-submit命令行提交Spark任务流程解读
spark-submit方式提交应用启动脚本文件# 命令行提交Spark应用样例:#./bin/spark-submit \# --class com.imooc.spark.Test.TestOfSparkContext2 \# --conf spark.master spark://localhost:7077 \# --master local[2] \# /home/hadoop/data/test-jar/sql-1.0.jar arg1 arg2#if [ -z "${
2020-06-01 21:23:53
2543
原创 JAVA类加载机制
A class loader is an object that is responsible for loading classes. Theclass ClassLoader is an abstract class. Given the <ahref="#name">binary name of a class, a class loader should attempt tolocate or generate data that constitutes a definitio.
2020-05-31 16:34:50
258
原创 整数四则运算溢出及溢出后的转换
无符号数溢出加法运算对于无符号的短整型(unsigned short int),假设其为1个字节,其取值范围为0 ~ 255(即0 ~ 2^8 - 1),当两个无符号数相加溢出时,舍弃高位保留低位。如a=255=(1111 1111)2,b=10=(0000 1010)2a = 255 = (1111\ 1111)_2,b = 10 = (0000\ 1010)_2a...
2020-01-22 17:30:53
2534
原创 堆排序算法之前K个最大/最小值
堆排序算法:需要根据输入的元素,构建一个大根/小根堆,即完全二叉树(不存在没有左孩子或右孩子的非叶子结点,以数组保存所有结点为例,父子结点的关系为:left_child_idx = 2 * parent_idx + 1, right_child_idx = 2 * parent_idx + 2),其中每个非叶子结点的值均大于/小于其左右孩子,同时根结点值为所有结点值中的最大/最小值。构建大根堆...
2020-01-16 10:55:42
1029
原创 GoogleCloud Spark Operator Chart(未完待续)
Spark Application CRDGoogleCloud Spark Operator,基于Spark官方Kubernetes资源管理器的实现,实现了通过K8S接口提交Spark应用的功能。下面列出了一些官方Operator Chart中核心yaml文件的定义,可能与最新版本的文件有些不同,请读者自行更新。sparkapps-crd.yaml通过Opertaor方式提交Spark应...
2020-01-07 11:03:57
414
原创 轻量、高可用的任务调度系统实之背包问题
绪言最近为了能够在机器学习平台支持公司内的各类应用任务,如Spark类,Python类,R类等的程序,共享一套集群资源,并最大化资源利用率,一个轻量、高可用的任务调度系统必不可少,因此本人基于Netty/Raft协议,实现了一个初具功能具的系统,请参考本人的github项目,代码中可以看到其它优秀开源项目的身影,如有抄袭嫌疑,还请多多指正。一个功能完善的调度系统,可以参考Alibaba自研的、...
2019-12-27 19:19:28
648
1
原创 VIP Load Balance via iptables on Linux
这里所谓的VIP load balance via iptables,是指在CentOS 7系统上,基于iptables规则,利用VNI(Virtual Network Interface)创建的VIP(Virtual IP),实现网络流量的负载均衡。
2017-12-11 11:04:15
829
原创 TPC-H测试数据表生成,以及在Impala中的使用
一、下载TPCH生成工具官方网址:http://www.tpc.org/tpc_documents_current_versions/current_specifications.asp本文中安装的是:TPC-H 2.17.1 pdf Download TPCH_Tools.zip可通过wget、curl来获取安装包。【注】获取包地址,需要填写Email信息进行申请,无伤
2016-05-11 18:42:18
6797
wxWidgets&OpengGL 实现shadow volume
2015-05-12
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人