spark
文章平均质量分 76
wankunde
这个作者很懒,什么都没留下…
展开
-
Spark 管理和更新Hadoop token 流程
Spark AM 和 Executor 更新收到的 tokens。定时 Refresh tokens。启动 token manager。原创 2023-09-08 17:58:13 · 814 阅读 · 0 评论 -
Spark 中 Aggregate 的实现
Spark 中 Aggregate 的实现原创 2022-10-20 15:53:43 · 1099 阅读 · 0 评论 -
Spark lazy list files 的实现
对于Sparkpartitiontable,在生成HadoopFsRelation时,如果partitionKeyFilters或者subqueryFilters非空的时候,HadoopFsRelation的属性为LazyFileIndex,在最终FileSourceScanExec调用listFiles之前才将LazyFileIndex转换成InMemoryFileIndex。...原创 2022-07-26 10:34:54 · 296 阅读 · 0 评论 -
Spark External Shuffle Service 实现
ESS 服务启动Executor 向 ESS 注册Executor 的初始化Spark on Yarn 的 Executor 的启动类是 org.apache.spark.executor.YarnCoarseGrainedExecutorBackend。在 run() 方法中初始化 SparkConf, SparkEnv, 然后创建一个名字为 Executor 的 CoarseGrainedExecutorBackend 来接收 RPC 请求。因为 CoarseGrainedExecutor原创 2022-05-28 00:20:23 · 792 阅读 · 0 评论 -
Spark中Push Based Shuffle实现
Push Based Shuffle 概述正常的 Shuffle 会将Map结果写本地一个data文件,然后还有一个index文件存储每个reduce数据的索引。Pushed Shuffle在Map完成后,将同一个Reduce数据推送到同一个ESS,写到同一个data文件,并用一个index文件存储Map的索引。此外还有一个Meta文件,Server端不断接受Pushed 数据,当Server端接收到的数据大于Chunk size时,会将一批Map 数据当作一个Chunk来处理,并记录在Meta文件中原创 2022-05-06 11:32:19 · 1437 阅读 · 0 评论 -
Spark 中的 exchange reuse
文章目录说明ReuseExchange 和 ReuseSubquery RuleAE 中 reuse 的实现AE 第一次划分 Stage 并提交执行AE 第二次划分 Stage 并提交执行说明如果一个Query中有重复出现的Exchange或者Subquery, Spark 可以对着一部分进行 Reuse。在 disable AE 时,是通过两个固定的Rule 来改写Plan 来实现 reuse.在 enable AE 时,AE 通过 Stage 的划分和调度,通过特殊的 ReusedStage 来原创 2022-04-13 19:00:15 · 1245 阅读 · 0 评论 -
Spark Job写文件个数的控制以及小文件合并的一个优化
在大数据领域,平台小文件治理一直是一个非常重要的问题。我司大佬在Spark平台里,在向目标表中增加一个Shuffle,然后在Reduce端合并数据,以实现将小文件合并成大文件,来减少平台中的小文件。我司还对单个任务写HDFS文件个数做了限制,同时限制了单个Task 和 单次Job 可写的HDFS个数限制。通过引入额外Shuffle对写入数据进行合并最终实现效果如下== Optimized Logical Plan ==CreateDataSourceTableAsSelectComman原创 2022-04-12 19:14:41 · 2799 阅读 · 0 评论 -
使用双数组前缀树来优化字符串匹配
使用前缀树优化字符串匹配传统的字符串匹配有很多的优化算法,包括大名鼎鼎的KMP算法,算法复杂度为O(M + N).对于多路字符串匹配(Multi-Way Pattern Matching),比较出名的算法是 Aho-Corasick 算法。算法根据需要匹配的patterns创建类似于一棵 Trie-Tree 结构,且优化了在算法匹配不上的时候,节点之间的失效转移函数(failure function). 有兴趣的可以看一下一篇 中文博客AC 算法的效率确实非常快,但是在构建AC 自动机的时候,原创 2022-02-17 21:35:17 · 589 阅读 · 0 评论 -
SQL 在Join 和 Exists查询时对Null 值的处理
文章目录Join 中 null 值的处理In 和 Exists 中 null 值的处理Join 和 Exists 测试准备测试数据Join 测试In 和 Exists 测试最近发现SQL在处理Join 和 父子查询的时候,会对 null 记录做一些很奇怪的处理。根据大佬朱峰的解释,SQL 在当初设计的时候,不是把 null 做为空值来理解的,而是当作 未知 来处理的。所以在后续计算的时候,如发现计算结果 未知 会对记录进行丢弃处理。Join 中 null 值的处理Inner Join: 左右两张表中原创 2022-01-24 15:48:23 · 4122 阅读 · 1 评论 -
Spark String Decimal类型引起的问题
从Spark 2 到 Spark3 这期间, Spark 对于 String 和 Decimal 类型的比较会自动转换为Double 类型。这样会导致转换后的Filter 无法进行 Data Filter Pushed. 社区相关Ticket:[SPARK-17913][SQL] compare atomic and string type column may return confusing result[SPARK-22469][SQL] Accuracy problem in comp原创 2021-11-24 11:54:50 · 3297 阅读 · 0 评论 -
Spark Task的各个动作时间来源以及Task Schedule Delay 问题排查
背景发现线上偶尔会出现一些Spark Task会显示Schedule Delay数分钟甚至十几分钟,所以要排查原因。Task 时间分析以及Schedule Delay计算公式如图所示,时间轴上面的表示Driver 记录到的各个时间,时间轴下面的表示Executor记录到的各个时间。我们反过来,先说 Executor 记录的各个时间,再说Driver记录的各个时间。Executor 中Task运行时间Task 在Executor端运行,有三个时间段,分别是 deserializeTime, ex原创 2021-11-18 17:38:32 · 2943 阅读 · 3 评论 -
Spark对 Shuffle MapStatus 信息的处理
文章目录Spark AE 提交 ShuffleQueryStageExec 执行,并返回Futrue对象DagScheduler 收集 Map 执行结果,等待 MapStage执行结束AE 接收并处理 Stage MapOutput 信息MapStatus 对象Spark 3 中的AE会将原始SQL切分成很多QueryStage,在每个QueryStage执行完毕后,针对之前完成的QueryStage执行结果,对QueryPlan进行二次优化。其中二次优化最重要的就是根据之前QueryStage shu原创 2021-10-11 13:20:26 · 710 阅读 · 0 评论 -
Prepare and run TPCDS query with spark
文章目录TPCDS 数据生成工具通过 spark-sql-perf 项目生成TPCDS测试数据spark-sql-perf 项目编译sbt-spark-package 插件无法下载生成测试数据注册TPCDS外部表SBT console 无法运行TPCDS 数据生成工具TPC-DS 测试数据的生成依赖tpcds-kit项目, Databricks forks了改项目,并支持将生产的数据写入到Stdout,然后直接生成测试数据。我们需要提前安装好这个工具。git clone https://github.原创 2021-09-01 20:49:32 · 1211 阅读 · 0 评论 -
Thrift 0.12.0安装和 Parquet-mr 编译
文章目录Thrift 0.12.0 版本安装thrift 版本踩坑编译环境准备升级GCC版本Install BoostInstall libevent编译安装 thrift 0.12.0TroubleShootingerror: no member named 'stdcxx' in namespace 'apache::thrift'fatal error: 'openssl/opensslv.h' file not foundcomposer: No such file or directorygo.m原创 2021-08-29 11:42:51 · 1275 阅读 · 1 评论 -
通过Docker搭建数据库测试环境
环境准备拉取镜像文件docker pull postgres容器后台进程运行,向外暴露5432端口 docker run --name mypostgres -e POSTGRES_PASSWORD=postgres -d -p 5432:5432 postgres . 运行成功后默认数据库登录名、密码皆为postgres,当然也可以手动设置登录名、密码测试SQLCREATE TABLE T1 ( ID INT PRIMARY KEY NOT NULL, NAME原创 2021-08-20 15:11:38 · 445 阅读 · 1 评论 -
SBT 使用踩坑记录
SBT 本身应该还是一个非常优秀的编译工具。就像Scala 对比于 Java ,SBT 对比于 Maven,如果用的好的话,感觉还是好用太多~~ 但是因为国内网络连接不畅,相关资料介绍比较少的缘故,在国内对很多开发同学来说还是有些陌生了。SBT 仓库的问题SBT 是可以复用 Maven 仓库的,但是要合理配置,否则在编译项目的时候,就可能被各种包的下载问题给搞崩溃。配置 ~/.sbt/repositories 仓库列表,国内也有很多介绍配置该文件的博客,但是有很多都是过时的配置,随着时间的更新,建原创 2021-06-17 17:40:23 · 814 阅读 · 0 评论 -
SparkContext 终止 Task 运行过程及Executor Shutdown 造成 DeadLock 分析
文章目录KillTask 消息从提交到执行的传递流程DAGScheduler 提交 cancel job请求SchedulerBackend 发送Kill消息到 ExecutorExecutor 的 killTask 处理过程TaskRunner 线程的生命周期TaskRunner kill Task过程Executor 在 Shutdown 过程中是如果造成 DeadLock 的CoarseGrainedExecutorBackend 注册Signal事件处理Singnal信号注册ActionHandle原创 2021-06-11 13:07:09 · 2139 阅读 · 2 评论 -
Spark中几种不常见的Join
Semi JOIN : 查询 Left 数据在 Right 中存在的记录,返回 Left 字段Anti JOIN : 查询 Left 数据在 Right 中不存在的记录,返回 Left 字段Cross Join : 这个在Spark的代码里没看出和Inner Join有什么区别,在Spark中有一个Inner Like,就是包含Inner Join 和Cross Join的。。Natual Join : 我们在正常的Join 前面可以加 Natual 关键字,这个时候不能写ON条件,Spark 在 .原创 2021-05-20 09:44:06 · 461 阅读 · 0 评论 -
权限控制系统设计及Spark SQL 数据权限控制设计
权限控制系统基础权限控制系统设计在OA系统,数据系统中其实都差不多,离不开三级体系设计: Role, User, Principal. 具体叫法在各个系统的实现上会有差别。Role : 多个User 属于一个Role,User 用于Role 的所有权限。User : 系统用户,User 一般我们会做登录鉴权,在权限控制体系中,一般都是用于获取Role 的相关信息Principal : 这个中文不知道怎么翻译,我的理解就是一个具体权限的描述,包括<Role, Object, Privilege原创 2021-05-18 19:09:40 · 690 阅读 · 0 评论 -
Spark优化包含non deterministic Filter的条件下推
优化代码优化代码,参考: CombineFilters Ruleval applyLocally: PartialFunction[LogicalPlan, LogicalPlan] = { // The query execution/optimization does not guarantee the expressions are evaluated in order. // We only can combine them if and only if both are det原创 2021-05-12 18:17:57 · 353 阅读 · 0 评论 -
扩展Log4j支持日志文件根据时间分割文件和过期文件自动删除功能
为了实现我们的需求,我们先看一下原始的Log4j 是如何实现日志文件的管理的。RollingFileAppender在log4j中Appender 负责将日志写入日志文件中,实际生产环境中服务长期运行,日志文件会非常多,所以我们一般使用RollingFileAppender 来将日志根据规则进行切割,写入不同的日志文件中。在log4j内置的类是 org.apache.log4j.RollingFileAppender,这个类默认功能比较单一,通过参数 maxBackupIndex 配置Roll原创 2021-05-12 18:15:37 · 877 阅读 · 0 评论 -
Spark Bucket Table Join
生成Bucket表创建Bucket表方式一spark.sql("DROP TABLE IF EXISTS user1_bucket")spark.sql("DROP TABLE IF EXISTS user2_bucket")val r = new scala.util.Random()val df = spark.range(1, 100).map(i => (i, s"wankun-${r.nextInt(100)}")).toDF("id", "name")df.write.原创 2021-05-12 17:49:15 · 1079 阅读 · 0 评论 -
Spark3中Catalog组件设计和自定义扩展Catalog实现
文章目录Spark 3 中Catalog组件设计catalog管理类继承关系Catalog 初始化过程测试自定义Catalog编译和打包测试类切换catalog测试Spark 3 中Catalog组件设计catalog管理类继承关系在Spark 3中,我们可以轻松的对内置的访问Hive metastore 的catalog进行自定义功能扩展。我们先梳理一下整个系统实现的类设计,以及catalog的初始化流程Delta 是 Databrick 提供的一种扩展的文件存储格式,同时也提供了相关的SQL开发原创 2021-04-06 11:56:59 · 5194 阅读 · 1 评论 -
初探JuiceFS
文章目录说明Juicefs编译启动 Redis 服务来管理JuiceFS元数据将OSS存储挂载为本地目录读写Hadoop 访问 JuiceFS 存储参考说明个人理解JuiceFS的定位是一个建立在S3, OSS 等存储系统之上的一个抽象文件系统。因为使用Redis来做文件的元数据管理,所以减少了远程调用 S3, OSS API的开销;内部有对数据的Cache功能,所以当重复访问数据时,速度也会得到明显提升。Juicefs编译Juice编译设计到的go,java,maven等组件,而且go的编译还需原创 2021-03-31 14:28:58 · 3771 阅读 · 3 评论 -
Spark 3.0 DPP实现逻辑
准备测试环境测试数据和测试SQLimport spark.implicits._import java.time.LocalDateTimeimport java.time.format.DateTimeFormatterimport java.sql.Timestampspark.range(-1000, 1000).map { id => val dt = Timestamp.valueOf(LocalDateTime.now.plusDays(id)) val dt原创 2021-03-12 18:39:18 · 858 阅读 · 0 评论 -
Spark Filter算子在Parquet文件上的下推
Spark程序在读取Parquet文件的时候可以将合适的Filter条件转换为Parquet文件的Filter,根据文件Footer中的统计信息提交过滤掉一部分不满足条件的Block,减少数据的IO。准备测试环境Spark Version : 3.0.0Parquet Version : 1.10.1import spark.implicits._import scala.util.Randomimport scala.math.BigDecimalimport java.time.Loc原创 2021-03-11 21:09:12 · 1378 阅读 · 0 评论 -
修改 Spark 支持远程访问OSS文件
编译特定版本Hadoop访问OSS的Jar包目前Hadoop trunk 分支已经包含了hadoop-aliyun模块的代码,hadoop已经默认支持aliyun oss的访问支持。但是我们公司的hadoop版本还是CDH5的分支版本,默认是没有oss支持的。通过下载官方提供的hadoop-aliyun.jar包放到Hadoop中,发现高版本的hadoop-aliyun.jar依赖于高版本的httpclient.jar 和高版本的httpcore.jar, 高版本和低版本造成类访问冲突。无奈之下,尝试原创 2021-02-01 21:34:33 · 1665 阅读 · 1 评论 -
Spark 3.0 Adaptive Execution 代码实现及数据倾斜优化
文章目录启用Spark AEAE对Stage 分阶段提交执行和优化过程OptimizeSkewedJoin 优化原理启用Spark AEAdaptive Execution 模式是在使用Spark物理执行计划注入生成的。在QueryExecution类中有 preparations 一组优化器来对物理执行计划进行优化, InsertAdaptiveSparkPlan 就是第一个优化器。InsertAdaptiveSparkPlan 使用 PlanAdaptiveSubqueries Rule对部分Su原创 2020-12-21 15:54:52 · 1056 阅读 · 0 评论 -
Spark 任务Task调度异常分析
文章目录Spark任务调度异常回顾Spark Task调度过程问题分析任务优化思路Spark任务调度异常最近在帮业务的同学跑Spark程序,其中一个job的Stage有15000+Task,由100多个executor进行执行。任务执行一段时间后,driver只分配了几个task给其中的几个Executor执行,其他大部分executors全部处于空闲状态。回顾Spark Task调度过程这个网上文章很多,不再重复。简单说一下其中几个过程:Spark 对Job进行切分成Stage,每个Stage原创 2020-11-04 12:00:58 · 890 阅读 · 0 评论 -
使用Prometheus监控Spark任务
BackGroud目前spark支持Graphite打点,但是Graphite默认会为每个打点生成对应的文件,直接只有两个点数据,graphite生成的文件也有200多k,对Graphite造成很大的压力。所以考虑使用Prometheus来代替Graphite。Prometheus的打点默认是pull模式,和Graphite不同,而Spark3.0 新加的打点方式也是K8S友好的。所以还是考虑 使用Prometheus结合Graphite Exporter 的方式。Graphite Exporter原创 2020-08-03 15:47:12 · 1864 阅读 · 0 评论 -
学习Parquet文件格式
文章目录学习目的Parquet文件存储结构学习目的parquet文件作为列存的存储结构parquet文件的读写主要流程和调用接口spark对parquet文件读写的优化spark是如何实现向量化数据读取的Parquet文件存储结构例如一个实际的parquet文件meta信息parquet-tools meta --debug part-00000-95a6898f-c2aa-4e89-86a6-4f17a2a8fe26.c000.snappy.parquetcreator:原创 2020-07-09 12:20:20 · 1308 阅读 · 1 评论 -
Spark 3.0 测试与使用
Compatibility with hadoop and hiveSpark 3.0 官方默认支持的Hadoop最低版本为2.7, Hive最低版本为 1.2。我们平台使用的CDH 5.13,对应的版本分别为hadoop-2.6.0, hive-1.1.0。所以尝试自己去编译Spark 3.0 来使用。编译环境: Maven 3.6.3, Java 8, Scala 2.12Hive版本预先编译因为Hive 1.1.0 实在是太久远了,很多依赖包和Spark3.0中不兼容,需要需要重新编译。hi原创 2020-06-29 15:28:29 · 1923 阅读 · 0 评论 -
Spark动态资源分配的资源释放过程及BlockManager清理过程
文章目录Spark动态资源分配过程中YarnScheduler 释放资源过程SchedulerBackend, TaskScheduler 和 ExecutorAllocationManager 的创建ExecutorAllocationManagerCoarseGrainedSchedulerBackendo.a.s.scheduler.cluster.YarnSchedulerEndpointo.a.s.deploy.yarn.ApplicationMasterBlockManager 清理Broadc原创 2020-06-23 20:57:07 · 2064 阅读 · 0 评论 -
Spark TroubleShooting整理
文章目录FileSourceScanExec 进行Parquet文件Split策略有问题问题描述:Debug日志相关排查日志FileSourceScanExec 进行Parquet文件Split策略有问题问题描述:一个十几M的parqeut文件在线上会被切分为好几个Task同时运行,运行的时候只有其中一个Task实际读了文件,其余的Task都是读了空文件。原因: 因为虽然我们在对parquet文件进行了切割,在读取parqeut文件的时候会根据split读取的start和length去获取对应的Ro原创 2020-06-11 11:00:00 · 606 阅读 · 0 评论 -
async-profiler 和 honest-profiler 编译和测试
yum remove automake autoconf cppunit-devel libtoolwget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz tar -zxvf autoconf-2.69.tar.gz cd autoconf-2.69./configuremake;make installautoconf -...原创 2019-01-22 09:18:00 · 849 阅读 · 0 评论 -
实现自定义Spark优化规则
文章目录Catalyst optimizer实战编写一个优化规则编写优化规则注册优化规则测试结果添加钩子和扩展点功能编写自定义优化规则和扩展点配置并启用自定义Spark扩展测试优化规则参考文档Catalyst optimizerSpark SQL 使用一个叫 catalyst 的优化器对所有使用 spark sql 和 dataframe dsl的查询进行优化。经过优化的查询会比使用RDD直接...原创 2020-03-04 02:09:41 · 2502 阅读 · 2 评论 -
Spark RPC
文章目录RpcEndpoint & RpcEndpointRef & NettyRpcEndpointRef RPC 调用接口NettyRpcEnv 发送消息RpcOutboxMessageOutboxInbox网络通信模块RpcEndpoint & RpcEndpointRef & NettyRpcEndpointRef RPC 调用接口SparkEnv : ...原创 2020-01-10 16:29:29 · 313 阅读 · 0 评论 -
Spark Analyze收集stats信息实现和CBO stats信息estimate
AnalyzePartitionCommand 分析表信息并存储到cateloganalyze 可以实现数据对数据表的size, row_number 的统计,并存储到元数据中,对后续cbo 优化有非常重要的作用newTotalSize: BigInt = CommandUtils.calculateLocationSize() : 计算指定文件夹下的数据文件夹下的数据文件大小newRow...原创 2019-12-19 21:40:37 · 2180 阅读 · 0 评论 -
Delta File Fomat 3:Delta数据文件的写入
文章目录DataSource回顾 及 DeltaDataSource 说明SaveIntoDataSourceCommand 对象的生成Spark Run Command 对象DataSource回顾 及 DeltaDataSource 说明先回顾一下上节说的Spark对于文件的读写,是对应文件格式的reader或writer操作内部加载到DataSource封装出来的对象来实现的。Delt...原创 2019-10-20 21:23:21 · 766 阅读 · 0 评论 -
Delta File Fomat 2:扩展Spark读取Delta文件
文章目录DataSourceSpark 对外暴漏的读写文件的入口:writer.save() 方法DataFrameReader.load() 方法java.util.ServiceLoader扩展Spark 支持的DataSourceDataSourceDataSource 是Spark用来描述对应的数据文件格式的入口,对应的Delta也是一种数据文件格式,所以了解DataSource实现原...原创 2019-10-19 17:18:18 · 803 阅读 · 0 评论