![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Spark
文章平均质量分 68
彼岸枫雪非
一个技术很一般的程序媛
展开
-
记一个Spark2.3 JDBC连接thriftServer 创建临时函数的bug
使用jdbc连接thrift,上传依赖jar到hdfs并创建临时udf'函数,而后删除jar,运行时间过久后,其他sql的task 会报File XX does not exist 错误,该问题的原因时什么呢?又该如何解决呢?原创 2020-05-14 18:17:57 · 884 阅读 · 0 评论 -
Spark Job调度模式源码学习
spark的有FIFO和Fair两种Job调度方式,本文将从算法源码实现入手,持续探索Spark job调度的设计和实现,并进一步深入job调度相关的源码(如资源池)。原创 2020-05-08 18:48:44 · 422 阅读 · 0 评论 -
记一次spark compact 事务表小文件失败的问题
目录问题描述问题定位问题解决方案问题描述我们生产的spark集群维护了大量的事务表,需要频繁进行增删改操作,这个过程会产生非常多的delta文件。小文件过多时,读写性能会有严重的下降,因此我们开发了一个定时合并小文件的功能。最近生产的运维反映合并的过程会频繁出错,task的报错内容如下图:从图中可以看出来,实际合并的表和最后写入的时候表不是同一个表,bucket数量也不一致。文件的bucke...原创 2020-05-08 12:20:35 · 493 阅读 · 1 评论 -
spark性能优化之DataSource表limit操作下推实现kudu limit查询性能千倍提升
文章目录问题描述解决方案测试结果总结问题描述我们的 spark基于DataSource V1版本,整合了kudu表,可以直接使用sql操作读写kudu表。目前我们的kudu-client使用的1.7.1版本,随着kudu表的使用场景不断增加,kudu的查询的性能也暴露出来很多问题。此外,随着kudu版本的升级,支持了许多新特性。比如,1.9版本的kudu支持了limit操作,且limit的性能...原创 2020-04-02 16:07:40 · 1250 阅读 · 2 评论 -
Spark无法Heartbeat长事务问题的解决方案
我们对spark的源码进行了大量的修改,使得其能够支持事务表,能够对orc表进行update,delete等操作。上文我们提到spark事务o状态残留问题解决,但是该解决方案缺却引发了一个问题,即长事务的情况下会导致数据出错。原创 2020-04-02 10:38:17 · 869 阅读 · 0 评论 -
关于hive事务表o状态残留问题的解决
上次我写过一篇文章https://blog.csdn.net/u012543819/article/details/104540056,其中讲到,在hiveserver异常挂掉的情况下,可能会导致部分事务为o状态且残留在TXNS元数据表中。通过仔细研究TxnHandler的代码,我发现其中有一个方法叫timeOutTxns,其实它核心也就是去修改TXNS表中超时的o状态事务为a状态,以便后续的...原创 2020-04-01 19:10:42 · 688 阅读 · 0 评论 -
Spark default 分区为空时无法查询的问题解决
在创建了spark动态分区表时,如果插入数据时,分区值为null或者’‘, spark会将分区值设置成默认值:__HIVE_DEFAULT_PARTITION__这里,spark2.3在处理的时候,会忽略分区值为null的数据,因此会存在如下select语句查询不到结果的情况:select * from t where p =’__HIVE_DEFAULT_PARTITION__‘...原创 2020-02-27 16:52:32 · 1017 阅读 · 0 评论 -
Exception in thread "main" java.lang.NoSuchMethodError: org.codehaus.commons.compiler.Location
今天写sparksql 应用出现了这个问题: Exception in thread "main" java.lang.NoSuchMethodError: org.codehaus.commons.compiler.Location.<init>(Ljava/lang/String;SS)V at org.codehaus.janino.Scanner.location(...原创 2018-11-05 11:28:11 · 4821 阅读 · 0 评论 -
关于spark -sql 时间戳类型比较的一个小坑
最近项目组的大哥遇到一个奇怪的问题。spark表插入的时间戳数据带毫秒,但是最后的毫秒数据都是0,即如下格式:2018-08-31 16:46:30.0这种情况下,在做如下条件查找时,就无法匹配下相等的数据,即如果表中有2018-08-31 16:46:30.0这样一条数据,这个数据是查询不出来的。select * from t1 where time <= '2018-0...原创 2018-09-03 14:39:38 · 7942 阅读 · 0 评论 -
spark-sql 时间戳类型比较源码修改
上次说到时间戳和字符串比较时会把时间戳cast成string 再做比较关于spark -sql 时间戳类型比较的一个小坑,这个过程中对精度做了处理。项目组的大哥最近频繁使用毫秒值为0的数据进行查询比较。他觉得这是一个bug,让我去修改一下。首先我分析了一下生成的物理计划,发现>=,<= 时会发生cast as string的强转。<=>和的情况并没有显示调用...原创 2018-09-04 18:02:23 · 1286 阅读 · 0 评论 -
Spark2.3实现 sqlserver函数for xml
sqlserver支持for xml path()语法,将返回结果嵌套在指定的xml标签中。项目组之前在spark2.0上实现了该功能。迁移到2.3时,由于原生spark修改较多,出现了很大的兼容问题。我的工作就是让这个函数重新运作起来。菜鸟真的被折磨的很痛苦,所幸还是成功解决了问题。1. 语法说明关于sqlserver中 for xml path的语法,大致就是将指定字段和连接的字符串包...原创 2018-08-23 15:08:56 · 760 阅读 · 0 评论 -
Spark2.3 在sql自定义IsNumeric 函数
博主前端时间一个在看Spark-core的源码。最近因为项目上的事,赶鸭子上架被叫过去改bug了。因为项目组对spark源码做了很多修改,这次在迁移到spark2.3时,需要把之前修改的功能也一并迁移过来。遇到的第一个问题就是实现一个IsNumeric 。这是其他RDB中sql支持的函数,原生spark-sql暂不支持。接下来我们看一下实现流程:1. 定义函数表达式先找到arithme...原创 2018-08-23 11:32:19 · 742 阅读 · 0 评论 -
菜鸟的Spark 源码学习之路 -7 Storage管理源码 -part1 BlockManagerMaster
上一次我们了解内存管理中MemoryPool的源码实现,这一次我们从下往上,学习spark的存储管理。Storage包结构如下:本次我们从Block的管理入手开始学习存储管理。从上面的包中我们可以看出,Block管理主要包含BlockManagerMaster和BlockManager两个部分。BlockManager和MemoryManager一样是SparkEnv中的一个组件,如下图所...原创 2018-08-13 19:17:10 · 189 阅读 · 0 评论 -
菜鸟的Spark 源码学习之路 -4 DAGScheduler源码 - part2
上文中分析了DAGScheduler的基本功能Dagscheduler-1,本文主要深入分析一下Job提交和相关处理。首先看一下相关的方法和数据结构:这些结构大多都是HashMap。1. Job的提交过程首先是在SparkContext.submitJob提交job,调用的是dagScheduler.submitJob方法/** * Submit a job for ...原创 2018-08-09 18:25:12 · 178 阅读 · 0 评论 -
菜鸟的Spark 源码学习之路 -4 DAGScheduler源码 - part3
上文中,DAGScheduler-02我们了解到DagScheduler的Job提交和管理。接下来我们看一下DAGSCheduler中的一个重要的组件:DAGSchedulerEventProcessLoop,它是处理消息的组件。之前我们看到,Job和task等的提交、管理过程很多都是调用该组件的post方法发送一个event。我们先看一下DAGScheduler 里面它的定义和初始化:...原创 2018-08-10 11:28:50 · 348 阅读 · 0 评论 -
菜鸟的Spark 源码学习之路 -5 Executor源码
前面几篇文章DAGScheduler -1DAGScheduler -2DAGScheduler -3对DagScheduler的源码进行了学习。本篇开始,将对Spark的Task执行组件Executor进行学习。1.结构概览首先我们看一下Executor包中都有哪些类和对象:不是非常地复杂。接下来进入正题,看下Executor的内部结构,同样是包含Execut...原创 2018-08-10 15:56:41 · 600 阅读 · 0 评论 -
菜鸟的Spark 源码学习之路 -6 Memory管理源码 -part1 功能概览
菜鸟的Spark 源码学习之路 -5 Executor源码 中,我们深入了解了Spark Executor的源码。Spark本身是一个内存计算框架,任务的执行肯定离不开内存管理。所有,这次我们打算继续探索Spark的内存管理。先看下这个包里面都有些什么牛鬼蛇神:看下这个包的功能描述:/** * This package implements Spark's memory mana...原创 2018-08-10 17:16:48 · 351 阅读 · 0 评论 -
菜鸟的Spark 源码学习之路 -6 Memory管理源码 -part2 MemoryManager
上文中 菜鸟的Spark 源码学习之路 -6 Memory管理源码 -part1 功能概览,对Spark Memory管理的实现做了一个整体的了解,这次我们从MemoryManager开始深入了解spark 内存管理:首先看一下MemoryManager的结构:这里有几个重要的数据结构:// -- Methods related to memory allocation poli...原创 2018-08-13 11:06:57 · 332 阅读 · 0 评论 -
菜鸟的Spark 源码学习之路 -8 Shuffle
上一次研究的BlockManager相关的源码实现。本次进入Shuffle管理的学习。Shuffle是spark的一个重要的过程抽象,它涉及到以下几个问题:1. 数据重新分区2.数据传输3.数据压缩4.磁盘IO1. 结构概览我们先看一下Shuffle包的类和对象组成,包括java和scala两部分:Spark2.x后,原有的MapShuffleManager已经...原创 2018-08-14 16:00:44 · 454 阅读 · 0 评论 -
菜鸟的Spark 源码学习之路 -8 RDD
前文对shuffle的过程进行了学习,shuffle操作本身是基于RDD之间的依赖关系,在RDD之间产生宽依赖是则会有Shuffle。RDD是Spark中最重要的数据抽象。本文开始,我们将学习SparkRdd的实现细节。1. 概览/** * A Resilient Distributed Dataset (RDD), the basic abstraction in Spark. ...原创 2018-08-15 15:03:15 · 356 阅读 · 0 评论 -
菜鸟的Spark 源码学习之路 -8 RDD-依赖关系
RDD之间的依赖关系,是spark stage划分的重要依据。总所周知,RDD和它依赖的父RDD(s)的关系有两种不同的类型,即窄依赖(narrow dependency),宽依赖(wide dependency)。 stage的划分就在宽依赖和窄依赖的边界处,一旦RDD间存在宽依赖,则会有shuffle产生。本文我们就来看一下spark如何抽象RDD之间的依赖关系。1. 窄依赖Nar...原创 2018-08-15 15:38:27 · 237 阅读 · 0 评论 -
菜鸟的Spark 源码学习之路 -6 Memory管理源码 -part3 MemoryPool
上文中讲到MemoryManager的源码,它跟踪计算内存和存储内存的使用情况,提供内存管理的入口,这次我们就从计算内存和存储内存两个方向深入学习spark的内存管理。1. ExecutionMemoryPool/** * Implements policies and bookkeeping for sharing an adjustable-sized pool of memor...原创 2018-08-13 15:28:42 · 330 阅读 · 0 评论 -
菜鸟的Spark 源码学习之路 -4 DAGScheduler源码 - part1
前面的几篇文章中,我们深入理解的taskScheduler的task提交,管理,资源的管理等,对TaskScheduler有了一个比较系统的了解:TaskSheduler part1TaskSheduler part2TaskSheduler part3这次,我们回到SparkContext中,看一下Spark的另一个重要的组件,DAGScheduler。定义:@vola...原创 2018-08-09 15:50:51 · 215 阅读 · 0 评论