- 博客(47)
- 资源 (6)
- 收藏
- 关注
原创 SparkSQL开窗函数
row_number()开窗函数其实就是给每个分组的数据,按照其排序的顺序,打上一个分组内的行号比如说,有一个分组date = 20151001,里面有三条数据,1122,1121,1124,那么对这个分组的每一行使用row_number()开窗函数以后,三行,依次会获得组内的行号行号从1开始递增,比如1122 1,1121 2,1123 3 row_number()...
2018-07-30 10:22:40 3149 1
原创 standalone多作业资源调度问题
目前来说,standalone集群对于同时提交上来的多个作业,仅仅支持FIFO调度策略,也就是先入先出默认情况下,集群对多个作业同时执行支持是不好的,没有办法同时执行多个作业因为先提交上来的每个作业都会尝试使用集群中所有可用的cpu资源,此时相当于就是只能支持作业串行起来,一个一个运行了此时,如果我们希望能够支持多作业同时运行,那么就需要调整一些资源参数 我们可以设置sp...
2018-07-23 17:08:01 364
原创 standalone cluster模式提交spark作业
standalone cluster通常用于spark作业部署到生产环境中去使用因为这种模式,会由master在集群中,某个节点上,来启动driver,然后driver会进行频繁的作业调度此时driver和集群在一起,那么性能是比较高的standalone client模式,在spark-submit脚本执行的机器上,会启动driver进程,然后去进行整个作业的调度,通常来说,你的sp...
2018-07-23 16:13:03 504
原创 standalone client模式提交spark作业
local模式下,我们是不会将spark作业提交到生产机器上去跑的local模式,其实仅仅用于idea中运行spark作业,以及打断点,调试spark作业来用通常,用local模式执行,我们会手动生产一份数据,来使用部署到测试机器上来进行测试运行spark作业的时候,都是使用client模式(standalone client模式,standalone cluster模式)clie...
2018-07-23 15:48:54 459
原创 spark local模式
spark作业运行集群有俩种部署模式,一种是spark Standalone集群,还有一种是YARN集群+Spark客户端所以我们认为提交spark作业的俩种主要方式就是,就是Spark StandAlone和YARN,这俩种方式,分别还分为俩种模式,分别是client mode和cluster mode local模式的基本原理local模式,没有所谓的master+worker这种...
2018-07-23 15:21:40 3777
原创 standalone集群架构
集群管理器,cluster manager:Master 进程工作节点:Worker进程spark,Master+Worker集群架构就足够了,然后可以编写spark作业,提交到Master+Worker集群架构中运行一般大公司,Hadoop、spark、storm、Hive、MapReduce都用到了,统一就不搭建spark集群了,(Master+Worker压根就没有) Y...
2018-07-23 09:49:23 636
原创 spark集群管理器
spark集群管理器,目前来说,支持的有spark standalone Yarn Messos,但是目前国内常用的也只有是Spark StandAlone和YarnSparkContext,会跟集群管理器去申请资源,申请启动一些executor进程集群管理器主要就负责在各个节点上,给spark作业启动一批executor进程 driver会将我们的工程jar发送到所有的execu...
2018-07-22 21:38:02 463
原创 数据倾斜解决方案之reduce join转换成为map join
reduce join转换为map join适合在什么样的情况下,可以来使用?如果俩个RDD要进行join,其中一个RDD是比较小的,一个RDD是1百万数据,一个RDD是1万数据注意,其中一个RDD必须是比较小的,broadcast出去的那个小RDD的数据以后,就会在每个executor的block manager中都驻留一份,要确保你的内存足够存放那个小rdd中的数据 不适合的情...
2018-07-21 10:40:52 610
原创 数据倾斜解决之使用随机key实现双重聚合
1. 原理第一轮聚合的时候,对key进行打散,将原先一样的key,变成不一样的key,相当于是将每个key分为多组;先针对多个组,进行key的局部聚合,接着,再去除掉每个key的前缀,然后对所有的key,进行全局的聚合2. 使用场景groupByKeyreduceByKey这叫适合这种方式,join,就不会这样来做了 ...
2018-07-21 10:03:43 455
原创 数据倾斜解决方案之提高shuffle操作reduce并行度
提高shuffle操作的reduce并行度 将reduce task的数量,变多,就可以让每个reducetask分配到更少的数据量,这样的话,也许就可以缓解,或者甚至是基本解决掉数据倾斜的问题 提升shuffle reduce端并行度,怎么来操作很简单,主要给我们所有的shuffle算子,比如groupByKey,countByKey,reduceByKey,在调用的时候,传...
2018-07-20 17:18:13 889
原创 数据倾斜方案之聚合源数据
性能调优,最有效,最直接,最简单的方式,就是加资源,加并行度,注意RDD架构(复用同一个RDD,加上cache缓存);shuffle,jvm等,是次要的。数据倾斜,解决方案:第一个方案:聚合源数据现在,做一些聚合操作,groupByKey,reduceByKey这种操作,说白了,就是拿到每个key对应的values;reduceByKey,说白了,就是对每个key对应的values执行...
2018-07-20 15:24:34 3160
原创 spark 数据倾斜解决方案
1. 数据倾斜的原理在执行shuffle操作的时候,按照key,来进行values的数据的输出、拉取、和聚合的,同一个key的values,一定是分配到一个reduce task进行处理的。多个key对应的values,总共有90万,但是问题是,可能某个key对应了88万条数据,key-88万values,分配到了一个task上面去执行,另外俩个task,可能各分配到了1万数据,可能是...
2018-07-20 11:29:45 2672
原创 spark troubleeshooting之错误的持久化方式以及checkpoint的使用
userRDD,想要对这个RDD做一个cache,希望能够在后面多次使用这个RDD的时候,不用反复重新计算RDD;可以直接使用通过各个节点上的executor的BlockaManager管理内存/磁盘的数据,避免重新反复计算RDD. userRDD.cache()userRDD.count()userRDD.take()上面这种方式,不要说不会生效了,实际上是不会报错的,会报一...
2018-07-20 11:08:15 303
原创 troubleshooting 之解决yarn-cluster模式的JVM栈内存溢出无法执行
sparkCluster模式提交方式spark-submit脚本提交yarn-cluster模式,首先由脚本,提交提交spark Application 到ResourceManager上,然后ResourceManager找到一个NodeManager启动ApplicationMaster进程,这时,我们的NodeManager就会启动一个ApplicationMaster进程,这个就相...
2018-07-20 10:04:03 496 1
原创 spark troubleshooting 之解决算子函数返回NULL导致的问题
在算子函数中返回NULL 在有些算子函数里面,是需要我们有一个返回值的,但是,有时候,我们可能对某些值,就是不想返回,我们如果直接返回NULL的话,那么这里是不行的,会报错Scala.Math(NULL),异常如果碰到某些值,不想要返回值的时候,有一个解决的办法1. 在返回的时候,返回一些特殊的值,不要返回null,比如“-999”2.在通过算子获取到一个RDD后,执行fi...
2018-07-19 17:15:56 383
原创 spark troubleshooting之解决序列化导致的报错
用client模式去提交spark作业,观察本地打印出来的log。如果出现了类似Serializable等等字眼,报错的log,那么就遇到了序列化问题导致的报错,这种报错是比较简单的,很好处理序列化报错要注意三个点1. 你的算子函数里面,如果使用到了外部的自定义类型的变量,那么此时,就要求你的自定义类型,必须是可序列化的。Teacher teacher = new Teacher(...
2018-07-19 17:05:56 174
原创 spark troubleshotting之解决YARN队列资源不足导致的application直接失败
现象:如果,你是基于yarn来提交spark,比如yarn-cluster或者是yarn-client,你可以指定某个hadoop队列上的,每个队列都是有自己的资源的,生产环境中,给spark用的yarn资源队列的情况:500G内存,200个cpu core比如说,某个spark application,在spark-submit里面你自己配了,executor,80个,每个execu...
2018-07-19 16:02:34 1501
原创 spark troubleshooting之解决JVM GC导致的shuffle文件拉取失败
在shuffle中,我们map端的task向磁盘文件写入数据,其实是task所在的executor上分配一个BlockManager的,这个BlockManager管理这些磁盘数据,task会向BlockManager中写一份数据,然后将数据的元信息提交到Driver中一份,这时,reduce端想要拉取数据,就会想Driver申请,然后告诉Driver自己想拉取的那份数据,但是它记录的是元数据,需...
2018-07-19 15:32:12 411
原创 troubleshooting之控制shuffle reduce端缓冲大小以避免OOM
·shuffle操作map端的task是不断的输出数据的,数据量可能是很大的。但是,其实reduce端的task,并不是等到map端task将属于自己的那份数据全部写入磁盘文件后,再去拉取的。map端写一点数据,reduce端task就会拉取一小部分数据,立即进行后面的聚合、算子函数的应用。每次reduce能够拉取多少数据,就由buffer来决定,因为拉取过来的数据,都是先放在buffer...
2018-07-19 15:00:46 188
原创 spark算子调优reduceByKey本地聚合
reduceByKey,相较于普通的shuffle操作,它的一个特点就是说,会进行map端的本地聚合。对map端给下个stage每个task创建输出文件中,写数据之前,就会进行本地的combiner操作,也就是说对每一个key对应的values都会执行你的算子函数 用reduceByKey对性能的提升:1. 在本地进行聚合以后,在map端的数据量就变少了,减少磁盘io.而且可以减少...
2018-07-19 14:26:38 850
原创 spark算子调优 使用repartition解决Spark SQL降低并行度的性能问题
设置的并行度,在哪些情况下会生效?哪些情况下不会生效?如果你压根没有使用sparkSQL(DataFrame),那么你整个spark application默认所偶stage的并行度都是你设置的那个参数,(除非你使用coalesce算子缩减过partition数量) 问题来了,用spark sql的那个stage的并行度,你没法自己指定,spark sql自己会默认根据hive表对应的...
2018-07-19 11:11:12 10809 1
原创 spark 算子调优之使用foreachPartition优化写数据库的性能
使用默认的foreache的性能缺陷是哪里?首先,对于每条数据,都要单独去调用一次function,task为每个数据,都要去执行一次function函数。 如果100万条数据(一个partition),调用100万次,性能比较差 另外一个非常非常重要的一点 如果每个数据,你都要去创建一个数据库连接,那么你就得建立100万次数据库连接,但是要注意的是,数据库连接的创建和...
2018-07-19 10:44:52 1349
原创 spark调优 算子调优之filter过后使用coalesce减少分区数量
默认情况下,算子经过了filter之后,RDD中的每个partition的数据量,可能都不太大一样了。(原本每个partition的数据量可能是差不多的) 问题:1、每个partition数据量变少了,但是在后面进行处理的时候,还是要跟partition数据量一样数量的task,来进行处理;有点浪费task计算资源,2. 每个partition的数据量不一样,会导致后面的每个tas...
2018-07-19 10:02:46 379
原创 算子调优之Map类操作性能
spark中,最基本的原则就是每个task处理一个RDD的partition.MapPartitinos操作的优点:如果是普通的map,比如一个partition中有一万条数据;ok,那么你的function要执行和计算一万次但是,使用MapPartions操作后,一个task仅会执行一次function,function一次接收所有的partition数据,只要执行一次就可以了,性能...
2018-07-19 09:37:42 245
原创 spark调优之HashShuffleManager与ShuffleManager调优
SortShuffleManager与HashShuffleManager俩点不同:1. sortShuffleManager会对每个reduce task要处理的数据进行排序(默认的)2.sortShuffleManager会避免像HashShuffleManager默认就创建多份磁盘文件,一个task只能写入一份文件 总共有三种Manager选择1. hashShuffle...
2018-07-18 17:31:27 338
原创 spark调优 shuffle调节map端内存缓冲与reduce端内存占比
spark.shuffle.file.buffer, 默认是32kspark.shuffle.memoryFraction, 0.2map端内存缓冲,reduce端内存占比 默认情况下,shuffle的map task,输出到磁盘文件的时候,统一都会先写入到每个task自己关联的一个内存缓冲区,这个默认的内存缓冲区默认是32Kb每一次当内存缓冲区满溢后,然后才会进...
2018-07-18 16:47:02 347
原创 spark调优 shuffle调优
每一个shuffle的前半部分stage的task,每个task都会创建下一个stage的task数量相同的文件,比如下一个stage会有100个task,那么当前stage每个task都会创建100份文件,会将同一个key对应的values,一定是写入同一个文件中的,也一定会将同一个key对应的values写入下一个stage,同一个task对应的文件中。 shuffle的后半部分sta...
2018-07-18 16:10:32 311
原创 Spark JVM调优之调节executor堆外内存与连接等待时长
executor堆外内存的调优有时候,如果你的spark作业处理的数据量特别特别大,大约在几亿的数据量,然后spark作业运行,时不时报错,shuffle file cannot find , execturo、task lost。out of memeory可能是看到lost这种字样;可能是说,你的executor的堆外内存不太够用,导致executor在运行过程中,可能会内存溢出;...
2018-07-18 11:20:03 1088
原创 spark调优 JVM调优
我们的堆内存分为:新生代,和年老代,年轻代又分为:Eden区,幸存一区,幸存二区,每一次访对象的时候,都是放入eden区域,和其中的一个幸存一区中,幸存二区是不放对象的,空闲的当eden和幸存一区放满后,就会触发 minor gc,小型垃圾回收,把不再使用的对象,从内存中清空,给后面新创建的对象腾出来地方。清理掉了不再使用的对象后,那么也会将存活下来的对象(还要继续使用的),放入幸...
2018-07-17 17:37:56 551
原创 spark性能调优 本地化等待时长
本地化级别:1. 进程本地化2. 节点本地化3. 机架本地化4. Any(都没有)Spark在Driver上,对Application的每个stage的task,进行分配之前,都会计算出每个task要计算的是哪个分片数据,RDD的某个partition;Spark的task分配算法优先希望每个task正好分配到它要计算数据所在的节点,这样的话,就不用在网络间传输数据,但是,...
2018-07-17 15:57:02 522
原创 spark性能调优在项目中使用Kryo序列化
SparkConf.set("spark.serializer","org.apache.spark.serializer.KryoSerializer");还可以进一步优化,优化这个序列化格式默认情况下,Spark内部是使用Java的序列化机制,ObjectOutputStream/ObjectInputStream,对象输入输出流机制,来进行序列化 这种默认序列化机制的好处在于...
2018-07-17 15:23:27 713
原创 spark性能调优 广播大变量
这种默认的,task执行的算子中,使用了外部的变量,每个task都会获取一份变量的副本,有什么缺点呢?在什么情况下,会出现性能上的恶略的影响呢? map本身是不小的,map中存放数据的单位是entry,还有可能会用链表的格式来存放Entry链条,所以map是比较消耗内存的数据格式,比如map是1M,总共,你前面调优调的都特好,资源给的到位,配合着资源,并行度调节到位,1000个task。大...
2018-07-17 11:23:22 920
原创 spark性能调优 RDD持久化
第一,RDD重构与优化尽量去复用RDD,差不多的RDD,可以抽取成为一个共同的RDD,供后面的RDD计算时,反复使用。第二,公共RDD一定要实现持久化持久化,也就是说,将RDD中的数据缓存到内存中,或者缓存到磁盘中,(BlockManager),以后无论对这个RDD做多少次计算,那么都是直接取RDD的持久化的数据,比如从内存中或者磁盘中,直接提取一份数据 第三:持久化,是可以进...
2018-07-17 10:48:39 181
原创 spark调优,调节并行度
spark并行度指的是什么?并行度:其实就是指的是,spark作业中,各个stage的task数量,也就代表了sprark作业的各个阶段(stage)的并行度。如果不调节,那么导致并行度过低,会怎么样?假设,现在已经在spark-submit脚本中给我们的spark作业分配了足够的资源,比如50个executor,每个executor有10G内存,每个executor有3个cpu co...
2018-07-17 09:36:16 487
原创 spark性能优化,分配更多的资源
其实性能优化的王道,就是增加更多的资源 1. 分配哪些资源2. 在哪里分配这些资源3. 为什么多分配了这些资源以后,性能会得到提升? 1. executor、cpu per executor、memory per executor、driver memory2. 在生产环境中,提交spark作业,用的spark-submit shell脚本,里面调整对应的参数/us...
2018-07-16 15:40:25 355
原创 session随机抽取实现思路
session随机抽取,就是按每天的每个小时的session数量,占当天session总数的比例,乘以每天要抽取的session数量,计算出每个小时要抽取的session的数量,然后呢,在每天每个小时的session中,随机抽取出之前计算出来的数量的session。...
2018-07-12 14:04:57 227
原创 Spark作业中json的使用
在Spark作业中有很多的任务类型,但是我们只有一张task表,怎么存储我们不同的任务Parameter呢,这时我们就可以使用json的数据格式如何来操作JSON格式的数据?...
2018-07-10 15:55:22 514
原创 工厂设计模式
如果没有工厂设计模式,可能会出现以下的问题ITaskDAO接口和TaskDAOImpl实现类,实现类是可能会更改的,那么,如果就使用普通的方式来创建DAO,比如ITaskDAO taskDAO = new TaskDAOImpl(),那么后续,如果你的TaskDAO的实现类变更了,那么你就必须在你的程序中,所有出现过TaskDAOImpl的地方,去更换掉这个实现类,这是非常非常麻烦的。如果说,你的...
2018-07-10 15:29:00 154
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人