- 博客(159)
- 资源 (4)
- 收藏
- 关注
原创 Sparksql的join方式
Join操作是数据库和大数据计算中的高级特性,大多数场景都需要进行复杂的Join操作,本文从原理层面介绍了SparkSQL支持的常见Join算法及其适用场景。Join背景介绍Join是数据库查询永远绕不开的话题,传统查询SQL技术总体可以分为简单操作(过滤操作-where、排序操作-limit等),聚合操作-groupby以及Join操作等。其中Join操作是最复杂、代价最大的操作类型,也是OLAP场景中使用相对较多的操作。因此很有必要对其进行深入研究。另外,从业务层面来讲,用户在数仓建设的时候也会涉
2021-01-18 09:35:02
762
原创 Hive join的三种优化方式
hive在实际的应用过程中,大部份分情况都会涉及到不同的表格的连接,例如在进行两个table的join的时候,利用MR的思想会消耗大量的内存,良妃磁盘的IO,大幅度的影响性能,因为shuffle真的好令人担心啊,总之,就是各种问题都是由他产生的。下面介绍一下涉及hive在join的时候的优化方式。map端产生joinmapJoin的主要意思就是,当链接的两个表是一个比较小的表和一个特别大的表的时候,我们把比较小的table直接放到内存中去,然后再对比较大的表格进行map操作。join就发生在map操作的
2021-01-18 09:34:53
1352
原创 (四十九)页面单跳转化率:模块介绍
功能分析用户行为分析大数据平台页面单跳转化率,非常经典的功能;而且也非常有用页面单跳转化率,计算出来以后,还是蛮有用的,蛮有价值的。产品经理,可以根据这个指标,去尝试分析,整个网站,产品,各个页面的表现怎么样,是不是需要去优化产品的布局;吸引用户最终可以进入最后的支付页面;数据分析师,可以基于咱们的这个数据,做更深一步的计算和分析企业管理层,可以看到整个公司的网站,各个页面的之间的跳转的表现,如何?心里有数,可以适当调整公司的经营战略或策略通过这个模块,我们能够收获到什么?第一个模块,用户
2021-01-18 09:34:09
244
原创 (四十八)数据倾斜解决方案之使用随机数以及扩容表进行join
当采用随机数和扩容表进行join解决数据倾斜的时候,就代表着,你的之前的数据倾斜的解决方案,都没法使用。这个方案是没办法彻底解决数据倾斜的,更多的,是一种对数据倾斜的缓解。原理,其实在上一讲,已经带出来了。步骤:1、选择一个RDD,要用flatMap,进行扩容,将每条数据,映射为多条数据,每个映射出来的数据,都带了一个n以内的随机数,通常来说,会选择10。2、将另外一个RDD,做普通的map映射操作,每条数据,都打上一个10以内的随机数。3、最后,将两个处理后的RDD,进行join操作。sa
2021-01-18 09:33:59
779
原创 (四十七)数据倾斜解决方案之sample采样倾斜key进行两次join
这个方案的实现思路,跟大家解析一下:其实关键之处在于,将发生数据倾斜的key,单独拉出来,放到一个RDD中去;就用这个原本会倾斜的key RDD跟其他RDD,单独去join一下,这个时候,key对应的数据,可能就会分散到多个task中去进行join操作。就不至于说是,这个key跟之前其他的key混合在一个RDD中时,肯定是会导致一个key对应的所有数据,都到一个task中去,就会导致数据倾斜。这种方案什么时候适合使用?优先对于join,肯定是希望能够采用上一讲讲的,reduce join转换map.
2021-01-18 09:33:50
247
原创 (四十六)数据倾斜解决方案之将reduce join转换为map join
普通的join,那么肯定是要走shuffle;那么,所以既然是走shuffle,那么普通的join,就肯定是走的是reduce join。先将所有相同的key,对应的values,汇聚到一个task中,然后再进行join。reduce join转换为map join,适合在什么样的情况下,可以来使用?如果两个RDD要进行join,其中一个RDD是比较小的。一个RDD是100万数据,一个RDD是1万数据。(一个RDD是1亿数据,一个RDD是100万数据)其中一个RDD必须是比较小的,broadca.
2021-01-18 09:33:41
234
原创 (四十五)数据倾斜解决方案之使用随机key实现双重聚合
使用随机key实现双重聚合1、原理第一轮聚合的时候,对key进行打散,将原先一样的key,变成不一样的key,相当于是将每个key分为多组;先针对多个组,进行key的局部聚合;接着,再去除掉每个key的前缀,然后对所有的key,进行全局的聚合。2、使用场景(1)groupByKey(2)reduceByKey比较适合使用这种方式;join,咱们通常不会这样来做,后面会讲三种,针对不同的join造成的数据倾斜的问题的解决方案。对groupByKey、reduceByKey造成的数据倾斜,有比.
2021-01-18 09:33:32
353
原创 (四十四)数据倾斜解决方案之提高shuffle操作reduce并行度
前言:第一个和第二个方案,都不适合做。第三个方案,提高shuffle操作的reduce并行度将reduce task的数量,变多,就可以让每个reduce task分配到更少的数据量,这样的话,也许就可以缓解,或者甚至是基本解决掉数据倾斜的问题。提升shuffle reduce端并行度,怎么来操作?很简单,主要给我们所有的shuffle算子,比如groupByKey、countByKey、reduceByKey。在调用的时候,传入进去一个参数。一个数字。那个数字,就代表了那个shuffle操
2021-01-18 09:33:21
232
原创 (四十)troubleshooting之解决yarn-cluster模式的JVM内存溢出无法执行问题
总结一下yarn-client和yarn-cluster模式的不同之处:yarn-client模式,driver运行在本地机器上的; yarn-cluster模式,driver是运行在yarn集群上某个nodemanager节点上面的。yarn-client会导致本地机器负责spark作业的调度,所以网卡流量会激增;yarn-cluster模式就没有这个问题。yarn-client的driver运行在本地,通常来说本地机器跟yarn集群都不会在一个机房的,所以说性能可能不是特别好;yarn-clu.
2021-01-18 09:33:02
162
转载 Doris SQL 原理解析
文章目录前言一、Doris简介二、SQL解析简介2.1 词法分析2.2 语法分析2.3 逻辑计划2.4 物理计划3 设计目标4 总体架构5 Parse阶段6 Analyze阶段7 生成单机逻辑Plan阶段9 Schedule阶段总结前言本文主要介绍了Doris SQL解析的原理。重点讲述了生成单机逻辑计划,生成分布式逻辑计划,生成分布式物理计划的过程。对应于代码实现是Analyze,SinglePlan,DistributedPlan,Schedule四个部分。Analyze负责对AST进行前期的
2021-01-18 09:32:06
1201
原创 (四十三)数据倾斜解决方案之聚合源数据
数据倾斜数据倾斜的解决,跟之前讲解的性能调优,有一点异曲同工之妙。性能调优,跟大家讲过一个道理,“重剑无锋”。性能调优,调了半天,最有效,最直接,最简单的方式,就是加资源,加并行度,注意RDD架构(复用同一个RDD,加上cache缓存);shuffle、jvm等,次要的。数据倾斜解决方案第一个方案和第二个方案,一起来讲。最朴素、最简谱、最直接、最有效、最简单的,解决数据倾斜问题的方案。第一个方案:聚合源数据第二个方案:过滤导致倾斜的key重剑无锋。后面的五个方案,尤其是最后4个方案,都是那种
2021-01-17 19:58:24
220
原创 (四十二)数据倾斜解决方案之原理以及现象分析
1、数据倾斜的原理2、数据倾斜的现象3、数据倾斜的产生原因与定位项目,第一个模块,用户访问session分析模块1、大数据开发流程(需求分析。。。性能调优)2、用户行为分析的业务(聚合统计、随机抽取、topn、排序)3、技术点:大数据项目模块的技术架构、spark core各种算子、自定义Accumulator、随机抽取算法、分组取topn、二次排序4、大数据项目中的性能调优和troubleshooting5、完整的数据倾斜解决方案数据倾斜在任何大数据类的项目中,都是最棘手的性能问题,最
2021-01-17 19:58:14
225
原创 (四十一)troubleshooting之错误的持久化方式以及checkpoint的使用
错误的持久化使用方式:usersRDD,想要对这个RDD做一个cache,希望能够在后面多次使用这个RDD的时候,不用反复重新计算RDD;可以直接使用通过各个节点上的executor的BlockManager管理的内存 / 磁盘上的数据,避免重新反复计算RDD。usersRDD.cache()usersRDD.count()usersRDD.take()上面这种方式,不要说会不会生效了,实际上是会报错的。会报什么错误呢?会报一大堆file not found的错误。正确的持久化使用方式:us
2021-01-17 19:58:05
203
原创 (三十九)troubleshooting之解决yarn-client模式导致的网卡流量激增问题
yarn-client模式下,会产生什么样的问题呢?由于咱们的driver是启动在本地机器的,而且driver是全权负责所有的任务的调度的,也就是说要跟yarn集群上运行的多个executor进行频繁的通信(中间有task的启动消息、task的执行统计消息、task的运行状态、shuffle的输出结果)。咱们来想象一下。比如你的executor有100个,stage有10个,task有1000个。每个stage运行的时候,都有1000个task提交到executor上面去运行,平均每个executor.
2021-01-17 19:57:55
171
原创 (三十八)troubleshooting之解决算子函数返回NULL导致的问题
在算子函数中,返回null return actionRDD.mapToPair(new PairFunction<Row, String, Row>() { private static final long serialVersionUID = 1L; @Override public Tuple2<String, Row> call(Row row) throws Exception { return new Tuple2<String
2021-01-17 19:57:46
143
原创 (三十七)troubleshooting之解决各种序列化导致的报错
你会看到什么样的序列化导致的报错?用client模式去提交spark作业,观察本地打印出来的log。如果出现了类似于Serializable、Serialize等等字眼,报错的log,那么恭喜大家,就碰到了序列化问题导致的报错。虽然是报错,但是序列化报错,应该是属于比较简单的了,很好处理。序列化报错要注意的三个点:你的算子函数里面,如果使用到了外部的自定义类型的变量,那么此时,就要求你的自定义类型,必须是可序列化的。final Teacher teacher = new Teacher("le
2021-01-17 19:57:37
230
原创 (三十六)troubleshooting之解决YARN队列资源不足导致的application直接失败
现象:如果说,你是基于yarn来提交spark。比如yarn-cluster或者yarn-client。你可以指定提交到某个hadoop队列上的。每个队列都是可以有自己的资源的。跟大家说一个生产环境中的,给spark用的yarn资源队列的情况:500G内存,200个cpu core。比如说,某个spark application,在spark-submit里面你自己配了,executor,80个;每个executor,4G内存;每个executor,2个cpu core。你的spark作业每次运行,大
2021-01-17 19:57:27
373
原创 (三十五)troubleshooting之解决JVM GC导致的shuffle文件拉取失败
每一个excutor可能会有多个task,当下游stage的excutor需要向他拉取已经完成task的输出数据时,但是由于正在进行GC,所以无法正常连接,(shuffle file not found)有时会出现的一种情况,非常普遍,在spark的作业中;shuffle file not found。(spark作业中,非常非常常见的)而且,有的时候,它是偶尔才会出现的一种情况。有的时候,出现这种情况以后,会重新去提交stage、task。重新执行一遍,发现就好了。没有这种错误了。log怎么看?用.
2021-01-17 19:57:11
136
原创 分布式存储系统Kudu与HBase的简要分析与对比
背景Cloudera在2016年发布了新型的分布式存储系统——kudu,kudu目前也是apache下面的开源项目。Hadoop生态圈中的技术繁多,HDFS作为底层数据存储的地位一直很牢固。而HBase作为Google BigTable的开源产品,一直也是Hadoop生态圈中的核心组件,其数据存储的底层采用了HDFS,主要解决的是在超大数据集场景下的随机读写和更新的问题。Kudu的设计有参考HBase的结构,也能够实现HBase擅长的快速的随机读写、更新功能。那么同为分布式存储系统,HBase和Kudu二
2021-01-17 10:59:24
427
原创 用户画像
数据中有设备的识别码一共有八个标签里面涉及到词库 所以要用到ES会更加合理这写标签都是围绕用户的id,一共会有15种id在用户标签下,如果id用户情况相同时,相同标签的累加(求交集),不同的求并集上下文标签的实现...
2021-01-17 09:49:26
188
原创 (一)转换成parquet文件
1.需求2.需求统计各省市的数据量分布地域分布报表需求 媒体其中appname可能为空,appid不为空,另外有一个表 存储app的具体信息如果使用广播变量,把app表广播出去,但是又一个缺点 就是广播出去的表就不能再更改了所以这里采取的是使用 redis存储,可以每天实时更新...
2021-01-16 19:47:04
863
原创 广告推送的相关概念
1、RTB(RealTimeBidding,实时竞价):定义:是一种利用第三方技术在数以百万计的网站上针对每一个用户展示行为进行评估以及出价的竞价技术。个人理解:如果把互联网比作蜘蛛网,那么当任何一只小生物触碰到这张网上的某个节点,它的每一个细微的动作都会带来一系列的反馈。与此同时,这张网的主人就会自动对闯入领域的访客进行信息分析。这张网的主人不断的记录着各种数据,当你第二次碰到这张网的时候,它从它的数据库发现访客的信息与它的数据库的某个信息相匹配,这时,它就可以根据这个信息进行相应的回应。每一天,这张
2021-01-16 15:22:25
1053
原创 SparkStreaming 中用 Direct 方式之Kafka 拉取数据(offset取值范围)
我们知道 SparkStreaming 用 Direct 的方式拉取 Kafka 数据时,是根据 kafka 中的 fromOffsets 和 untilOffsets 来进行获取数据的,而 fromOffsets 一般都是需要我们自己管理的,而每批次的 untilOffsets 是由 Driver 程序自动帮我们算出来的。于是产生了一个疑问:untilOffsets 是怎么算出来的?接下来就通过查看源码的方式来找出答案~首先我们写一个最简单的 wordcount 程序,代码如下:/** * C
2021-01-16 09:28:43
533
原创 spark streaming+kafka数据 自主维护offset
package com.fosun.spark_streaming_demo; import java.sql.Connection;import java.sql.ResultSet;import java.sql.Statement;import java.util.Arrays;import java.util.Collections;import java.util.HashMap;import java.util.HashSet;import java.util.List;im
2021-01-15 21:07:42
488
原创 Spark Streaming使用Receiver机制消费Kafka时,任务并发度如何设置
public final class app_kafka_receiver_spark { private static final Pattern SPACE = Pattern.compile(" "); private app_kafka_receiver_spark() { } public static void main(String[] args) throws Exception { if (args.length < 4) {
2021-01-15 17:20:02
376
1
原创 Job的资源调度
在一个spark作业内部,多个并行的job是可以同时运行的。对于job,就是一个spark action操作触发的计算单元。spark的调度器是完全线程安全的,而且支持一个spark application来服务多个网络请求,以及并发执行多个job。默认情况下,spark的调度会使用FIFO的方式来调度多个job。每个job都会被划分为多个stage,而且第一个job会对所有可用的资源获取优先使用权,并且让它的stage的task去运行,然后第二个job再获取资源的使用权,以此类推。如果队列头部的jo
2021-01-15 16:44:53
481
原创 SparkSQL图解版
sparksql的底层源码的剖析 /** * Executes a SQL query using Spark, returning the result as a `DataFrame`. * The dialect that is used for SQL parsing can be configured with 'spark.sql.dialect'. * * 使用Spark执行一个SQL查询,将结果返回为“DataFrame”。用于SQL解析的方言可以配置为“.
2021-01-15 15:37:24
251
原创 (一)sparkstreaming的两种数据接收方式
Receiver based Approach基于receiver的方式是使用kafka消费者高阶API实现的。对于所有的receiver,它通过kafka接收的数据会被存储于spark的executors上,底层是写入BlockManager中,默认200ms生成一个block(通过配置参数spark.streaming.blockInterval决定)。然后由spark streaming提交的job构建BlockRdd,最终以spark core任务的形式运行。关于receiver方式,有以下几点需
2021-01-14 20:14:40
795
原创 (三十四)troubleshooting之控制shuffle reduce端缓冲大小以避免OOM
map端的task是不断的输出数据的,数据量可能是很大的。但是,其实reduce端的task,并不是等到map端task将属于自己的那份数据全部写入磁盘文件之后,再去拉取的。map端写一点数据,reduce端task就会拉取一小部分数据,立即进行后面的聚合、算子函数的应用。每次reduece能够拉取多少数据,就由buffer来决定。因为拉取过来的数据,都是先放在buffer中的。然后才用后面的executor分配的堆内存占比(0.2),hashmap,去进行后续的聚合、函数的执行。reduce端缓冲.
2021-01-14 13:56:01
211
1
原创 (三十三)算子调优之使用repartition解决Spark SQL低并行度的性能问题
val lines = sc.textFile("hdfs://")val words = lines.flatMap(_.split(" "))val pairs = words.map((_, 1))val counts = pairs.reduceByKey(_ + _)counts.collect()reduceByKey:相较于普通的shuffle操作(比如groupByKey),它的一个特点,就是说,会进行map端的本地聚合。对map端给下个stage每个task创建的输
2021-01-14 13:55:50
277
原创 (三十二)算子调优之使用repartition解决Spark SQL低并行度的性能问题
并行度:之前说过,并行度是自己可以调节,或者说是设置的。1、spark.default.parallelism2、textFile(),传入第二个参数,指定partition数量(比较少用)咱们的项目代码中,没有设置并行度,实际上,在生产环境中,是最好自己设置一下的。官网有推荐的设置方式,你的spark-submit脚本中,会指定你的application总共要启动多少个executor,100个;每个executor多少个cpu core,2~3个;总共application,有cpu core,
2021-01-14 13:55:36
793
原创 sparksql底层的实现原理
Spark SQL 底层实现原理 1. Spark SQL架构设计2. SparkSQL执行过程3. SQL举例4. Catalyst执行过程4.1 sql解析阶段Parser4.2 绑定逻辑计划Analyzer4.3 逻辑优化阶段Optimizer4.3.1 谓词下推4.3...
2021-01-14 13:54:39
329
原创 (三十一)算子调优之使用foreachPartition优化写数据库性能
默认的foreach的性能缺陷在哪里?首先,对于每条数据,都要单独去调用一次function,task为每个数据,都要去执行一次function函数。如果100万条数据,(一个partition),调用100万次。性能比较差。另外一个非常非常重要的一点如果每个数据,你都去创建一个数据库连接的话,那么你就得创建100万次数据库连接。但是要注意的是,数据库连接的创建和销毁,都是非常非常消耗性能的。虽然我们之前已经用了数据库连接池,只是创建了固定数量的数据库连接。你还是得多次通过数据库连接,往数据库.
2021-01-13 14:15:44
331
原创 (三十) 算子调优之filter过后使用coalesce减少分区数量
默认情况下,经过了这种filter之后,RDD中的每个partition的数据量,可能都不太一样了。(原本每个partition的数据量可能是差不多的)问题:1、每个partition数据量变少了,但是在后面进行处理的时候,还是要跟partition数量一样数量的task,来进行处理;有点浪费task计算资源。2、每个partition的数据量不一样,会导致后面的每个task处理每个partition的时候,每个task要处理的数据量就不同,这个时候很容易发生什么问题?数据倾斜。。。。比如说,第二.
2021-01-13 11:05:54
349
1
原创 (二十九)算子调优之MapPartitions提升Map类操作性能
MapPartitions操作的优点:如果是普通的map,比如一个partition中有1万条数据;ok,那么你的function要执行和计算1万次。但是,使用MapPartitions操作之后,一个task(其实就是一个分区)仅仅会执行一次function,function一次接收所有的partition数据。只要执行一次就可以了,性能比较高。MapPartitions的缺点:一定是有的。如果是普通的map操作,一次function的执行就处理一条数据;那么如果内存不够用的情况下,比如处理了1.
2021-01-13 10:57:43
323
原创 (二十八)Shuffle调优之HashShuffleManager与SortShuffleManager
前言spark.shuffle.manager:hash、sort、tungsten-sort(自己实现内存管理)之前我们所讲的,其实都是已经属于Spark中,比较老旧的一种shuffle manager,HashShuffleManager;这种manager,实际上,从spark 1.2.x版本以后,就不再是默认的选择了。HashShuffleManager的原理,以及对应的一些性能调优的点,基本上,之前几讲,咱们就都讲过了。spark 1.2.x版本以后,默认的shuffle manager,
2021-01-13 10:48:09
260
原创 (二十七)Shuffle调优之调节map端内存缓冲与reduce端内存占比
spark.shuffle.file.buffer,默认32kspark.shuffle.memoryFraction,0.2map端内存缓冲,reduce端内存占比;很多资料、网上视频,都会说,这两个参数,是调节shuffle性能的不二选择,很有效果的样子,实际上,不是这样的。以实际的生产经验来说,这两个参数没有那么重要,往往来说,shuffle的性能不是因为这方面的原因导致的但是,有一点点效果的,broadcast,数据本地化等待时长;这两个shuffle调优的小点,其实也是需要跟其他的大量的小
2021-01-13 10:33:32
221
原创 (二十六)Shuffle调优之原理概述
什么样的情况下,会发生shuffle?在spark中,主要是以下几个算子:groupByKey、reduceByKey、countByKey、join,等等。什么是shuffle?groupByKey,要把分布在集群各个节点上的数据中的同一个key,对应的values,都给集中到一块儿,集中到集群中同一个节点上,更严密一点说,就是集中到一个节点的一个executor的一个task中。然后呢,集中一个key对应的values之后,才能交给我们来进行处理,<key, Iterable>;re
2021-01-13 10:19:29
301
原创 (二十五)JVM调优之调节executor堆外内存与连接等待时长
executor堆外内存有时候,如果你的spark作业处理的数据量特别特别大,几亿数据量;然后spark作业一运行,时不时的报错,shuffle file cannot find,executor、task lost,out of memory(内存溢出);可能是说executor的堆外内存不太够用,导致executor在运行的过程中,可能会内存溢出;然后可能导致后续的stage的task在运行的时候,可能要从一些executor中去拉取shuffle map output文件,但是executor可能
2021-01-13 09:37:25
244
原创 (二十四)JVM调优之原理概述以及降低cache操作的内存占比
文章目录前言JVMJVM调优Spark的内存结构:spark1.6之前的内存结构spark1.6之后的内存结构前言1、常规性能调优:分配资源、并行度。。。等2、JVM调优(Java虚拟机):JVM相关的参数,通常情况下,如果你的硬件配置、基础的JVM的配置,都ok的话,JVM通常不会造成太严重的性能问题;反而更多的是,在troubleshooting中,JVM占了很重要的地位;JVM造成线上的spark作业的运行报错,甚至失败(比如OOM)。3、shuffle调优(相当重要):spark在执行gr
2021-01-13 09:19:52
206
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人