Spark
ITBOY_ITBOX
技术人生,管理天涯
展开
-
spark之JVM调优二:调节Executor堆外内存
Executor的堆外内存主要用于程序的共享库、Perm Space、 线程Stack和一些Memory mapping等, 或者类C方式allocate object。有时,如果你的Spark作业处理的数据量非常大,达到几亿的数据量,此时运行Spark作业会时不时地报错,例如shuffle output file cannot find,executor lost,task lost,out...原创 2019-06-11 07:49:11 · 809 阅读 · 0 评论 -
spark常规性能调优四:广播大变量
默认情况下,task中的算子中如果使用了外部的变量,每个task都会获取一份变量的复本,这就造成了内存的极大消耗。一方面,如果后续对RDD进行持久化,可能就无法将RDD数据存入内存,只能写入磁盘,磁盘IO将会严重消耗性能;另一方面,task在创建对象的时候,也许会发现堆内存无法存放新创建的对象,这就会导致频繁的GC,GC会导致工作线程停止,进而导致Spark暂停工作一段时间,严重影响Spark性能...原创 2019-06-10 22:12:02 · 175 阅读 · 0 评论 -
spark常规性能调优三:并行度调节
Spark作业中的并行度指各个stage的task的数量。如果并行度设置不合理而导致并行度过低,会导致资源的极大浪费,例如,20个Executor,每个Executor分配3个CPU core,而Spark作业有40个task,这样每个Executor分配到的task个数是2个,这就使得每个Executor有一个CPU core空闲,导致资源的浪费。理想的并行度设置,应该是让并行度与资源相...原创 2019-06-10 22:10:58 · 194 阅读 · 0 评论 -
spark常规性能调优二:RDD优化
1.RDD复用在对RDD进行算子时,要避免相同的算子和计算逻辑之下对RDD进行重复的计算,如图2-1所示:2.RDD的重复计算对图中的RDD计算架构进行修改,得到如图所示的优化结果: RDD架构优化3. RDD持久化在Spark中,当多次对同一个RDD执行算子操作时,每一次都...原创 2019-06-10 22:08:19 · 308 阅读 · 0 评论 -
spark常规性能调优一:最优资源配置
Spark性能调优的第一步,就是为任务分配更多的资源,在一定范围内,增加资源的分配与性能的提升是成正比的,实现了最优的资源配置后,在此基础上再考虑进行后面论述的性能调优策略。资源的分配在使用脚本提交Spark任务时进行指定,标准的Spark任务提交脚本如代码清单2-1所示:标准Spark提交脚本/usr/opt/modules/spark/bin/spark-submit \--...原创 2019-06-10 22:06:01 · 463 阅读 · 0 评论 -
yarn源码分析之CoarseGrainedExecutorBackend
1. CoarseGrainedExecutorBackend -- main:启动当前类的main方法 -- run -- onStart:点击图片中红线部分进行入,找到onstar -- ref.ask[Boolean](RegisterExecutor) -- r...原创 2019-06-10 20:19:11 · 1421 阅读 · 0 评论 -
yarn源码分析之ApplicationMaster
1. ApplicationMaster // 启动进程 -- main -- new ApplicationMasterArguments(args):参数对象的封装 // 创建应用管理器对象 -- new ApplicationMaster(amArgs, new YarnRMClient) ...原创 2019-06-10 20:02:03 · 443 阅读 · 0 评论 -
yarn源码分析之SparkSubmit
1. SparkSubmit // 启动进程 -- main // 封装参数 -- new SparkSubmitArguments // 提交 -- submit // 准备提交环境 -- prepareSubmitEnvironme...原创 2019-06-10 19:10:11 · 181 阅读 · 0 评论 -
Spark SQL概述
什么是Spark SQLSpark SQL是Spark用来处理结构化数据的一个模块,它提供了2个编程抽象:DataFrame和DataSet,并且作为分布式SQL查询引擎的作用。Hive,它是将Hive SQL转换成MapReduce然后提交到集群上执行,大大简化了编写MapReduc的程序的复杂性,由于MapReduce这种计算模型执行效率比较慢。所有Spark SQL的应运而生,它是将...原创 2019-05-13 12:55:55 · 159 阅读 · 0 评论 -
reduceByKey和groupByKey的区别
reduceByKey和groupByKey的区别 1. reduceByKey:按照key进行聚合,在shuffle之前有combine(预聚合)操作,返回结果是RDD[k,v]. 2. groupByKey:按照key进行分组,直接进行shuffle。 3. 开发指导:reduceByKey比groupByKey,建议使用。但是需要注意是否会影响业务逻辑。...原创 2019-05-11 08:22:07 · 400 阅读 · 0 评论 -
coalesce和repartition的区别
1. coalesce重新分区,可以选择是否进行shuffle过程。由参数shuffle: Boolean = false/true决定。2. repartition实际上是调用的coalesce,默认是进行shuffle的。源码如下:def repartition(numPartitions: Int)(implicit ord: Ordering[T] = null): RDD[T] ...原创 2019-05-11 08:22:15 · 1170 阅读 · 0 评论 -
spark常规性能调优五:Kryo序列化
默认情况下,Spark使用Java的序列化机制。Java的序列化机制使用方便,不需要额外的配置,在算子中使用的变量实现Serializable接口即可,但是,Java序列化机制的效率不高,序列化速度慢并且序列化后的数据所占用的空间依然较大。Kryo序列化机制比Java序列化机制性能提高10倍左右,Spark之所以没有默认使用Kryo作为序列化类库,是因为它不支持所有对象的序列化,同时Kryo需...原创 2019-06-10 22:13:43 · 277 阅读 · 0 评论 -
spark常规性能调优六:调节本地化等待时长
Spark作业运行过程中,Driver会对每一个stage的task进行分配。根据Spark的task分配算法,Spark希望task能够运行在它要计算的数据算在的节点(数据本地化思想),这样就可以避免数据的网络传输。通常来说,task可能不会被分配到它处理的数据所在的节点,因为这些节点可用的资源可能已经用尽,此时,Spark会等待一段时间,默认3s,如果等待指定时间后仍然无法在指定节点运行,那么...原创 2019-06-10 22:15:08 · 263 阅读 · 0 评论 -
spark之JVM调优一:降低cache操作的内存占比
静态内存管理机制根据Spark静态内存管理机制,堆内存被划分为了两块,Storage和Execution。Storage主要用于缓存RDD数据和broadcast数据,Execution主要用于缓存在shuffle过程中产生的中间数据,Storage占系统内存的60%,Execution占系统内存的20%,并且两者完全独立。在一般情况下,Storage的内存都提供给了cache操作,但是...原创 2019-06-11 07:46:42 · 302 阅读 · 0 评论 -
Shuffle调优四:调节reduce端拉取数据等待间隔
Spark Shuffle过程中,reduce task拉取属于自己的数据时,如果因为网络异常等原因导致失败会自动进行重试,在一次失败后,会等待一定的时间间隔再进行重试,可以通过加大间隔时长(比如60s),以增加shuffle操作的稳定性。reduce端拉取数据等待间隔可以通过spark.shuffle.io.retryWait参数进行设置,默认值为5s,该参数的设置方法val conf...原创 2019-06-11 00:00:38 · 350 阅读 · 0 评论 -
Shuffle调优三:调节reduce端拉取数据重试次数
Spark Shuffle过程中,reduce task拉取属于自己的数据时,如果因为网络异常等原因导致失败会自动进行重试。对于那些包含了特别耗时的shuffle操作的作业,建议增加重试最大次数(比如60次),以避免由于JVM的full gc或者网络不稳定等因素导致的数据拉取失败。在实践中发现,对于针对超大数据量(数十亿~上百亿)的shuffle过程,调节该参数可以大幅度提升稳定性。reduc...原创 2019-06-11 00:00:46 · 572 阅读 · 0 评论 -
Shuffle调优二:调节reduce端拉取数据缓冲区大小
Spark Shuffle过程中,shuffle reduce task的buffer缓冲区大小决定了reduce task每次能够缓冲的数据量,也就是每次能够拉取的数据量,如果内存资源较为充足,适当增加拉取数据缓冲区的大小,可以减少拉取数据的次数,也就可以减少网络传输的次数,进而提升性能。reduce端数据拉取缓冲区的大小可以通过spark.reducer.maxSizeInFlight参数...原创 2019-06-11 00:01:02 · 707 阅读 · 0 评论 -
Shuffle调优一:调节map端缓冲区大小
在Spark任务运行过程中,如果shuffle的map端处理的数据量比较大,但是map端缓冲的大小是固定的,可能会出现map端缓冲数据频繁spill溢写到磁盘文件中的情况,使得性能非常低下,通过调节map端缓冲的大小,可以避免频繁的磁盘IO操作,进而提升Spark任务的整体性能。map端缓冲的默认配置是32KB,如果每个task处理640KB的数据,那么会发生640/32 = 20次溢写,如果...原创 2019-06-11 00:00:55 · 824 阅读 · 0 评论 -
spark算子调优五:reduceByKey本地聚合
reduceByKey相较于普通的shuffle操作一个显著的特点就是会进行map端的本地聚合,map端会先对本地的数据进行combine操作,然后将数据写入给下个stage的每个task创建的文件中,也就是在map端,对每一个key对应的value,执行reduceByKey算子函数。reduceByKey算子的执行过程如图使用reduceByKey对性能的提升如下:本地聚合后...原创 2019-06-11 00:01:10 · 478 阅读 · 0 评论 -
spark算子调优四:repartition解决SparkSQL低并行度问题
在第一节的常规性能调优中我们讲解了并行度的调节策略,但是,并行度的设置对于Spark SQL是不生效的,用户设置的并行度只对于Spark SQL以外的所有Spark的stage生效。Spark SQL的并行度不允许用户自己指定,Spark SQL自己会默认根据hive表对应的HDFS文件的split个数自动设置Spark SQL所在的那个stage的并行度,用户自己通spark.default...原创 2019-06-11 00:01:18 · 1337 阅读 · 0 评论 -
spark算子调优三:filter与coalesce的配合使用
在Spark任务中我们经常会使用filter算子完成RDD中数据的过滤,在任务初始阶段,从各个分区中加载到的数据量是相近的,但是一旦进过filter过滤后,每个分区的数据量有可能会存在较大差异,如图所示:1. 每个partition的数据量变小了,如果还按照之前与partition相等的task个数去处理当前数据,有点浪费task的计算资源;2. 每个partition的数据量不一样,...原创 2019-06-11 00:01:40 · 934 阅读 · 0 评论 -
spark算子调优二:foreachPartition优化数据库操作
在生产环境中,通常使用foreachPartition算子来完成数据库的写入,通过foreachPartition算子的特性,可以优化写数据库的性能。如果使用foreach算子完成数据库的操作,由于foreach算子是遍历RDD的每条数据,因此,每条数据都会建立一个数据库连接,这是对资源的极大浪费,因此,对于写数据库操作,我们应当使用foreachPartition算子。与mapParti...原创 2019-06-11 00:01:32 · 1110 阅读 · 1 评论 -
spark算子调优一:mapPartitions
普通的map算子对RDD中的每一个元素进行操作,而mapPartitions算子对RDD中每一个分区进行操作。如果是普通的map算子,假设一个partition有1万条数据,那么map算子中的function要执行1万次,也就是对每个元素进行操作。如果是mapPartition算子,由于一个task处理一个RDD的partition,那么一个task只会执行一次function,funct...原创 2019-06-10 22:37:07 · 1014 阅读 · 0 评论 -
map()和mapPartition()的区别
map()和mapPartition()的区别 1. map():每次处理一条数据。 2. mapPartition():每次处理一个分区的数据,这个分区的数据处理完后,原RDD中分区的数据才能释放,可能导致OOM。 3. 开发指导:当内存空间较大的时候建议使用mapPartition(),以提高处理效率。...原创 2019-05-11 08:22:24 · 1611 阅读 · 0 评论 -
SparkStreaming转换之无状态转化操作
无状态转化操作就是把简单的RDD转化操作应用到每个批次上,也就是转化DStream中的每一个RDD。部分无状态转化操作列在了下表中。注意,针对键值对的DStream转化操作(比如 reduceByKey())要添加import StreamingContext._才能在Scala中使用。需要记住的是,尽管这些函数看起来像作用在整个流上一样,但事实上每个DStream在内部是由许多RDD(批...原创 2019-05-15 09:05:03 · 348 阅读 · 0 评论 -
SparkStreaming之有状态转化操作
1.执行一下代码的前提是要有kafka的环境。2.通过kafka的控制台进行输入。3.在通过以下代码进行接收,来进行实现实时。UpdateStateByKeyUpdateStateByKey原语用于记录历史记录,有时,我们需要在 DStream 中跨批次维护状态(例如流计算中累加wordcount)。针对这种情况,updateStateByKey() 为我们提供了对一个状态变...原创 2019-05-15 09:00:15 · 878 阅读 · 0 评论 -
Spark重要角色
Driver(驱动器) Spark的驱动器是执行开发程序中的main方法的进程。它负责开发人员编写的用来创建SparkContext、创建RDD,以及进行RDD的转化操作和行动操作代码的执行。如果你是用spark shell,那么当你启动Spark shell的时候,系统后台自启了一个Spark驱动器程序,就是在Spark shell中预加载的一个叫作 sc的SparkContext...原创 2019-05-07 13:45:40 · 518 阅读 · 0 评论 -
读取配置文件的工具类(scala版&通用)
object ConfigurationUtil { def main(args: Array[String]): Unit = { println(getValueFromConfig("config", "hive.database")) } def getValueFromConfig(path:String, key : String="con...原创 2019-05-19 09:51:08 · 1677 阅读 · 0 评论 -
SparkSQL编程之自定义聚合函数(强类型)
强类型用户自定义聚合函数:通过继承Aggregator来实现强类型自定义聚合函数,import org.apache.spark.sql.expressions.Aggregatorimport org.apache.spark.sql.Encoderimport org.apache.spark.sql.Encodersimport org.apache.spark.sql.Spa...原创 2019-05-14 08:51:18 · 420 阅读 · 0 评论 -
SparkSQL编程之自定义聚合函数(弱类型)
弱类型用户自定义聚合函数:通过继承UserDefinedAggregateFunction来实现用户自定义聚合函数。object SparkSQL_UDAF { def main(args: Array[String]): Unit = { // SparkSQL // SparkConf // 创建配置对象 va...原创 2019-05-14 08:49:59 · 151 阅读 · 0 评论 -
SparkSQL编程之RDD、DataFrame、DataSet区别与共性
在SparkSQL中Spark为我们提供了两个新的抽象,分别是DataFrame和DataSet。他们和RDD有什么区别呢?首先从版本的产生上来看:RDD (Spark1.0) —> Dataframe(Spark1.3) —> Dataset(Spark1.6)如果同样的数据都给到这三个数据结构,他们分别计算之后,都会给出相同的结果。不同是的他们的执行效率和执行方式。在后...原创 2019-05-14 08:40:06 · 557 阅读 · 0 评论 -
SparkSQL编程之DataFrame与DataSet的互操作
1. DataFrame转换为DataSet1)创建一个DateFramescala> val df = spark.read.json("examples/src/main/resources/people.json")df: org.apache.spark.sql.DataFrame = [age: bigint, name: string]2)创建一个样例类s...原创 2019-05-14 08:25:37 · 125 阅读 · 0 评论 -
SparkSQL编程之DataSet
DataSetDataset是具有强类型的数据集合,需要提供对应的类型信息。创建1)创建一个样例类scala> case class Person(name: String, age: Long)defined class Person2)创建DataSetscala> val caseClassDS = Seq(Person("Andy", 32))...原创 2019-05-14 08:20:40 · 238 阅读 · 0 评论 -
SparkSQL编程之RDD与DateFrame转换
RDD转换为DataFrame注意:如果需要RDD与DF或者DS之间操作,那么都需要引入import spark.implicits._ 【spark不是包名,而是sparkSession对象的名称】前置条件:导入隐式转换并创建一个RDDscala> import spark.implicits._import spark.implicits._scala> ...原创 2019-05-14 08:17:37 · 463 阅读 · 0 评论 -
SparkSQL编程之DataFrame
SparkSession新的起始点在老的版本中,SparkSQL提供两种SQL查询起始点:一个叫SQLContext,用于Spark自己提供的SQL查询;一个叫HiveContext,用于连接Hive的查询。SparkSession是Spark最新的SQL查询起始点,实质上是SQLContext和HiveContext的组合,所以在SQLContext和HiveContext上可用的API...原创 2019-05-14 08:09:22 · 135 阅读 · 0 评论 -
Spark 编写WordCount程序
注:此案例是以yarn的模式进行运行的,所以你需要启动hdfs与yarn集群1.创建一个Maven项目WordCount并导入依赖<dependencies> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spar...原创 2019-05-08 21:25:56 · 350 阅读 · 0 评论 -
Spark概述
什么是Spark Spark是一种基于内存的快速、通用、可扩展的大数据分析引擎。发展历史2009年诞生于加州大学伯克利分校AMPLab,项目采用Scala编写。2010年开源;2013年6月成为Apache孵化项目。2014年2月成为Apache顶级项目。Spark内置模块Spark Core:实现了Spark的基本功能,包含任务调度、...原创 2019-05-07 13:09:28 · 120 阅读 · 0 评论 -
Spark运行模式之Local模式
Local模式不需要任何的配置。概述 Local模式就是运行在一台计算机上的模式,通常就是用于在本机上练手和测试。它可以通过以下集中方式设置Master local: 所有计算都运行在一个线程当中,没有任何并行计算,通常我们在本机执行一些测试代码,或者练手,就用这种模式; local[K]: 指定使用几个线程来运行计算,比如local[4]就是运行4个Worker线程。通常我...原创 2019-05-07 18:13:15 · 5578 阅读 · 0 评论 -
Spark安装
1.官网地址http://spark.apache.org/2.文档查看地址https://spark.apache.org/docs/2.1.1/3.下载地址 https://spark.apache.org/downloads.html页面的最下方可以下载历史版本与最新版本的spark,如图:点击链接进去后会有很多个版本可以选择选择自己对应的版本...原创 2019-05-07 18:20:01 · 257 阅读 · 0 评论 -
SparkSQL数据源之Hive数据库
Apache Hive是Hadoop上的SQL引擎,Spark SQL编译时可以包含Hive支持,也可以不包含。包含Hive支持的Spark SQL可以支持Hive表访问、UDF(用户自定义函数)以及 Hive 查询语言(HiveQL/HQL)等。需要强调的一点是,如果要在Spark SQL中包含Hive的库,并不需要事先安装Hive。一般来说,最好还是在编译Spark SQL时引入Hi...原创 2019-05-15 00:00:46 · 431 阅读 · 0 评论