Spark学习
文章平均质量分 82
淡定一生2333
这个作者很懒,什么都没留下…
展开
-
了解下SparkSQL中的笛卡尔积
了解下SparkSQL中的笛卡尔积原创 2022-09-17 23:01:28 · 1742 阅读 · 0 评论 -
为什么企业都会去优化Spark Shuffle Service
了解remote shuffle service转载 2022-07-03 16:08:08 · 526 阅读 · 0 评论 -
with as 语句真的会把查询的数据存内存嘛?
最近有好几个朋友都有咨询这个问题,大概有两类:1、为啥我用了with..as效率没有提高?2、sql跑不动,改成with..as的写法,会不会更好些?网上博客几乎都有结论with ... as语句会把数据放在内存:hive-sql在hive中有一个参数hive.optimize.cte.materialize.threshold这个参数在默认情况下是-1(关闭的);当开启(大于0),比如设置为2,则如果with..as语句被引用2次及以上时,会把with..as转载 2022-02-08 17:05:55 · 595 阅读 · 0 评论 -
Spark SQL 自适应执行优化引擎(转载)
在本篇文章中,笔者将给大家带来 Spark SQL 中关于自适应执行引擎(Spark Adaptive Execution)的内容。在之前的文章中,笔者介绍过 Flink SQL,目前 Flink 社区在积极地更新迭代 Flink SQL 功能和优化性能,尤其 Flink 1.10.0 版本的发布,在增强流式 SQL 处理能力的同时也具备了成熟的批处理能力。但是在 SQL 功能完整性和生产环境的实践应用等方面,Spark SQL 还是更胜一筹,至于 SQL 批处理方面性能优劣,则需要笔者亲自去实践。转载 2021-08-29 22:50:02 · 2123 阅读 · 0 评论 -
SparkSQL运行流程浅析
写了有相当长一段时间的SparkSQL了,所以结合网上其他大神的分析,写一篇文章,谈谈我对SparkSQL整个运行流程的一个简单的理解。哈哈,毕竟程序员要做到知其然,还要知其所以然不是。SparkSQL的核心是Catalyst,SQL语句的解析以及最终执行计划的运行都是Catalyst来实现的,所以对SparkSQL的学习就是对Catalyst的学习。SparkSQL(Catalys)整体流程介绍:无论是使用 SQL语句还是直接使用 DataFrame 或者 DataSet ...原创 2021-07-27 22:58:16 · 2102 阅读 · 1 评论 -
(转载)Spark任务输出文件过程详解
一、Spark任务输出文件的总过程当一个Job开始执行后,输出文件的相关过程大概如下:1、Job启动时创建一个目录: ${output.dir}/_temporary/${appAttemptId} 作为本次运行的输出临时目录2、当有task开始运行后,会创建 ${output.dir}/_temporary/${appAttemptId}/_temporary/${taskAttemptId}/${fileName} 文件,后面这个task的所有输出都会被写到这个文件中3、当task运行完转载 2021-04-20 22:00:03 · 1163 阅读 · 0 评论 -
Spark中的等值Join策略解析
最近工作中SparkSQL写了也不少了,整天Join来Join去的,哈哈哈,所以来了解下Join的底层原理吧,不想把Join当个黑盒一样的去使用。Spark支持Inner、full outer、left join、right join 、leftsemi、leftanti、cross这几种Join方式,具体每种Join得到的结果是啥,这里就不一一解释了,可见"参考一"中的内容...本人一般常用的也就是Inner 、outer、 left join和 leftsemi使用的多一点,其他几个暂时用的还...原创 2021-04-12 23:15:29 · 1556 阅读 · 0 评论 -
Spark读写Hive表导致cache失效问题
最近写spark程序的时候发现了一个奇怪问题。我cache了两个DataFrame,暂且称它们为A和B好了,然后将A和B通过SQL语句以inser overwrite的方式分别写入到两张Hive表中。但是发现如果我先将A写入再写入B,B这个DataFrame会触发重新计算...曾经一度以为自己触发了Spark某个未知的Bug,但是突发奇想将代码的顺序换了一下,先写入B再写入A,发现cache又是生效的。两者的执行计划分别如下所示,确实一个走了cache,另外一种没走:找了半天终于在Spar...原创 2021-03-07 23:22:06 · 923 阅读 · 0 评论 -
Spark的动态Executor机制
最近在Spark程序运行的过程中发现了一个问题,系统每天会运行很多任务,任务计算逻辑是一样的,但是每个任务拉去的数据量有多有少,不知道怎么给Spark程序设置多少资源比较合理。这时候Spark的动态Executor分配机制就派上用场了,它会根据当前任务运行的情况自动调整Executor的数量,实现资源的弹性分配。Spark的动态Executor分配机制介绍://开启Dynamic Resource Allocationspark.dynamicAllocation.enabled=true.原创 2020-12-20 23:01:48 · 3212 阅读 · 0 评论 -
Spark的容错机制
项目中会经常使用到Spark和Flink这些分布式框架,使用的时候老是担心如果出现异常了会怎样,今天就来了解下Spark以及Flink的容错机制。 容错是指一个系统部分出现错误的情况还能持续的提供服务,当集群达到较大的规模以后,很可以出机器故障以及网络延迟等情况,导致某个节点不能提供服务,所以分布式框架一般都会进行高容错设计。Spark的容错机制:Master异常退出: 个人理解是,只有StandAlone模式下才需要额外进行Master容错配置。如果是On Yar...原创 2020-08-01 16:35:24 · 3653 阅读 · 0 评论 -
整理一些Spark数据倾斜解决的思路
项目中经常会使用到Spark进行批处理,数据量大的时候总是会遇到数据倾斜的情况,参考了项目中遇到的情况以及网上的一些案例,写篇文章来总结下如何处理Spark中常见的数据倾斜问题。当然由于业务场景不一样,本文说到的一些解决数据倾斜的思路肯定不全,如果有更好的方法,方便的话在评论里也告诉我一下哈。啥叫数据倾斜: Spark的RDD由多个Partition组成,如果某个Partition的数据比其他Partition的数据要多很多,这个就是数据倾斜,如下图所示: 数据倾斜...原创 2020-06-22 23:45:10 · 2024 阅读 · 0 评论 -
Spark中多个任务间的调度逻辑
本文想要了解一个问题,如果多个线程通过同一个SparkSession提交作业,不同线程间的作业是怎么调度的,工程中Spark使用的是FIFO模式。单个Spark作业详细的运行流程可见之前写的那篇文章《Spark-Job执行流程分析》。这里简单提一下,一个action操作会被DAGScheduler根据Shuffle关系拆分成多个stage,同一个action中的stage是串行执行的。每个st...原创 2020-03-12 22:27:12 · 1156 阅读 · 0 评论 -
IDEA中直接提交Spark任务
记录下如何在Widows下的IDEA中直接提交Spark on yarn任务。由于项目使用的是Spring Boot,这里提交任务指的是在IDEA中启动Spring Boot工程,然后发送一个Rest请求,触发Spark on yarn程序的运行。启动一个Spring Boot工程挺快的,引用两个jar包就搞定了。正常流程:1.配置Hadoop环境变量详见“参考一”或者下...原创 2019-11-07 19:44:12 · 1838 阅读 · 0 评论 -
Spark saveAsNewAPIHadoopDataset算子将数据写入到HBase底层实现分析
因为组内要做一次Spark读写HBase的分享,之前写过一篇Spark读取HBase数据分析的文章,这一次来分析下Spark是如何将数据写入到HBase中的。本文只打算分析下saveAsNewAPIHadoopDataset算子的写入方式,有其他方式后续再另外分析。 算子使用示例如下: val sc = sparkSession.sparkContext ...原创 2019-09-07 16:49:04 · 4035 阅读 · 1 评论 -
SparkOnYarn与StandAlone模式的区别
了解了Yarn上的程序如何启动之后(详情《Yarn初步了解》),本文来分析一下Spark On Yarn程序的启动流程,具体来说是Client模式下Spark On Yarn程序是如何启动的。Spark on Yarn是如何运行起来的: 从SparkContext的启动开始看进去。SparkContext初始化内部具体细节可以看下本人之前写的《SparkContext初始化流...原创 2019-08-31 16:05:27 · 4460 阅读 · 4 评论 -
SparkSQL使用整理(二)
整理下一些常用到的DataFream和DataSet的API,如何从RDD产生DataFrame和DataSet可以看下之前写的文章“SparkSQL使用整理(一)”。 本文中读取的people.json文件就是spark例子中自带的people.json文件,本文接下来举的例子都是对这个json文件生成的DataFrame进行操作。一些算子使用示例:1.selec...原创 2019-05-15 20:22:36 · 742 阅读 · 0 评论 -
HashPartitioner 与 RangePartitioner
Partitioner决定了KV类型RDD中一条数据在Shuffle的时候属于后续哪一个分区,它和数据倾斜有很密切的联系。所以这里来学习下常用的HashPartitioner和RangePartitioner的内部实现是如何实现的,为什么会造成数据倾斜?为什么有时候repartition()一把能解决数据倾斜问题?没有指定Partitioner和分区数的情况下: 一...原创 2019-03-19 21:46:51 · 2206 阅读 · 0 评论 -
SparkSQL使用整理(一)
1. Import spark.implicits._ 的作用支持在DataFrame中使用 $”列名” 这个语法糖,表示的是Column对象df.select($"name").show()如果不加$,那么就会当一个String来处理支持把一个RDD隐式转换为一个DataFrame---- 引申: 目前Spark官网提供了三种方法来实现从RDD转DataFrame...原创 2018-09-04 10:50:13 · 2526 阅读 · 0 评论 -
RDD计算时是把数据全部加载至内存么
RDD的本质RDD的本质是一个函数,而RDD的变换不过是函数的嵌套.RDD有两类:输入的RDD: 典型如KafkaRDD,JdbcRDD 转换的RDD: 如MapPartitionsRDDRDD的处理流程:以如下代码为例:sc.textFile("abc.log").map().saveAsTextFile("")1. textFile 会构建出一个NewHad...原创 2018-09-26 20:15:08 · 2941 阅读 · 4 评论 -
SparkContext初始化流程
SparkContext的初始化,包括事件总线(LiveListenerBus),UI界面,心跳,JobProcessListner,ExecutorAllocationManager(资源动态分配管理)等等等等,总之就是有很多东西,这里我只选取几个自认为是核心的东西介绍一下:DAGScheduler: 负责创建Job,RDD的Stage划分以及提交,还有一些监控数据 TaskSchedul...原创 2018-11-10 23:11:50 · 2685 阅读 · 0 评论 -
HBase拉取数据和Spark拉取数据的区别
HBase架构图如下所示:HMaster:一个集群中有多个HMaster,但是只有一个处于Active状态。HMaster通过连接Zookeeper感知集群上哪些HRegionServer是活着的及它们所在的位置,然后管理RegionServer。HRegionServer:就是一台服务器,一个RS会管理多个HRegion,每个HRegion有多个Store,每个Store对应一个列簇...原创 2018-11-10 23:19:33 · 1732 阅读 · 0 评论 -
Application注册及Executor启动过程分析
接上一篇”SparkContext初始化流程”,其中在初始化***SchedulerBackend那里提到了,在那里会创建一个AppClient对象,用于和Spark集群交互注册App,申请并启动Executor,本篇就来分析下注册App和启动Executor的流程。 先描述下流程:1. SparkContext启动过程中,AppClient会向Master发送RegisterAppl...原创 2018-11-19 22:36:34 · 790 阅读 · 0 评论 -
Spark-Job执行流程分析
在“Application启动流程分析”文章的第4步提到了,driver接收到Executor发送的RegisterExecutor消息之后,通过makeOffers()将任务随机分发给Executor。Executor(即CoarseGrainedExecutorBackend)收到后会将Task封装成TaskRunner对象,然后提交到Executor的线程池中去执行。Executor的线程池...原创 2018-12-10 22:38:35 · 2034 阅读 · 0 评论 -
Spark的Shuffle(0) - Shuffle的一些概念
在之前的那篇“Spark的Job是如何运行的”文章中曾经提到过ShuffleMapTask中的Shuffle操作会将中间结果写到磁盘上,本篇文章主要是介绍Shuffle相关的一些概念,然后后续写文章对Shuffle的具体细节进行分析。 Spark的Shuffle和Map/Reduce的Shuffle有什么异同:相同的地方:是两者最终的逻辑是相同的,Shuffle的过程实际上就是一个...原创 2019-01-07 22:50:09 · 674 阅读 · 0 评论 -
Spark的内存管理机制
本来是想着直接分析下UnsafeShuffleWriter源码内部是怎么实现的,碰到的一个尴尬的问题是代码内部涉及到了很多关于内存分配相关的代码,而且它使用了Tungsten优化,更加看不懂细节了,所以决定先了解下Spark的内存管理机制然后再看Shuffle的实现。之前在“SparkContext初始化流程”那篇文章中提到过,内存管理是MemoryManager实现的,在SparkEnv中被...原创 2019-01-13 23:12:25 · 602 阅读 · 0 评论 -
Spark的Shuffle(一) - SortShuffleWriter
上一篇“shuffle的一些概念”中提到了三种shuffle的方式,此处先来分析下SortShuffleWriter,结合代码一起调试下看看它内部到底是如何运行的。选择带有聚合的算子调试就行了,例如对一个pairRDD进行reduceByKey操作,然后就可以跳到对应的源码里面了,可以看出reduceByKey算子使用的是确实是SortShuffleWriter:直接跑到运行Task的...原创 2019-01-08 23:08:58 · 1163 阅读 · 0 评论 -
Spark的Shuffle(二) - UnsafeShuffleWriter
这一篇分析下UnsafeShuffleWriter这种Shuffle方式,之前在“Spark的Shuffle(0) - Shuffle的一些概念”那篇文章提到过这种Shuffle的情况,这里再说一遍防止自己忘了:Shuffle dependency不能带有aggregation操作 序列化方式需要支持重定位,即使用KryoSerializer或者SparkSQL自定义的一些序列化方式 Pa...原创 2019-01-15 23:04:42 · 1593 阅读 · 4 评论 -
Spark的Shuffle(三) -BypassMergeSortShuffleWriter
来介绍一下最后一种Shuffle的方式ByPassMergeSortShuffleWriter,它和已经废弃的HashShuffleWriter类似,区别在于map端的多个文件会被汇总成一个文件,这样就大大减少了磁盘IO的压力。 ByPassMergeSortShuffleWriter流程示例如下:使用这种Shuffle方式需要满足两个条件:没有定义mapSideCom...原创 2019-02-01 17:51:49 · 1470 阅读 · 1 评论 -
从reduceByKey执行过程分析ShuffleReader
Spark是以Shuffle作为Stage的分界的,Shuffle分为ShuffleWrite和ShuffleRead两个过程。ShuffleWriter负责将中间结果写到磁盘上,可以理解为是当前Stage结束的收尾操作;最后ShuffleRead用于读取ShuffleWrite生成的Shuffle文件,可以理解为它是下一个Stage开始的那个操作;之前已经分析过三种ShuffleWrit...原创 2019-02-01 18:08:07 · 1499 阅读 · 1 评论 -
Spark拉取HBase数据时遇到的问题
问题1:org.apache.spark.shuffle.MetadataFetchFailedException: Missing an output location for shuffle 5 从堆栈日志中可以看出,是BlockStoreShuffleReader在读取Shuffle到磁盘上的数据的时候发生的错误。从源码中可以看出,MapStauts==null才会跑出这个...原创 2019-03-09 14:51:08 · 1150 阅读 · 0 评论 -
在IDEA中直接提交Spark任务
如果在本地安装了Spark,那么就不需要在本地启动一个类似tomcat或者jetty的server如果没有一般会启动一个jetty,否则无法和Spark通信 这里所说的本地提交是指submit到Spark集群计算环境上的job,也就是一个Jar包,虽然拥有main方法,但是不能再IDEA中直接右键main函数来debug运行.因为不是一个独立的可运行的程序,而是运行在Spark环境上的,由另外一个...原创 2018-06-28 19:36:36 · 2164 阅读 · 3 评论