随笔分类 -  Spark

摘要:【使用场景】 两个RDD进行join的时候,如果数据量都比较大,那么此时可以sample看下两个RDD中的key分布情况。如果出现数据倾斜,是因为其中某一个RDD中的少数几个key的数据量过大,而另一个RDD中的所有key都分布比较均匀,此时可以考虑采用本解决方案。 【解决方案】 【方案优点】 对于 阅读全文
posted @ 2019-03-26 00:38 wwcom123 阅读(4931) 评论(0) 推荐(0) 编辑
摘要:【使用场景】 对RDD使用join类操作,或者是在Spark SQL中使用join语句时,而且join操作中的一个RDD或表的数据量比较小(例如几百MB或者1~2GB),比较适用此方案。 【解决方案】 小表join大表转为小表broadcast+map大表实现。具体为: 普通的join是会shuff 阅读全文
posted @ 2019-03-24 00:23 wwcom123 阅读(11999) 评论(0) 推荐(3) 编辑
摘要:【使用场景】 对RDD执行reduceByKey等聚合类shuffle算子或者在Spark SQL中使用group by语句进行分组聚合时,经过sample或日志、界面定位,发生了数据倾斜。 【解决方案】 局部聚合+全局聚合,进行两阶段聚合。具体为: 将原本相同的key通过附加随机前缀的方式,变成多 阅读全文
posted @ 2019-03-22 23:46 wwcom123 阅读(1421) 评论(0) 推荐(0) 编辑
摘要:【数据倾斜及调优概述】 大数据分布式计算中一个常见的棘手问题——数据倾斜: 在进行shuffle的时候,必须将各个节点上相同的key拉取到某个节点上的一个task来进行处理,比如按照key进行聚合或join等操作。此时如果某个key对应的数据量特别大的话,就会发生数据倾斜。比如大部分key对应10条 阅读全文
posted @ 2019-03-21 22:39 wwcom123 阅读(3150) 评论(0) 推荐(0) 编辑
摘要:【业务场景】 在Spark的统计开发过程中,肯定会遇到类似小维表join大业务表的场景,或者需要在算子函数中使用外部变量的场景(尤其是大变量,比如100M以上的大集合),那么此时应该使用Spark的广播(Broadcast)功能来提升性能。 【原理说明】 在算子函数中使用到外部变量或两表join时, 阅读全文
posted @ 2019-03-20 23:40 wwcom123 阅读(1157) 评论(0) 推荐(0) 编辑
摘要:【场景】 Spark提交作业job的时候要指定该job可以使用的CPU、内存等资源参数,生产环境中,任务资源分配不足会导致该job执行中断、失败等问题,所以对Spark的job资源参数分配调优非常重要。 spark提交作业,yarn-cluster模式示例: ./bin/spark-submit\ 阅读全文
posted @ 2019-03-19 22:09 wwcom123 阅读(1749) 评论(0) 推荐(0) 编辑
摘要:【Java序列化与反序列化】 Java序列化是指把Java对象转换为字节序列的过程;而Java反序列化是指把字节序列恢复为Java对象的过程。序列化使用场景:1.数据的持久化,通过序列化可以把数据永久地保存到硬盘上(通常存放在文件里)。2.远程通信,即在网络上传送对象的字节序列。 这篇文章写的不错h 阅读全文
posted @ 2019-03-18 22:17 wwcom123 阅读(1456) 评论(0) 推荐(0) 编辑
摘要:【Spark内存模型】 Spark在一个executor中的内存分为3块:storage内存、execution内存、other内存。 1. storage内存:存储broadcast,cache,persist数据的地方。 2. execution内存:执行内存,join、aggregate、ma 阅读全文
posted @ 2019-03-17 23:28 wwcom123 阅读(1497) 评论(0) 推荐(0) 编辑
摘要:【生产实践经验】 【生产实践经验】 生产实践中的切身体会是:影响Spark性能的大BOSS就是shuffle,抓住并解决shuffle这个主要原因,事半功倍。 【Shuffle原理学习笔记】 【Shuffle原理学习笔记】 1.未经优化的HashShuffleManager 注:这是spark1.2 阅读全文
posted @ 2019-03-16 10:46 wwcom123 阅读(838) 评论(0) 推荐(0) 编辑
摘要:数据本地化对于Spark Job性能有着巨大的影响,如果数据以及要计算它的代码是在一起的,那么性能当然会非常高。但是,如果数据和计算它的代码是分开的,那么其中之一必须到另外一方的机器上。移动代码到其匹配的数据节点,会比移动大量数据到代码所在的节点上去,速度要快得多,因为代码比较小。Spark也正是基 阅读全文
posted @ 2019-03-14 22:20 wwcom123 阅读(500) 评论(0) 推荐(0) 编辑
摘要:聚合操作使用reduceByKey/aggregateByKey替代groupByKey 聚合操作使用reduceByKey/aggregateByKey替代groupByKey 参见我的这篇博客说明 【Spark调优】:如果实在要shuffle,使用map侧预聚合的算子 内存充足前提下使用mapP 阅读全文
posted @ 2019-03-13 10:43 wwcom123 阅读(381) 评论(0) 推荐(0) 编辑
摘要:因业务上的需要,无可避免的一些运算一定要使用shuffle操作,无法用map类的算子来替代,那么尽量使用可以map侧预聚合的算子。 map侧预聚合,是指在每个节点本地对相同的key进行一次聚合操作,类似于MapReduce中的本地combine。map-side预聚合之后,每个节点本地就只会有一条相 阅读全文
posted @ 2019-03-12 08:55 wwcom123 阅读(1133) 评论(0) 推荐(0) 编辑
摘要:如果有可能的话,尽量避免使用shuffle类算子。因为Spark作业运行过程中,最消耗性能的地方就是shuffle过程。shuffle过程,就是将分布在集群中多个节点上的同一个key,拉取到同一个节点上,进行聚合或join等操作。比如reduceByKey、join等算子,都会触发shuffle操作 阅读全文
posted @ 2019-03-11 22:36 wwcom123 阅读(2305) 评论(0) 推荐(0) 编辑
摘要:Job->Stage->Task开发完一个应用以后,把这个应用提交到Spark集群,这个应用叫Application。这个应用里面开发了很多代码,这些代码里面凡是遇到一个action操作,就会产生一个job任务。 一个Application有一个或多个job任务。job任务被DAGScheduler 阅读全文
posted @ 2019-03-07 22:07 wwcom123 阅读(1777) 评论(0) 推荐(1) 编辑
摘要:Spark内部有若干术语(Executor、Job、Stage、Task、Driver、DAG等),需要理解并搞清其内部关系,因为这是性能调优的基石。 节点类型有: 1. Master 节点: 常驻master进程,负责管理全部worker节点。 2. Worker 节点: 常驻worker进程,负 阅读全文
posted @ 2019-03-05 21:48 wwcom123 阅读(1281) 评论(0) 推荐(0) 编辑
摘要:【场景】 Spark对RDD执行一系列算子操作时,都会重新从头到尾计算一遍。如果中间结果RDD后续需要被被调用多次,可以显式调用 cache()和 persist(),以告知 Spark,临时保存之前的计算结果,这样后续多个RDD使用时,就不用重新计算该临时结果了,从而节约计算资源。 要注意cach 阅读全文
posted @ 2019-02-28 10:52 wwcom123 阅读(925) 评论(0) 推荐(0) 编辑
摘要:我的代码实践:https://github.com/wwcom614/Spark 1、RDD是Spark提供的核心抽象,全称为Resillient Distributed Dataset,即弹性分布式数据集。 2、RDD在抽象上来说是一种元素集合,包含了数据。它是被分区的,分为多个分区,每个分区分布 阅读全文
posted @ 2019-02-20 23:12 wwcom123 阅读(293) 评论(0) 推荐(0) 编辑
摘要:在spark中,reduceByKey、groupByKey和combineByKey这三种算子用的较多,结合使用过程中的体会简单总结: 我的代码实践:https://github.com/wwcom614/Spark •reduceByKey 用于对每个key对应的多个value进行merge操作 阅读全文
posted @ 2019-02-18 22:43 wwcom123 阅读(1298) 评论(0) 推荐(0) 编辑