spark
Mr Cao
时间顺流而下,生活逆水行舟。
展开
-
Spark性能调优系列:Spark-JVM调优
Spark-JVM调优Spark发生垃圾回收的原理Spark任务运行时会在executor里面不断的创建对象,当JVM存不下对象时,会触发JVM的垃圾回收(GC => grabage Collector),垃圾回收就是把不需要的对象给清除。如果内存中数据量比较大,那么可能会频繁的发生GC,而GC操作本身比较耗费性能,如果还频繁发生,那么对Spark作业性能造成很大的影响。此...原创 2019-12-27 10:25:10 · 802 阅读 · 0 评论 -
Spark性能调优系列:Spark资源模型以及调优
Spark资源模型Spark内存模型Spark在一个Executor中的内存分为三块,execution内存、storage内存、other内存。execution内存是执行内存,join、aggregate都在这部分中执行,shuffle的数据也会先缓存在这个内存中,满了再写入磁盘,能够减少IO,Map过程也是在这个内存中执行的。(0.25)storage内存是存储broad...原创 2019-12-18 21:31:02 · 397 阅读 · 0 评论 -
Spark性能调优系列:Spark参数配置大全(官网资料)
Spark参数配置大全Spark提供了三个位置来配置系统Spark属性控制大多数应用程序参数,可以使用SparkConf对象或Java系统属性来设置。通过conf/spark-env.sh每个节点上的脚本,环境变量可用于设置每台计算机的设置,例如IP地址。可以通过配置日志log4j.properties。Spark属性Spark属性控制大多数应用程序设置,并分别为每个应用...原创 2019-12-18 18:56:54 · 3673 阅读 · 0 评论 -
Spark性能调优系列:Shuffle调优
Spark性能调优系列:Shuffle调优shuffle大部分的Spark作业性能主要是shuffle过程的消耗,shuffle是从Map Task输出到Reduce Task输入这段中间过程,Reduce Task需要从其它节点上的Map Task拉取结果数据,因此shuffle过程包含大量的磁盘IO,序列化,网络数据传输等操作。Spark中常用算子中会触发shuffle操作的算子:...原创 2019-12-03 15:57:36 · 618 阅读 · 0 评论 -
Spark性能调优系列:(八)数据倾斜(使用随机前缀和扩容RDD进行join)
适用场景如果在进行join操作时,RDD中有大量的Key导致数据倾斜,那么进行分拆key也没什么意义,此时就只能使用最后一种解决方案来处理了。实现思路该方案的实现思路基本和上一个相似,首先查看RDD/Hive表中的数据分布情况,找到那个造成数据倾斜的RDD/Hive表,比如有多个key都对应了超过1万条数据,然后将该RDD的每条数据都打上一个N以内的随机前缀,同时对另外一个正常的...原创 2019-11-29 17:44:34 · 1164 阅读 · 0 评论 -
Spark性能调优系列:(七)数据倾斜(采样倾斜key并分拆join操作)
适用场景两个RDD/Hive表进行join的时候,如果数据量都比较大,无法采用上一个方案时,那么此时可以看看两个RDD或hive表中的key分布情况。如果出现数据倾斜,是因为其中的某一个RDD/Hive表中的少数几个key的数据量过大,而另一个RDD/Hive表中的所有key都分布比较均匀,那么采用这个解决方案比较合适。实现思路对包含少数几个数据量过大的key的那个RDD,通过s...原创 2019-11-29 17:43:08 · 487 阅读 · 0 评论 -
Spark性能调优系列:(六)数据倾斜(将reduce join转为map join)
适用场景在对RDD适用join类操作,或者是在SparkSQL中使用join语句时,而且join操作中的一个RDD或表的数据量较小(几百MB到几G),就适用该方案。实现思路不使用join算子进行连接操作,而使用Broadcast变量与map类算子实现join操作,进而完全避免shuffle类的操作,彻底避免数据倾斜的发生和出现,将较小RDD中的数据直接通过collect算子拉取到D...原创 2019-11-28 10:05:49 · 670 阅读 · 0 评论 -
Spark性能调优系列:(五)数据倾斜(两阶段聚合(局部聚合+全局聚合))
两阶段聚合(局部聚合+全局聚合)适用场景对RDD执行reduceByKey等聚合类shuffle算子或者在SparkSQL中使用Groupby语句进行分组聚合时,比较适用这种方案。实现思路核心实现思路就是进行两阶段聚合。第一次是局部聚合,先给每个key都打上一个随机数,比如10以内的随机数,此时原先一样的key就变成不一样的了,比如:(hello,1)(hello,1)(h...原创 2019-11-21 11:40:18 · 860 阅读 · 2 评论 -
Spark性能调优系列:(四)数据倾斜(提高shuffle操作的并行度)
提高shuffle操作的并行度使用场景如果必须要对数据倾斜迎难而上,那么建议优先使用该方案,因为这是处理数据倾斜最简单的一种。实现思路在对RDD执行shuffle算子时,给shuffle算子传入一个参数,比如reduceByKey(1000),该参数就设置了这个shuffle算子执行时shuffle read task的数量,对于SparkSQL中的shuffle类语句,比...原创 2019-11-20 11:47:33 · 939 阅读 · 2 评论 -
Spark性能调优系列:(三)数据倾斜(过滤少数导致倾斜的key)
过滤少数导致倾斜的key使用场景如果发现导致倾斜的key就少数几个,而且对计算本身的影响并不大的话,那么非常适合该方案。(比如:99%的key就对应100条数据,只有1个key对应百万条数据,从而导致数据倾斜)实现思路如果觉得那少数几个数据量特别多的key对作业执行和计算结果不是特别重要,那么干脆就过滤那少数的key。(比如:SparkSQL中可以使用where子句过滤掉这些...原创 2019-11-19 18:32:39 · 343 阅读 · 0 评论 -
Spark性能调优系列:(二)数据倾斜(Hive ETL预处理数据方案)
Hive ETL预处理数据方案适用场景 导致数据倾斜的是Hive表,如果Hive表中的数据本身分布不均匀(比如:某个key对应了100万数据,其他key只对应了100条数据),而且业务场景需要频繁使用到Spark对Hive表执行某个分析操作,那么比较适用使用这种技术方案。实现思路: 评估是否可以通过Hive来进行数据预处理(即通过HiveETL预先对数据按照key进行...原创 2019-11-19 17:31:27 · 711 阅读 · 1 评论 -
Spark性能调优系列:(一)数据倾斜(原理)
数据倾斜一、概述:有时,我们会遇到数据倾斜,在遇到数据倾斜的时候Spark作业的性能会比期望差很多,这时,我们就需要对数据倾斜进行调优,以保证Spark作业的性能。二、数据倾斜发生时的现象:1.绝大多数Task执行得非常快,但个别Task执行会极慢。2.本来能够正常执行的Spark作业,某天突然爆出OOM(内存溢出)异常,又不是业务代码造成。三、数据倾斜发生的原理:...原创 2019-11-15 15:55:55 · 280 阅读 · 0 评论 -
Spark系列---SparkSQL(五)创建json格式的list注册成临时表用sql语句查询
1.创建json格式的list注册成临时表用sql语句查询scala版本package com.kevin.scala.dataframeimport org.apache.spark.sql.SQLContextimport org.apache.spark.{SparkConf, SparkContext}/** * 创建json格式的list注册成临时表用sql语句查...原创 2019-10-31 18:36:08 · 1459 阅读 · 0 评论 -
Spark系列---SparkSQL(四)动态与反射方式创建DataFrame(Java、Scala版本)
1.动态创建Scheme将非json格式RDD转换成DataFrame,推荐scala版本package com.kevin.scala.dataframeimport org.apache.spark.sql.types._import org.apache.spark.sql.{RowFactory, SQLContext}import org.apache.spark.{S...原创 2019-10-31 18:33:45 · 651 阅读 · 0 评论 -
Spark系列---SparkSQL(三)读取Txt文件、Json文件、Hive、Mysql数据源(Java、Scala版本)
1.读取txt文件scala版本package com.kevin.scala.dataframeimport org.apache.spark.{SparkConf, SparkContext}import org.apache.spark.sql.SQLContext/** * 读取txt文件转成DataFrame形式操作 */object DataFrameTx...原创 2019-10-31 18:30:19 · 8388 阅读 · 0 评论 -
Spark系列---SparkSQL(二)读取txt文件转为DataFrame表的所有action(Java、Scala版本)
该文章只附上代码案例,不进行讲解,需要了解的看以下文章Spark系列---SparkSQL(一)介绍与使用Spark系列---Spark算子RDD(Java、Scala版本)读取txt文件转为DataFrame表的所有actionscala版本package com.kevin.scala.dataframeimport org.apache.spark.{SparkCo...原创 2019-10-31 18:20:05 · 2952 阅读 · 0 评论 -
Spark性能调优系列:数据本地化
Spark数据本地化背景:数据本地化对于Spark Job性能有着巨大的影响,如果数据以及要计算它的代码是一起的,那么性能当然会非常高。但是如果数据与计算它的代码是分开的,那么其中之一必须到另外一方机器上,通常来说,移动代码到其它节点,会比移动数据到代码所在的节点上,速度要快的多。因为代码较小,Spark也正是基于这个数据本地化的原则来构建Task调度算法的。数据本地化:数据离计算它...原创 2019-10-31 18:04:23 · 337 阅读 · 0 评论 -
Spark性能调优系列:(九)开发调优(优化数据结构)
优化数据结构Java中有三种类型比较耗费内存:1.对象,每个Java对象都有对象头,引用等额外的信息,因此比较占用内存空间。2.字符串,每个字符串内部都有一个字符数组以及长度等额外信息。3.集合类型,比如HashMap、LinkedList等,因为集合类型内部通常会使用一些内部类来封装集合元素,比如Map.Entry。Spark官方建议,在Spark编码实现中,特别是对于算子...原创 2019-10-31 17:29:02 · 186 阅读 · 0 评论 -
Spark性能调优系列:(八)开发调优(使用Kryo优化序列化性能)
使用Kryo优化序列化性能Spark主要有三个地方涉及序列化:1.算子函数中使用到外部变量时,该变量会被序列化后进行网络传输。2.将自定义类型作为RDD的泛型类型时(比如Student是自定义类型),所有自定义类型对象,都会进行序列化。因此该情况下,也要求自定义的类必须实现Serializable接口。3.使用可序列化的持久策略时(比如MEMORY_ONLY_SER),Spark会将...原创 2019-10-31 17:18:28 · 304 阅读 · 0 评论 -
Spark性能调优系列:(七)开发调优(广播大变量)
广播大变量开发过程中,如果需要在算子函数中使用外部变量的场景(尤其是100m以上的数据),那么此时应该使用广播变量来提升性能。算子函数中,默认情况下,Spark会将该变量复制多个副本,通过网络传输到task中,此时每个task都有一个变量副本,如果变量本身比较大,那么大量的变量副本在网络中传输的性能开销以及各个节点的Executor中占用过多内存导致的频繁GC,都会极大影响性能。如果使...原创 2019-10-31 16:47:40 · 272 阅读 · 0 评论 -
Spark性能调优系列:(六)开发调优(使用高性能的算子)
使用高性能的算子1.使用reduceByKey、aggregateByKey替代groupByKey。详细看https://blog.csdn.net/qq1021979964/article/details/1026780162.使用mapPartitions替代普通mapmapPartitions类的算子,一次函数会调用处理一个partition所有的数据,不是一次函数调用...原创 2019-10-22 18:39:10 · 432 阅读 · 0 评论 -
Spark性能调优系列:(五)开发调优(尽量使用map-side预聚合的shuffle操作)
使用map-side预聚合的shuffle操作如果一定需要使用shuffle操作,无法使用map类的算子来替代的时候,尽量使用map-side预聚合的算子。map-side预聚合每个节点本地对相同的key进行一次聚合操作,类似MapReduce中的本地Combiner,map-side预聚合之后,每个节点本地就只有一条相同的key,在其它节点在拉取所有节点上的相同key时,就会大量减...原创 2019-10-22 10:38:48 · 649 阅读 · 0 评论 -
Spark性能调优系列:(三)开发调优(尽可能复用同一个RDD)
调优:尽可能复用同一个RDD在对不同的数据执行算子操作时还要尽可能地复用一个RDD。多个RDD的数据有重叠或者包含的情况,我们应该尽量复用一个RDD,这样可以尽可能地减少RDD的数量,从而尽可能减少算子执行的次数。比如:有一个RDD的数据格式是key-value类型的,另一个rdd是单value类型的,这两个RDD的value数据是完全一样的。那么此时我们可以只使用key-value类...原创 2019-10-21 15:37:48 · 320 阅读 · 0 评论 -
Spark性能调优系列:(二)开发调优(避免创建重复的RDD)
调优:避免创建重复的RDD对于同一份数据,只应该创建一个RDD,不能创建多个RDD来代表同一份数据。如果同份数据创建多个RDD,则Spark会多次重复计算来创建多个代表相同数据的RDD,进而增加了作业的性能开销。案例:package com.kevin.scala.tuningimport org.apache.spark.{SparkConf, SparkContext}...原创 2019-10-21 15:37:00 · 369 阅读 · 0 评论 -
Spark性能调优系列:(一)开发调优(将重复使用的RDD进行持久化)
为什么调优?由于Spark的计算本质是基于内存的,所以Spark性能程序的性能可能因为集群中的任何因素出现瓶颈:CPU、网络带宽、或者是内存。情况一:内存大能够容纳所有数据,那么网络传输和通信就会导致性能出现瓶颈。情况二:内存小不能容纳所有数据(10亿级以上数据量),则需要对内存的使用进行性能优化。调优:将重复使用的RDD进行持久化Spark单个RDD多次执行原理:每次执行RDD进...原创 2019-10-21 15:36:07 · 415 阅读 · 0 评论 -
Spark性能调优系列:(四)开发调优(尽量避免使用shuffle类算子)
调优:尽量避免使用shuffle类算子Spark作业运行过程中,最消耗性能的就是shuffle过程shuffle过程:将分布在集群中多个节点的同一个key,拉取到同一个节点上进行聚合或join操作,比如reduceByKey、join等算子都会触发shuffle操作。shuffle过程中shuffle过程中,各个节点上的相同Key都会先写入本地磁盘文件中,然后其它节点需要通过网络...原创 2019-10-21 17:28:07 · 483 阅读 · 0 评论 -
Spark系列---SparkSQL(一)介绍与使用
SparkSQL前世今生SparkSQL 1.0版本之前:Shark -> Hive on SparkSparkSQL 1.0版本之后:SparkSQLSparkSQL 1.3.X版本:SparkSQL+DataFrameSparkSQL 1.5.X版本:SparkSQL+钨丝计划SparkSQL 1.6.X版本:SparkSQL+DataFrame+DataSetSpark...原创 2019-10-18 19:23:20 · 635 阅读 · 0 评论 -
Spark系列---Spark算子RDD(Java、Scala版本)
Spark一、Spark介绍Spark 是用于大规模数据处理的统一分析引擎。Spark是一种与Hadoop相似的开源集群计算环境,Spark使用了内存分布数据集,除了能够提供交互式查询外,它还可以优化迭代工作负载。相对于Hadoop的MapReduce会在运行完工作后将中介数据存放到磁盘中,Spark使用了内存内运算技术,能在数据尚未写入硬盘时即在内存内分析运算。Spark在内存内...原创 2019-09-26 15:16:49 · 1205 阅读 · 1 评论