![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Spark
文章平均质量分 88
拾荒路上的开拓者
开拓,前行!矫情?不存在的……
展开
-
Spark shuffle相关参数调优
Spark Shuffle是比较消耗性能的环节,本文对涉及shuffle过程的部分参数进行讲解,方便在使用Spark编写任务时进行调优。spark.shuffle.file.buffer默认值:32参数说明:该参数用于设置shuffle write task的BufferedOutputStream的buffer缓冲大小。将数据写到磁盘文件之前,会先写入buffer缓冲中,待缓冲写满之后,才会溢写到磁盘。调优建议:如果作业可用的内存资源较为充足的话,可以适当增加这个参数的大小(比如64k),从而减少原创 2022-03-14 09:18:43 · 646 阅读 · 0 评论 -
浅谈Spark Shuffle机制
1 概述大多数Spark作业的性能主要就是消耗在了shuffle环节,因为该环节包含了大量的磁盘IO、序列化、网络数据传输等操作。因此,如果要让作业的性能更上一层楼,就有必要对shuffle过程进行调优。但是也必须提醒大家的是,影响一个Spark作业性能的因素,主要还是代码开发、资源参数以及数据倾斜,shuffle调优只能在整个Spark的性能调优中占到一小部分而已。因此大家务必把握住调优的基本原则,千万不要舍本逐末。下面我们就给大家详细讲解 shuffle 的原理,以及相关参数的说明,同时给出各个参数原创 2022-03-01 19:52:42 · 665 阅读 · 0 评论 -
SparkStreaming简易实现Kafka偏移量保存
import kafka.common.TopicAndPartitionimport kafka.message.MessageAndMetadataimport kafka.serializer.StringDecoderimport org.apache.spark.streaming.dstream.InputDStreamimport org.apache.spark.streaming.kafka.KafkaCluster.Errimport org.apache.spark.stre原创 2020-12-19 16:57:07 · 393 阅读 · 1 评论 -
SparkStreaming自定义数据源
object MyReceiverDemo { def main(args: Array[String]): Unit = { val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("MyReceiverDemo") val ssc = new StreamingContext(conf, Seconds(3)) val sourceStream原创 2020-12-18 23:27:42 · 255 阅读 · 1 评论 -
Spark配置JDBC连接数据的参数种类
在Spark配置JDBC连接关系型数据库时,可调优的参数比较多,但往往搜索时不好查,其实Spark提供了一个JDBCOptions类,配置了JDBC可配置的信息,如下:object JDBCOptions { private val curId = new java.util.concurrent.atomic.AtomicLong(0L) private val jdbcOptionNames = collection.mutable.Set[String]() private def原创 2020-09-15 09:37:30 · 1688 阅读 · 0 评论 -
Spark 2.4.0如何优雅地解决sparksql小文件过多的问题
在使用SparkSql进行项目开发的过程,往往会碰到一个比较头疼的问题,由于SparkSql的默认并行度是200,当sql中包含有join、group by相关的shuffle操作时,会产生很多小文件;从集群优化的角度来说,太多的小文件对NameNode的压力比较大,而且太多的小文件对后续使用该表进行计算时会启动很多必要的maptask,任务耗时高。因此,需要对小文件问题进行优化。在Dataset/Dataframe中有repartition/coalesce算子减少输出文件个数,但用户往不喜欢编写和部原创 2020-09-05 15:05:41 · 3321 阅读 · 2 评论 -
Spark driver获取每个task返回值方法
在Spark计算中,如果想要在driver端获取executor执行task返回的结果,在实际的操作中可能会想到2种方法:一是将每条数据打上标签输出到结果表中,再通过sql执行查询操作;二是通过Spark自定义累加器,就可以在executor端将结果累加到driver端使用,不过这种方式的效率也不高,具体的实现也很麻烦。下面介绍一种常用的简便操作方法:其实,这种操作我们最先想到的应该是co...原创 2020-03-19 23:57:05 · 839 阅读 · 0 评论 -
Spark的TaskScheduler启动后建立RPC通信的执行流程
在《Spark提交任务SparkSubmit执行流程》简单地描述了SparkSubmit后执行流程,但对TaskScheduler的启动方法start()执行后并没有详细介绍,本文针对TaskScheduler的执行进行深入探讨,学习其启动后的执行流程。在SparkContext实例化TaskScheduler后,执行TaskScheduler.start()方法启动TaskSchedul...原创 2020-03-15 14:15:22 · 216 阅读 · 0 评论 -
Spark提交任务SparkSubmit执行流程
很多人在使用Spark做计算时,都会对SparkSubmit Job之后执行流程比较模糊,尤其在Spark2.0之后正式使用Netty作为RPC通讯框架,在源码层对许多功能进行了抽象,这对一些Spark初学者来说,阅读源码是一件比较困难的事。不过笔者认为,虽然Spark2.0之后框架对功能层面做了很多的抽象工作,但其执行流程还没有什么改变。虽然笔者在工作已经使用了Spark2.2.1作为生产发行版...原创 2020-03-15 11:57:10 · 1436 阅读 · 0 评论 -
Spark中使用c3p0连接池
在Spark实时或离线计算的应用程序中,有时候需要将计算结果保存到数据库中,为了高效这里使用批量插入,结合c3po连接池,说明一下使用方法。数据计算完成后,在foreachRDD中批量插入数据,因为是针对每一个partiton的数据操作,所以使用 rdd.foreachPartition,这里是一个批量插入页面PV和UV的操作,代码如下://RDD[(String,Int,Int)] 的...原创 2020-03-14 14:32:01 · 893 阅读 · 0 评论 -
Spark读取resources目录中文件
在日常spark任务开发中,有时因为数据过程中的需求,需要加载一部分的文件,如csv、properties等。如果从spark提供的API中可以直接通过添加文件路径达到配置文件加载的目的,如下加载csv文件示例:val spark= SparkSession.builder().appName("demo").master("local[2]").getOrCreate()spark...原创 2020-01-16 23:21:02 · 4116 阅读 · 3 评论 -
Spark存储体系——内存存储MemoryStore
MemoryStore负责将Block存储到内存。Spark通过将广播数据、RDD、Shuffle数据存储到内存,减少了对磁盘I/O的依赖,提高了程序的读写效率。1MemoryStore的内存模型Block在内存中以什么形式存在呢?是将文件直接缓存到内存?Spark将内存中的Block抽象为特质MemoryEntry,其定义如下://org.apache.spark.storage...原创 2019-04-19 21:11:28 · 1842 阅读 · 0 评论 -
Spark调度系统——运行后端接口LauncherBackend
要介绍LauncherBackend,首先介绍下LaucherServer。当Spark应用程序没有在用户应用程序中运行,而是运行在单独的进程中时,用户可以在用户应用程序中使用LauncherServer与Spark应用程序通信。LauncherServer将提供Socket连接的服务端,与Spark应用程序中的Socket连接的客户端通信。LaucherServer的工作原理如下图:Ta...原创 2019-06-18 23:19:18 · 845 阅读 · 0 评论 -
Spark调度系统——Stage详解
DAGScheduler会将Job的RDD划分到不同的Stage,并构建这些Stage的依赖关系。这样可以使得没有依赖关系的Stage并行执行,并保证有依赖关系的Stage顺序执行。并行执行能够有效利用集群资源,提升运行效率,而串行执行则适用于那些在时间和数据资源上存在强制依赖的场景。Stage分为需要处理Shuffle的ShuffleMapStage和最下游的ResultStage。上游Stag...原创 2019-05-29 23:30:11 · 1681 阅读 · 0 评论 -
Spark调度系统——RDD详解
RDD(ResilientDistributedDatasets,弹性分布式数据集)代表可并行操作元素的不可变分区集合。1为什么需要RDD1.1数据处理模型RDD是一个容错的、并行的数据结构,可以控制将数据存储到磁盘或内存,能够获取数据的分区。RDD提供了一组类似于Scala的操作,比如map、flatMap、filter、reduceByKey、join、mapPartiti...原创 2019-05-29 21:24:44 · 523 阅读 · 0 评论 -
Spark调度系统——概述
简单来讲,Spark调度系统用于将用户提交的“任务”调度到集群中的不同节点执行。但是Spark实现的调度系统,并非一句话所概括的这么简单。Spark资源调度分为两层:第一层是ClusterManager(在YARN模式下为ResourceManager,在Mesos模式下为MesosMaster,在Standalone模式下为Master),将资源分配给Application;第二层是Appl...原创 2019-05-28 21:32:05 · 615 阅读 · 0 评论 -
Spark存储体系——Block传输服务
BlockTransferService是BlockManager的子组件之一,抽象类BlockTransferService有个实现类NettyBlockTransferService,BlockManager实际采用了NettyBlockTransferService提供的Block传输服务。为什么要把由Netty实现的网络服务组件也放到存储体系里,由于Spark是分布式部署的,每个Tas...原创 2019-05-28 20:42:06 · 653 阅读 · 0 评论 -
Spark存储体系——BlockManagerMaster对BlockManager的管理
BlockManagerMaster的作用是对存在于Executor或Driver上的BlockManager进行统一管理。Executor与Driver关于BlockManager的交互都依赖于BlockManagerMaster,比如Executor需要向Driver发送注册BlockManager、更新Executor上Block的最新信息、询问所需要Block目前所在的位置及当Execut...原创 2019-05-06 22:44:32 · 1421 阅读 · 0 评论 -
Spark常见的数据倾斜问题及解决方案
一、数据倾斜介绍与定位1、数据倾斜的原理在执行shuffle操作时是按照key来进行values的数据输出、拉取和聚合,同一个key的values,一定是分配到一个reducetask进行处理的。假如多个key对应的values总共是90万,可能某个key对应了88万数据,分配到了一个task上执行;另外两个task可能各分配到了1万数据,也可能是数百个key,对应的1万条数据。第一个...原创 2019-05-05 21:42:51 · 786 阅读 · 0 评论 -
Spark调度系统——面向DAG的调度器DAGScheduler
DAGScheduler实现了面向DAG的高层次调度,即将DAG中的各个RDD划分到不同的Stage。DAGScheduler可以通过计算将DAG中的一系统RDD划分到不同的Stage,然后构建这些Stage之间的父子关系,最后将每个Stage按照Partition切分为多个Task,并以Task集合(即TaskSet)的形式提交给底层的TaskScheduler。所有的组件都通过向DAGSc...原创 2019-06-14 20:43:51 · 797 阅读 · 0 评论 -
Spark调度系统——调度池Pool
TaskSchedulerImpl对Task的调度依赖于调度池Pool,所有需要被调度的TaskSet都被置于调度池中。调度池Pool通过调度算法对每个TaskSet进行调度,并将调度的TaskSet交给TaskSchedulerImpl进行资源调度。1调度算法调度池对TaskSet的调度取决于调度算法。特质SchedulingAlgorithm定义了调度算法的规范,代码如下://...原创 2019-06-14 23:36:32 · 2349 阅读 · 0 评论 -
Spark调度系统——任务集合管理器TaskSetManager
TaskSetManager实现了Schedulable特质,并参与到调度池的调度中。TaskSetManager对TaskSet进行管理,包括任务推断、Task本地性,并对Task进行资源分配。TaskSchedulerImpl依赖于TaskSetManager,本文将对TaskSetManager的实现进行分析。1Task集合DAGScheduler将Task提交给TaskSched...原创 2019-06-17 23:12:24 · 2343 阅读 · 0 评论 -
Spark on Yarn相关一些使用小技巧总结
1、Spark on Yarn 有两种模式,一种是cluster模式,一种是client模式。a.执行命令 “./spark-shell --master yarn” 默认运行的是client模式。b.执行 "./spark-shell --master yarn-client" 或者 "./spark-shelll --master yarn --deploy-mode client",...原创 2019-02-04 10:01:46 · 268 阅读 · 0 评论 -
SparkSQL连接查询中的谓词下推处理(2)
本文主要介绍的是外连接查询中的谓词下推规则,这相比内连接中的规则要复杂一些,不过使用简单的表格来进行分析也是可以分析清楚的。以左外连接查询为例,先总结规矩如下:接下来对这个表格中的规则进行详细的分析。1、左表join后条件下推select a.id, a.value, b.vlauefrom lefttable aleft join righ...原创 2019-09-13 16:48:12 · 303 阅读 · 0 评论 -
SparkSQL连接查询中的谓词下推处理(1)
1、SparkSQLSparkSQL是架构在Spark计算框架之上的分布式SQL引擎,使用DataFrame和DataSet承载结构化和半结构化数据来实现数据复杂查询处理,提供的DSL可以直接使用scala语言完成Sql查询,同时也使用thriftserver提供服务化的Sql查询功能。SparkSql提供了DataSource API,用户通过这套API可以自己开发一套Connector,直...原创 2019-09-13 15:53:19 · 623 阅读 · 0 评论 -
Spark是否开启动态资源分配
Spark提供了一种机制,使它可以根据工作负载动态调整应用程序占用的资源。这意味着,如果不再使用资源,应用程序可能会将资源返回给集群,并在稍后需要时再次请求资源。如果多个应用程序共享Spark集群中的资源,该特性尤其有用。默认情况下禁用此功能,并在所有粗粒度集群管理器上可用,即standalone mode,YARN mode,和Mesos coarse-grained mode。...转载 2019-07-07 09:10:34 · 472 阅读 · 0 评论 -
Spark计算引擎——概述
Spark的计算引擎主要包括执行内存和Shuffle两部分1执行内存执行内存主要包括执行内存、任务内存管理器(TaskMemoryManager)、内存消费者(MemoryCosumer)等内容。执行内存包括在JVM堆上进行分配的执行内存池(ExecutionMemoryPool)和在操作系统的内存中进行分配的Tungsten。内存管理器将提供API对执行内存和Tungsten进行管理(...原创 2019-07-03 23:19:05 · 705 阅读 · 0 评论 -
Spark调度系统——任务调度器TaskScheduler
任务调度器TaskScheduler定义了对任务进行调度的接口规范,允许向Spark调度系统插入不同的TaskScheduler实现,但目前只有TaskSchedulerImpl这一个具体实现。TaskScheduler只为单个Driver调度任务。TaskSchedulerImpl的功能包括接收DAGScheduler给每个Stage创建的Task集合,按照调度算法将资源分配给Task,将Tas...原创 2019-06-26 23:26:54 · 1214 阅读 · 1 评论 -
spark内存、GC及数据结构调优
一、基本概述调优内存的使用主要有三个方面的考虑:对象的内存占用量(可能希望整个数据集都适合内存),访问这些数据的开销,垃圾回收的负载。默认情况下,java的对象是可以快速访问的,但是相比于内部的原始数据消耗估计2-5倍的空间。主要归于下面三个原因:1)每个不同的Java对象都有一个“对象头”,它大约是16个字节,包含一个指向它的类指针。对于一个数据很少的对象(比如一个Int字段),这可...原创 2019-07-01 23:03:21 · 302 阅读 · 0 评论 -
Spark存储体系——块管理器BlockManager
BlockManager运行在每个节点上(包括Driver和Executor),提供对本地或远端节点上的内存、磁盘及堆外内存中Block的管理。存储体系从狭义上来说指的就是BlockManager,从广义上来说,则包括整个Spark集群中的各个BlockManager、BlockInfoManager、DiskBlockManager、DiskStore、MemoryManager、Memory...原创 2019-04-25 23:34:20 · 2393 阅读 · 1 评论 -
Spark存储体系——内存管理器
Spark与Hadoop的重要区别之一就在于对内存的使用。Hadoop只将内存作为计算资源,Spark除将内存作为计算资源外,还将内存的一部分纳入到存储体系中。Spark使用MemeoryManager对存储体系和内存计算所使用的内存进行管理。1内存池模型内存池实质是对物理内存的逻辑规划,协助Spark任务在运行合理地使用内存资源。Spark将内存从逻辑上区别为堆内存和堆外内存,称为内存...原创 2019-04-16 20:10:10 · 404 阅读 · 0 评论 -
Spark事件总线
Spark定义了一个特质ListenerBus,可以接收事件并且将事件提交到对应事件的监听器,其代码如下:private[spark] trait ListenerBus[L <: AnyRef, E] extends Logging { private[spark] val listeners = new CopyOnWriteArrayList[L] final def a...原创 2019-03-04 21:27:07 · 975 阅读 · 0 评论 -
Spark内置的RPC框架
在Spark中很多地方都涉及网络通信,比如各个组件间的消息互通、用户文件与Jar包的上传、节点间的Shuffle过程、Block数据的复制与备份等。在Spark 0.x.x与Spark 1.6.0前的版本中,组件间的消息通信主要借助于Akka,使用Akka可以轻松地构建强有力的高并发与分布式应用。虽然Akka作为一款优秀的分布式通信框架,但在Spark 2.0.0版本中被移除了,Spark官网文...原创 2019-03-03 11:05:48 · 464 阅读 · 0 评论 -
Spark配置——SparkConf源码剖析
Spark配置任何优秀的软件或服务都会提供一些配置参数,这些配置参数有些是内置的,有些则是可以由用户配置的。Spark作为一款优秀的计算框架,也配置了各种各样的系统配置参数。SparkConf是Spark的配置类,这个类在Spark的历史版本中已经存在很久了,Spark中的每一个组件都直接或者间接地使用着它所存储的属性,这些属性都存储在如下的数据结构中:private val setti...原创 2019-02-20 23:19:51 · 531 阅读 · 0 评论 -
Spark为何使用Netty通信框架替代Akka
导读一直以来,基于Akka实现的RPC通信框架是Spark引以为豪的主要特性,也是与Hadoop等分布式计算框架对比过程中一大亮点,但是时代和技术都在演化,从Spark1.3.1版本开始,为了解决大块数据(如Shuffle)的传输问题,Spark引入了Netty通信框架,到了1.6.0版本,Netty居然完全取代了Akka,承担Spark内部所有的RPC通信以及数据流传输。一、网络IO扫盲...原创 2019-02-18 23:15:32 · 1132 阅读 · 1 评论 -
Spark性能优化
1、分配更多的资源1.1 增加executor1.2 增加每个executor的cpu core增加executor的并行能力,一个cpu core运行一个task1.3 增加每个executor的内存1)如果需要对RDD进行cache,那么更多的内存就可以缓存更多的数据,将更少的数据写入磁盘,甚至不写入磁盘,减少了磁盘IO。2)对于shuffle操作,reduce端会需要...原创 2019-02-12 22:48:24 · 211 阅读 · 0 评论 -
浅谈Spark On Yarn运行原理
一、两种运行模式cluster模式:Driver程序在YARN中运行,应用的运行结果不能在客户端显示,所以运行那些将结果保存在外部存储介质(如HDFS、Redis、Mysql等)而非stdout输出的应用程序,客户端的终端显示仅是作为YARN的job简单运行状况。client模式:Driver运行在Client上,应用程序运行结果会在客户端显示,所有适合运行结果有输出的应用程序(如spar...原创 2019-02-15 22:48:01 · 808 阅读 · 0 评论 -
spark资源调度和任务调度流程
spark运行架构spark资源调度和任务调度流程:1、启动集群后,Worker节点会向Master节点汇报资源情况,Master掌握了集群资源情况。2、当Spark提交一个Application后,根据RDD之间的依赖关系将Application形成一个DAG有向无环图。任务提交后,Spark会在Driver端创建两个对象:DAGScheduler和TaskScheduler。...原创 2019-01-29 23:23:41 · 425 阅读 · 0 评论 -
Spark之foreach和foreachPartition的区别
一、基本使用1、RDD分布式数据集的五大特性1)A list of partitions(一系列的分区)2)A function for computing each split(计算每个分片的方法)3)A list of dependecies on other RDDs(一系列的依赖RDD)4)Optionally, a Partitioner for key_value ...原创 2019-01-28 23:02:06 · 1243 阅读 · 0 评论 -
Spark Dataset与RDD的persist默认级别的区别
一、Spark Dataset简述Dataset是从Spark 1.6开始引入的一个新的抽象,当时还是处于alpha版本;在Spark 2.0,它已经变成了稳定版了。下面是Dataset的官方定义:Dataset是特定域对象中的强类型集合,它可以使用函数或者相关操作并行地进行转换等操作。每个Dataset都有一个称为DataFrame的非类型化的视图,这个视图是行的数据集。RDD也...原创 2019-02-03 10:37:24 · 1518 阅读 · 0 评论