[数据倾斜及调优概述] 大数据分布式计算中一个常见的棘手问题——数据倾斜: 在进行shuffle的时候,必须将各个节点上相同的key拉取到某个节点上的一个task来进行处理,比如按照key进行聚合或join等操作.此时如果某个key对应的数据量特别大的话,就会发生数据倾斜.比如大部分key对应10条数据,但是个别key却对应了百万条数据,那么大部分task可能就只会分配到10条数据,然后1秒钟就运行完了:但是个别task可能分配到了百万数据,要运行一两个小时.木桶原理,整个作业的运行进度是由运行…
[使用场景] 对RDD执行reduceByKey等聚合类shuffle算子或者在Spark SQL中使用group by语句进行分组聚合时,经过sample或日志.界面定位,发生了数据倾斜. [解决方案] 局部聚合+全局聚合,进行两阶段聚合.具体为: 将原本相同的key通过附加随机前缀的方式,变成多个不同的key,就可以让原本被一个task处理的数据分散到多个task上去做局部聚合,进而解决单个task处理数据量过多的问题.接着去除掉随机前缀,再次进行全局聚合,就可以得到最终的结果. 第一步:给…
数据倾斜 为什么会数据倾斜 spark 中的数据倾斜并不是说原始数据存在倾斜,原始数据都是一个一个的 block,大小都一样,不存在数据倾斜: 而是指 shuffle 过程中产生的数据倾斜,由于不同的 key 对应的数据量不同导致不同 task 处理的数据量不同 注意:数据倾斜与数据过量不同,数据倾斜是某几个 task 处理的数据量很大,数据过量是所有 task 处理的数据量都很大 数据倾斜的表现 大部分 task 都快速执行完毕,少数 task 执行缓慢,甚至报错 OOM,即使最终运行完毕,也…
什么是数据倾斜? Spark 的计算抽象如下 数据倾斜指的是:并行处理的数据集中,某一部分(如 Spark 或 Kafka 的一个 Partition)的数据显著多于其它部分,从而使得该部分的处理速度成为整个数据集处理的瓶颈. 如果数据倾斜不能解决,其他的优化手段再逆天都白搭,如同短板效应,任务完成的效率不是看最快的task,而是最慢的那一个. 数据倾导致的后果: 数据倾斜直接可能会导致一种情况:Out Of Memory 或者GC 超时. 任务不一定失败,但是极端慢.(但是目前我遇到的数据倾斜…
[使用场景] 对RDD使用join类操作,或者是在Spark SQL中使用join语句时,而且join操作中的一个RDD或表的数据量比较小(例如几百MB或者1~2GB),比较适用此方案. [解决方案] 小表join大表转为小表broadcast+map大表实现.具体为: 普通的join是会shuffle的,而一旦shuffle,就相当于会将相同key的数据拉取到一个shuffle read task中再进行join,此时就是reduce join,此时如果发生数据倾斜,影响处理性能,而此时恰好一…
[业务场景] 在Spark的统计开发过程中,肯定会遇到类似小维表join大业务表的场景,或者需要在算子函数中使用外部变量的场景(尤其是大变量,比如100M以上的大集合),那么此时应该使用Spark的广播(Broadcast)功能来提升性能. [原理说明] 在算子函数中使用到外部变量或两表join时,默认情况下,Spark会将该变量或小维表复制多个副本,通过网络传输到task中,此时每个task都有一个变量副本.如果变量本身比较大的话(比如100M,甚至1G),那么大量的变量副本在网络中传输的性能…
[使用场景] 两个RDD进行join的时候,如果数据量都比较大,那么此时可以sample看下两个RDD中的key分布情况.如果出现数据倾斜,是因为其中某一个RDD中的少数几个key的数据量过大,而另一个RDD中的所有key都分布比较均匀,此时可以考虑采用本解决方案. [解决方案] 对有数据倾斜那个RDD,使用sample算子采样出一份样本,统计下每个key的数量,看看导致数据倾斜数据量最大的是哪几个key. 然后将这几个key对应的数据从原来的RDD中拆分出来,形成一个单独的RDD,并给每个ke…
Spark相关问题 Spark比MR快的原因? 1) Spark的计算结果可以放入内存,支持基于内存的迭代,MR不支持. 2) Spark有DAG有向无环图,可以实现pipeline的计算模式. 3) 资源调度模式:Spark粗粒度资源调度,MR是细粒度资源调度. 资源复用:Spark中的task可以复用同一批Executor的资源. MR里面每一个map task对应一个jvm,不能复用资源. Spark中主要进程的作用? Driver进程:负责任务的分发和结果的回收. Executor进程:…
分为几个部分: 开发调优.资源调优.数据倾斜调优.shuffle调优 开发调优: 主要包括这几个方面 RDD lineage设计.算子的合理使用.特殊操作的优化等 避免创建重复的RDD,尽可能复用同一个RDD 一个RDD包含另外一个RDD,对多次使用的RDD进行持久化 内存(序列化),磁盘(序列化) 尽量避免使用shuffle类算子 shuffle过程中,各个节点上的相同key都会先写入本地磁盘文件中,然后其他节点需要通过网络传输拉取各个节点上的磁盘文件中的相同key.而且相同key都拉取到同一…
版权声明:本文为博主原创文章,转载请注明出处. Spark调优秘诀 1.诊断内存的消耗 在Spark应用程序中,内存都消耗在哪了? 1.每个Java对象都有一个包含该对象元数据的对象头,其大小是16个Byte.由于在写代码时候,可能会出现这种情况:对象头比对象本身占有的字节数更多,比如对象只有一个int的域.一般这样设计是不合理的,造成对象的“浪费”,在实际开发中应避免这种情况. 2.Java的String对象,会比它内部的原始数据要多出40个字节.因为它内部使用char数组来保存内部的字符序列…
Spark版本:1.1.0 本文系以开源中国社区的译文为基础,结合官方文档翻译修订而来,转载请注明以下链接: http://www.cnblogs.com/zhangningbo/p/4117981.html http://www.oschina.net/translate/spark-tuning 目录 数据序列化 内存优化 确定内存消耗 优化数据结构 序列化RDD存储 优化内存回收 其他考虑因素 并行度 Reduce任务的内存用量 广播”大变量“ 总结 因为大多数Spark程序都具有“内存计…
[生产实践经验] 生产实践中的切身体会是:影响Spark性能的大BOSS就是shuffle,抓住并解决shuffle这个主要原因,事半功倍. [Shuffle原理学习笔记] 1.未经优化的HashShuffleManager 注:这是spark1.2版本之前,最早使用的shuffle方法,这种shuffle方法不要使用,只是用来对比改进后的shuffle方法.  如上图,上游每个task 都输出下游task个数的结果文件,下游每个task去上游task输出的结果文件中获取对应自己的. 问题: 生…
聚合操作使用reduceByKey/aggregateByKey替代groupByKey 参见我的这篇博客说明 [Spark调优]:如果实在要shuffle,使用map侧预聚合的算子 内存充足前提下使用mapPartitions替代普通map mapPartitions类的算子,一次函数调用会处理一个partition所有的数据,而不是一次函数调用处理一条,性能相对来说会高一些.但是有的时候,使用mapPartitions会出现OOM(内存溢出)问题.因为单次函数调用就要处理掉一个partiti…
总结一下spark的调优方案--性能调优: 一.调节并行度 1.性能上的调优主要注重一下几点: Excutor的数量 每个Excutor所分配的CPU的数量 每个Excutor所能分配的内存量 Driver端分配的内存数量 2.如何分配资源 在生产环境中,提交spark作业的时候,使用的是spark-submit shell脚本,里面调整对应的参数. ./bin/spark-submit \ --class com.spark.sparkTest.WordCount \ --num-execut…
本文旨在解析 spark on Yarn 的内存管理,使得 spark 调优思路更加清晰 内存相关参数 spark 是基于内存的计算,spark 调优大部分是针对内存的,了解 spark 内存参数有也助于我们理解 spark 内存管理 spark.driver.memory:默认 512M spark.executor.memory:默认 512M spark.yarn.am.memory:默认 512M spark.yarn.driver.memoryOverhead:driver memor…
*以下内容由<Spark快速大数据分析>整理所得. 读书笔记的第五部分是讲的是Spark调优相关的知识点. 一.并行度调优 二.序列化格式优化 三.内存管理优化 四.Spark SQL性能优化 一.并行度调优 并行度调优有两种方法: 1. 是在数据混洗操作时,使用参数的方式为混洗后的RDD指定并行度. 2. 对于任何已有的RDD,可以进行重新分区来获取更多或者更少的分区数.重新分区操作通过 repartition() 实现,该操作会把 RDD随机打乱并分成设定的分区数目.如果你确定要减少RDD…
Spark调优 | Spark Streaming 调优 1.数据序列化 2.广播大变量 3.数据处理和接收时的并行度 4.设置合理的批处理间隔 5.内存优化 5.1 内存管理 5.2优化策略 5.3垃圾回收(GC)优化 5.5Spark Streaming 内存优化 6.实例项目调优 6.1合理的批处理时间(batchDuration) 6.2合理的 Kafka 拉取量(maxRatePerPartition 参数设置) 6.3缓存反复使用的 Dstream(RDD) 6.4其他一些优化策略…
Spark调优,性能优化 1.使用reduceByKey/aggregateByKey替代groupByKey 2.使用mapPartitions替代普通map 3.使用foreachPartitions替代foreach 4.使用filter之后进行coalesce操作 5.使用repartitionAndSortWithinPartitions替代repartition与sort类操作 6.使用broadcast使各task共享同一Executor的集合替代算子函数中各task传送一份集合…
[场景] Spark提交作业job的时候要指定该job可以使用的CPU.内存等资源参数,生产环境中,任务资源分配不足会导致该job执行中断.失败等问题,所以对Spark的job资源参数分配调优非常重要. spark提交作业,yarn-cluster模式示例: ./bin/spark-submit\ --class com.ww.rdd.wordcount \ --master yarn \ --deploy-mode cluster \  --executor-memory 4G \ --num…
[Java序列化与反序列化] Java序列化是指把Java对象转换为字节序列的过程:而Java反序列化是指把字节序列恢复为Java对象的过程.序列化使用场景:1.数据的持久化,通过序列化可以把数据永久地保存到硬盘上(通常存放在文件里).2.远程通信,即在网络上传送对象的字节序列. 这篇文章写的不错https://blog.csdn.net/wangloveall/article/details/7992448 [Spark序列化与反序列化场景] 在Spark中,主要有三个地方涉及序列化与反序列化…
由于Spark自己的调优guidance已经覆盖了很多很有价值的点,因此这里直接翻译一份过来.也作为一个积累. Spark 调优 (Tuning Spark) 由于大多数Spark计算任务是在内存中运行计算,任何集群中的资源限制都可能成为Spark程序的瓶颈,比如:CPU.网络.带宽.内存.通常情况下,如果内存能容纳所处理数据,主要的瓶颈则仅是网络带宽.但有些时候您也需要做一些调优,比如利用RDD序列化存储来降低内存消耗.本手册将会涵盖以下两个大点:数据序列化(对优化网络传输和降低内存开销有显著…
Spark 调优 返回原文英文原文:Tuning Spark Because of the in-memory nature of most Spark computations, Spark programs can be bottlenecked by any resource in the cluster: CPU, network bandwidth, or memory. Most often, if the data fits in memory, the bottleneck is…
spark调优是须要依据业务须要调整的,并非说某个设置是一成不变的,就比方机器学习一样,是在不断的调试中找出当前业务下更优的调优配置.以下零碎的总结了一些我的调优笔记. spark 存储的时候存在严重的分配不均的现象,有几台机器在过渡使用, 有几台机器却非常少被使用.有几台机器缓存了几十个上百个RDD blocks  有的机器一个RDD blocks 都没有.这样存储有RDD blocks 的能够进行运算.运算的tasks 最多为该机器core数. spark.storage.memoryFra…
Spark学习之Spark调优与调试(7) 1. 对Spark进行调优与调试通常需要修改Spark应用运行时配置的选项. 当创建一个SparkContext时就会创建一个SparkConf实例. 2. Spark特定的优先级顺序来选择实际配置: 优先级最高的是在用户代码中显示调用set()方法设置选项: 其次是通过spark-submit传递的参数: 再次是写在配置文件里的值: 最后是系统的默认值. 3.查看应用进度信息和性能指标有两种方式:网页用户界面.驱动器和执行器进程生成的日志文件. 4.…
摘抄自:https://tech.meituan.com/spark-tuning-pro.html 数据倾斜调优 调优概述 有的时候,我们可能会遇到大数据计算中一个最棘手的问题——数据倾斜,此时Spark作业的性能会比期望差很多.数据倾斜调优,就是使用各种技术方案解决不同类型的数据倾斜问题,以保证Spark作业的性能. 数据倾斜发生时的现象 绝大多数task执行得都非常快,但个别task执行极慢.比如,总共有1000个task,997个task都在1分钟之内执行完了,但是剩余两三个task却要…
调优概述 有的时候,我们可能会遇到大数据计算中一个最棘手的问题--数据倾斜,此时Spark作业的性能会比期望差很多.数据倾斜调优,就是使用各种技术方案解决不同类型的数据倾斜问题,以保证Spark作业的性能. 数据倾斜发生时的现象 绝大多数task执行得都非常快,但个别task执行极慢.比如,总共有1000个task,997个task都在1分钟之内执行完了,但是剩余两三个task却要一两个小时.这种情况很常见. 原本能够正常执行的Spark作业,某天突然报出OOM(内存溢出)异常,观察异常栈,是我…
1.数据倾斜 1.1 数据倾斜的现象 现象一:大部分的task都能快速执行完,剩下几个task执行非常慢 现象二:大部分的task都能快速执行完,但总是执行到某个task时就会报OOM,JVM out of Memory,task faild,task lost,resubmitting task等错误 1.2 出现的原因 大部分task分配的数据很少(某个可以对应的values只有几个),但某几个task分配的数据非常多(某个key对应的values非常多) 2.数据倾斜解决方案 2.1 聚合…
资源调优 (1). 在部署 spark 集群中指定资源分配的默认参数 在 spark 安装包的 conf 下的 spark-env.sh SPARK_WORKER_CORES SPARK_WORKER_MEMORY SPARK_WORKER_INSTANCES 每台机器启动 worker 数 (2). 在提交 Application 的时候给当前的 Application 分配更多的资源 提交命令选项: (在提交 Application 的时候使用选项) --executor-cores --e…
1.诊断内存的消耗 在Spark应用程序中,内存都消耗在哪了? 1.每个Java对象都有一个包含该对象元数据的对象头,其大小是16个Byte.由于在写代码时候,可能会出现这种情况:对象头比对象本身占有的字节数更多,比如对象只有一个int的域.一般这样设计是不合理的,造成对象的“浪费”,在实际开发中应避免这种情况. 2.Java的String对象,会比它内部的原始数据要多出40个字节.因为它内部使用char数组来保存内部的字符序列的,并且还得保存诸如数组长度之类的信息.而且String使用的是UT…
数据倾斜即为数据在节点上分布不均,是常见的优化过程中常见的需要解决的问题.常见的Hive调优的方法:列剪裁.Map Join操作. Group By操作.合并小文件. 一.表现 1.任务进度长度为99%,在任务监控页面中发现只有几个 reduce 子任务未完成: 2.单一 reduce 记录与平均记录数差异过大(大于3倍),最长时长>>平均时长: 3.job数多的,效率低,多次关联后,产生几个jobs,起码半小时以上才跑完: 二.原因 1.key分布不均: 2.业务数据本身问题: 3.建表有问…