apache spark_Apache Spark Job的剖析

apache spark

Apache Spark是通用的大规模数据处理框架。 了解spark如何执行作业对于获取大部分作业非常重要。

关于Spark评估范式的简要介绍:Spark使用的是惰性评估范式,在该范式中,Spark应用程序在驱动程序调用“ Action”之前不会执行任何操作。

惰性评估是火花可以完成的所有运行时/编译时优化的关键。

懒惰的评估不是新概念。 它在函数式编程中使用了数十年。 数据库还使用它来创建逻辑和物理执行计划。 像tensorflow这样的神经网络框架也基于惰性评估。 首先,它构建计算图,然后执行它。

Apache Spark

Spark应用程序由工作,阶段和任务组成。 作业和任务由Spark并行执行,但作业内部阶段是顺序执行的。 当您想要调整火花作业时,了解并行执行和顺序执行的内容非常重要。

阶段是按顺序执行的,因此具有多个阶段的作业将使它窒息,并且前一阶段将进入下一个阶段,并带来一些开销,其中包括将阶段输出写入持久性源(即磁盘,hdfs,s3等)并再次读取。 这也称为广泛转换/混洗依赖性。

单阶段作业将非常快,但是您无法使用单阶段构建任何有用的应用程序。

例子

让我们看一些代码示例以更好地理解这一点。

val topXNumbers = randomNumbers.filter(_ > 1000) //Stage 1.map(value => (value, 1)) // Stage 1.groupByKey() //Stage 2.map(value => (value._1, value._2.sum)) //Stage 2.sortBy(_._2, false) //Stage 3.count() // Stage 3

星火DAG
Apache Spark

spark ui的DAG视图非常清楚地表明Spark如何查看/执行应用程序。

上面的代码创建了3个阶段,每个阶段的边界都有一些开销,例如(Shuffle读/写)。

单阶段(例如阶段1)中的步骤已合并过滤器和地图。

该视图还具有“任务”,这是执行的最小工作单元。 该应用程序每个阶段有2个任务。

spark应用程序如何执行? 让我们深入研究如何执行它。 Spark应用程序需要3个组件来执行:

  • 驱动程序–提交请求以掌握和协调所有任务。
  • 集群管理器–根据驱动程序的请求启动spark执行程序。
  • 执行器–执行作业并将结果发送回驱动程序。

Apache Spark

Spark应用程序涉及的2个重要组件是Driver&Executor,当这些组件中的任何一个承受压力时,Spark作业可能会失败,可能是内存/ CPU /网络/磁盘。

在下一节中,我将分享我在执行人方面的一些经验。

执行器问题 :每个执行器需要2个参数“核心和内存”。 核心决定了执行者可以处理多少个任务,并且该执行者中所有核心/任务之间共享内存。 每个火花作业都有不同类型的需求,因此
反模式,以对所有Spark应用程序使用单一配置。

问题1 –执行者的任务太大:如果任务太大而无法容纳在内存中,执行者将无法处理任务或运行缓慢。 几件事寻找这个问题:

  • 驱动程序日志文件长时间停顿(即日志文件不移动)
  • GC时间过长,可以从spark UI的“执行者”页面进行验证
Apache Spark
  • 重试舞台

Apache Spark

  • 执行器完整记录“内存溢出图”消息
2018-09-30 03:30:06 INFO  ExternalSorter:54 - Thread 44 spilling in-memory map of 371.0 MB to disk (6 times so far)
2018-09-30 03:30:24 INFO  ExternalSorter:54 - Thread 44 spilling in-memory map of 379.5 MB to disk (7 times so far)
2018-09-30 03:30:38 INFO  ExternalSorter:54 - Thread 44 spilling in-memory map of 373.8 MB to disk (8 times so far)
2018-09-30 03:30:58 INFO  ExternalSorter:54 - Thread 44 spilling in-memory map of 384.0 MB to disk (9 times so far)
2018-09-30 03:31:17 INFO  ExternalSorter:54 - Thread 44 spilling in-memory map of 382.7 MB to disk (10 times so far)
2018-09-30 03:31:38 INFO  ExternalSorter:54 - Thread 44 spilling in-memory map of 371.0 MB to disk (11 times so far)
2018-09-30 03:31:58 INFO  ExternalSorter:54 - Thread 44 spilling in-memory map of 371.0 MB to disk (12 times so far)
  • 执行器日志出现OOM错误
2018-09-30 03:34:35 ERROR Executor:91 - Exception in task 0.0 in stage 3.0 (TID 273)
java.lang.OutOfMemoryError: GC overhead limit exceededat java.util.Arrays.copyOfRange(Arrays.java:3664)at java.lang.String.<init>(String.java:207)at java.lang.StringBuilder.toString(StringBuilder.java:407)at sun.reflect.MethodAccessorGenerator.generateName(MethodAccessorGenerator.java:770)at sun.reflect.MethodAccessorGenerator.generate(MethodAccessorGenerator.java:286)at sun.reflect.MethodAccessorGenerator.generateSerializationConstructor(MethodAccessorGenerator.java:112)

如何解决呢?

很快出现的一种选择是在执行程序端增加内存。 它可以工作,但是可以在执行程序端添加多少内存将受到限制,因此很快您将用尽此选项,因为大多数集群都是共享的,并且它对可分配给执行程序的最大内存有限制。

下一个更好的选择是减小单个任务的大小,一切由您控制。 这需要更多的洗牌权衡,但是仍然比以前更好。

Spark UI快照,可用于不良运行和良好运行。

Apache Spark

不良运行

Apache Spark

好运

第二个是调整分区大小。 不良运行表明所有需要调整分区大小的指标。

问题2 –执行程序中的内核过多 :这也是一个非常常见的问题,因为我们想通过抛出太多任务来使执行程序过载。 让我们看看如何找出是否存在此问题:

  • 在执行者方面花费在GC上的时间
  • 执行器日志和消息–溢出的内存映射
  • 任务执行期间执行程序上的峰值执行内存 。 仅当作业不在历史记录服务器上运行时,此选项才可用。

我将放置来自sparkUI的2个快照

Partition Executor Cores MemoryRun 1 100 2 4 2gRun 1 100 2 2 2g
Apache Spark

4核/ 2执行器

Apache Spark

2核心/ 2执行器

8核(4 * 2 Exe)一个人忙于GC开销,而4核(2 * 2 Executor)的一切都减少了一半,仅使用4个核就更高效。

如果您看到这样的模式,请减少执行程序核心,并增加执行程序数量,以使Spark工作更快。

问题3 –纱线内存开销 :这是我的最爱,并且以下错误确认Spark应用程序存在此问题

“ ExecutorLostFailure(执行器2退出是由于正在运行的任务之一引起的)原因:容器因超出内存限制而被YARN杀死。

已使用XXX GB的XXX GB物理内存。 考虑提高spark.yarn.executor.memoryOverhead”

每当出现此错误时,大多数开发人员都会在堆栈上溢出并增加“ spark.yarn.executor.memoryOverhead”参数值。

这是不错的选择,因为短期内它很快就会再次失败,您将继续增加它,最终用尽选择权。

我认为增加“ spark.yarn.executor.memoryOverhead”作为反模式,因为指定的任何内存都会添加到执行程序的总内存中。

此错误意味着执行程序过载,最好的选择是尝试我上面提到的其他解决方案。

Spark有太多的调整参数,以至于有时看起来像是在计划驾驶舱中选址。

此博客中使用的所有代码都可以在@sparkperformance github repo上找到

翻译自: https://www.javacodegeeks.com/2018/10/anatomy-apache-spark-job.html

apache spark

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/333020.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL常用权限的解释

文章目录全局管理权限数据库/数据表/数据列权限特别的权限全局管理权限 FILE: 在MySQL服务器上读写文件。 PROCESS: 显示或杀死属于其它用户的服务线程。 RELOAD: 重载访问控制表&#xff0c;刷新日志等。 SHUTDOWN: 关闭MySQL服务。 数据库/数据表/数据列权限 ALTER: 修改已…

No identifier specified for entity没有为实体指定标识符

异常 ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘userController’: Injection of resour…

aws jenkins_Jenkins在AWS上(第1部分)

aws jenkins这是我对PEAT UK播客的逐字记录&#xff1a; 你好&#xff0c;再一次到另一个热点。 我叫Peter Pilgrim。 我曾经是DevOps专家&#xff0c;欢迎观看另一集。 这是11 Jenkins n AWS的第一部分&#xff0c;我是一名平台工程师&#xff0c;并且是Java Champion。 在…

SELECT ... FOR UPDATE_手动加行级排他锁_行级写锁_行级独占锁

文章目录介绍加锁情况分析明确指定主键&#xff0c;并且数据真实存在&#xff0c;锁定行明确指定主键&#xff0c;但数据不存在&#xff0c;不加锁主键不明确&#xff0c;锁定整个表无主键&#xff0c;锁定整个表应用场景介绍 1.FOR UPDATE 加的锁是一种行级排他锁&#xff0c…

广义表

广义表(广义表也称为列表&#xff0c;是线性表的一种推广&#xff0c;也是数据元素的有序序列) 一、基础 1.如何设定链表结点?广义表中的数据元素可能为单元素(原子)或子表&#xff0c;由此需要两种结点:一种是表结点&#xff0c;用以表示广义表;一种是单元素结点&#xff0c;…

数据库各种锁详解

文章目录排他锁共享锁更新锁意向锁锁的粒度数据库自动加锁手动加锁各种锁之间的兼容问题排他锁 Exclusive Locks&#xff0c;英译&#xff1a;排他锁&#xff0c;简称 X 锁&#xff0c;又称为写锁或独占锁。排他锁分为表级排他锁和行级排他锁。 如果事务 T1 对数据行对象 A 加…

activiti dmn_新的DMN编辑器预览

activiti dmnWorkbench 7.13.0.Final于10月16日星期二发布&#xff0c;此版本带来了许多有趣的功能和重要的修复程序。 亮点之一是作为技术预览功能的新DMN编辑器&#xff0c;该功能仍在开发中&#xff0c;但您可以开始使用。 在本文中&#xff0c;您将学习如何启用DMN编辑器预…

MySQL的索引存储数据结构BTree和B+Tree的区别

文章目录BTree 原理示意图BTree 原理示意图BTree的树层级很少BTree 可以高效支持范围查找BTree 原理示意图 注&#xff1a;BTree 就是 B-Tree&#xff0c;实际上官方并没有 B-Tree 的说法。 BTree 原理示意图 BTree的树层级很少 BTree 的数据存在每个节点中&#xff0c;所以每…

jdk11 javafx_JDK 11上的JavaFX

jdk11 javafx在JFX第11版发布后&#xff0c;人们对JavaFX与JDK的解耦感到百感交集。 我们许多人认为现在是时候告别JavaFX并改用另一种GUI技术了&#xff0c;而另一些人对此情况感到高兴。 他们认为&#xff0c;将JavaFX与Oracle分离开来&#xff0c;并致力于将其作为开源社区驱…

配置Java环境变量

JAVA环境变量配置 一、新建系统变量 新建变量&#xff0c;找到安装目录新建一个JAVA_HOME,路径为bin目录的前一级目录。 可以安装多个JAVA版本&#xff0c;然后新建不同的JAVA_HOME名称&#xff0c;然后填写bin目录的前一级路径。 二、编辑环境变量 找到path,然后编辑%JAVA…

MySQL的存储引擎InnoDB,B+Tree数据结构索引的实现原理图(聚簇索引/聚集索引)

1.表数据文件本身就是按BTree组织的一个索引结构文件 2.InnoDB的BTree的索引数据结构中&#xff0c;表数据和索引数据合并在一起&#xff0c;即叶子节点包含了完整的数据记录&#xff0c;这样的索引叫聚簇索引。

idea 切换java11_Java 11就在这里,您准备好进行切换了吗?

idea 切换java11在应该将Java 9发行版“震撼我们的世界”一年之后&#xff0c;我们一直在等待的LTS版本终于出现了 我们知道&#xff0c;大多数开发人员&#xff0c;团队&#xff0c;公司等尚未通过Java 8进行更新。 即使去年发布了模块Java 9&#xff0c;随后在3月又发布了Ja…

编译Java源文件

编写 新建hello.java文件 注意类名要和文件名称相同&#xff0c;如果不相同会提示错误 public class hello{public static void main(String[] args) {System.out.println("HelloWorld");} }编译 javac hello.java 编译会生成相应的.class文件。 运行 java hell…

oracle jdk_两个Oracle JDK的故事

oracle jdk最近 &#xff0c;人们担心 Java开发人员现在会无意中使用错误的Oracle提供的JDK实现&#xff08;从JDK 11开始 &#xff09;&#xff0c; Oracle提供了开源OpenJDK的构建 &#xff0c;并且还主要基于OpenJDK源提供了商业JDK的构建。 下表比较并对比了Oracle提供的两…

安装MAVEN和找不到JAVA_HOME问题原因

一、MAVEN安装 1.将下载好的MAVEN解压 2.配置MAVEN环境变量 MAVEN_HOME3.3.9 配置path 3.配置本地仓库 打开settings.xml进行修改 在MAVEN下新建一个repository文件夹 4.配置阿里MAVEN仓库配置 每次去阿里云下载jar包 <mirror><id>AliMaven</id>&…

数据库中的二级索引_普通索引_辅助索引

普通索引、二级索引、辅助索引是同个东西。 假设有张表的字段为 name&#xff0c;这个字段添加普通索引&#xff08;也叫二级索引&#xff09;&#xff0c;其存储引擎为 InnoDB&#xff0c;那么这个 name 索引的结构图&#xff1a;

2018-12 jdk_JDK 12新闻(2018年9月13日)

2018-12 jdk由于计划于本月晚些时候&#xff08;2018年9月25日&#xff09;发布JDK 11的 一般可用性 &#xff0c;是时候开始更仔细地研究JDK 12了 。 在OpenJDK jdk-dev邮件列表上的标题为“ JDK 12的计划时间表 ”的消息中 &#xff0c; 马克赖因霍尔德 &#xff08; Mark R…

idea连接mysql数据库时连接显示错误caching_sha2_password

问题描述 Connection to paradigmlocalhost failed. Unable to load authentication plugin caching_sha2_password.问题原因 mysql8之前的版本使用的密码加密规则是mysql_native_password&#xff0c;但是在mysql8则是caching_sha2_password&#xff0c;所以需要修改密码加密…

MySQL联合索引原理_复合索引_组合索引_多列索引

文章目录联合索引原理示意图联合索引就是复合索引、组合索引、多列索引。联合索引原理示意图

fluent design_Fluent Design单选按钮,复选框,选择框,Java菜单

fluent design这次我对JMetro进行了重大更新。 3.8版带来了以下新的Fluent Design &#xff08;FDS&#xff09;启发风格&#xff08;深色和浅色&#xff09;和更新&#xff1a; 新的单选按钮样式&#xff1b; 复选框的新样式&#xff1b; 菜单的新样式&#xff1b; 更新了…