Apache Spark Job的剖析

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

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

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

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

阿帕奇火花

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
阿帕奇火花

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

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

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

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

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

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

阿帕奇火花

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

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

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

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

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

阿帕奇火花

  • 执行器记录完整的“内存映射图”消息
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快照,可用于不良运行和良好运行。

阿帕奇火花

不良运行

阿帕奇火花

好运

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

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

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

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

Partition Executor Cores MemoryRun 1 100 2 4 2gRun 1 100 2 2 2g
阿帕奇火花

4核/ 2执行器

阿帕奇火花

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

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

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

相关文章

scala本地调试_如何编写自己的Java / Scala调试器

scala本地调试在本文中&#xff0c;我们将探讨Java / Scala调试器的编写和工作方式。 诸如Windows的WinDbg或Linux / Unix的gdb之类的本机调试器通过操作系统直接提供给它们的钩子来获取其功能&#xff0c;以监视和操纵外部进程的状态。 JVM充当OS之上的抽象层&#xff0c;它提…

java content()_Java contentEquals() 方法

全屏Java contentEquals() 方法contentEquals() 方法用于将将此字符串与指定的 StringBuffer 比较。语法public boolean contentEquals(StringBuffer sb)参数sb -- 要与字符串比较的 StringBuffer。返回值如字符串与指定 StringBuffer 表示相同的字符序列&#xff0c;则返回 tr…

通过这5个简单的技巧减少GC开销

编写代码的五种简单方法&#xff0c;可提高内存效率&#xff0c;而无需花费更多时间或降低代码可读性 垃圾回收会为您的应用程序增加多少开销&#xff1f; 您可能不知道确切的数字&#xff0c;但您确实知道总有改进的余地。 尽管自动GC是最有效的过程&#xff0c;但是如果它过…

内部简单二进制编码(SBE)

SBE是用于金融行业的非常快速的序列化库&#xff0c;在本博客中&#xff0c;我将介绍一些使其快速发展的设计选择。 序列化的全部目的是对消息进行编码和解码&#xff0c;并且有很多可用的选项&#xff0c;从XML&#xff0c;JSON&#xff0c;Protobufer&#xff0c;Thrift&…

mingw64 下 java_在 Windows 10 64 位下安装 Mingw-w64

1、MinGW 的全称是&#xff1a;Minimalist GNU on Windows 。打开网址&#xff1a;http://www.mingw-w64.org/doku.php/download &#xff0c;选择 MingW-W64-builds。如图1图12、下载包名&#xff1a;mingw-w64-install.exe。安装时报错&#xff1a;Cannot download repositor…

java实现layui分页_layui如何实现数据分页功能

我们先来看下官网的演示画面。具体代码&#xff1a;页面引入layui.css、 layui.js前台jsvar limitcount 10;var curnum 1;//列表查询方法function productsearch(productGroupId,start,limitsize) {layui.use([table,laypage,laydate], function(){var table layui.table,la…

java 合并到一行_mysql中将多行数据合并成一行数据

一个字段可能对应多条数据&#xff0c;用mysql实现将多行数据合并成一行数据例如&#xff1a;一个活动id(activeId)对应多个模块名(modelName),按照一般的sql语句&#xff1a;1 SELECT am.activeId,m.modelName2 FROM activemodel am3 JOIN model m4 ON am.modelId m.modelId5…

容器化Spring Data Cassandra应用程序

我正在继续学习Docker的旅程。 在这一点上&#xff0c;我仍然保持简单。 这次&#xff0c;我将解决将Spring和Cassandra应用程序转换为使用容器而不是在主机上本地运行的问题。 更准确地说&#xff0c;使用Spring Data Cassandra整理应用程序。 我希望我前几天看过进行此更改。…

使用React和Spring Boot构建一个简单的CRUD应用

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕&#xff1f; 尝试使用Okta API进行托管身份验证&#xff0c;授权和多因素身份验证。 React的设计使创建交互式UI变得轻松自如。 它的状态管理非常有效&#xff0c;并且仅在…

使用CUBA进行开发–是Spring的重大转变吗?

阅读另一个供内部公司使用的Web项目的要求时&#xff0c;您&#xff08;至少是我自己&#xff09;通常会看到一个很普通的集合&#xff1a;定义明确的数据存储结构&#xff08;或有时是现有的旧式DB&#xff09;&#xff0c;大量的数据输入形式&#xff0c;非常复杂的业务逻辑&…

java 伴随矩阵_C#计算矩阵的逆矩阵方法实例分析

本文实例讲述了C#计算矩阵的逆矩阵方法。分享给大家供大家参考。具体如下&#xff1a;1.代码思路1)对矩阵进行合法性检查&#xff1a;矩阵必须为方阵2)计算矩阵行列式的值(Determinant函数)3)只有满秩矩阵才有逆矩阵&#xff0c;因此如果行列式的值为0(在代码中以绝对值小于1E-…

java 代码造假_老板居然让我在Java项目中“造假”

1. 前言老板说&#xff0c;明天甲方要来看产品&#xff0c;你得造点数据&#xff0c;而且数据必须是“真”的&#xff0c;演示效果要好看一些&#xff0c;这样他才会买我们的产品&#xff0c;我好明年给你换个嫂子。一般开发接到这种过分要求都不会很乐意去做&#xff0c;这完全…

nginx php环境搭建_php+nginx环境配置

本篇文章的内容是PHP和nginx环境的配置&#xff0c;在这里分享给大家&#xff0c;也给有需要的朋友一个参考phpnginx环境配置1、首先需要准备的应用程序包。nginx&#xff1a;nginx/Windows-1.0.4php&#xff1a;php-5.2.16-nts-Win32-VC6-x86.zip (nginx下php是以FastCGI的方式…

javaone_旅行报告:JavaOne 2013 –重归荣耀

javaone我已经回来几天了&#xff0c;需要赶上过去几天一直搁置的所有事情。 对我来说&#xff0c;这是一年中最忙的时间。 JavaOne和OpenWorld在旧金山的整整一周。 一个非常简短的旅行报告。 年度ACED简报 你们中许多人都知道我是Oracle社区认可计划&#xff08;称为“ ACE计…

php如何禁用浏览器的缓存,php如何禁止浏览器使用缓存页面

【摘要】PHP即“超文本预处理器”&#xff0c;是一种通用开源脚本语言。PHP是在服务器端执行的脚本语言&#xff0c;与C语言类似&#xff0c;是常用的网站编程语言。PHP独特的语法混合了C、Java、Perl以及 PHP 自创的语法。下面是php如何禁止浏览器使用缓存页面&#xff0c;让我…

使用Java EE和OIDC构建Java REST API

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕&#xff1f; 尝试使用Okta API进行托管身份验证&#xff0c;授权和多因素身份验证。 Java EE允许您使用JAX-RS和JPA快速轻松地构建Java REST API。 Java EE是保护伞标准规…

通过JavaFX标注制作动画效果

在本文中&#xff0c;您将学习如何使用JavaFX的动画API创建标注。 您可以在https://www.youtube.com/watch?vXTHbB0LRdT4的 YouTube网站上查看这些标注的演示示例。 什么是标注&#xff1f; 我敢肯定&#xff0c;您已经看过广告或科幻电影&#xff0c;它们使用在图像顶部显示…

使用trackBy启动流程

仍然沿用Corda Services的趋势&#xff0c;我还有其他一些技巧可帮助您的CorDapp顺利工作。 这次&#xff0c;我们将重点关注使用trackBy从服务内部启动流以及如果您不小心可能会引起的离散问题。 这应该是一个相对简短的职位&#xff0c;因为我可以依靠之前的职位&#xff1a…

java+springmvc+vo,springmvc+mybatis的实例详解

前面讲到&#xff1a;SpringSpringMVCMyBatis深入学习及搭建(十三)——SpringMVC入门程序(二)1.需求使用springmvc和mybatis完成商品列表查询。2.整合思路springmvcmybatis的系统架构&#xff1a;第一步&#xff1a;整合dao层mybatis和spring整合&#xff0c;通过spring管理map…

了解为什么这个直观的工具是您团队的通用团队管理工具

每个项目管理工具都试图做同样的工具性工作&#xff1a;保持团队联系&#xff0c;按任务执行和按时完成重大计划。 但是市场变得非常拥挤&#xff0c;并且有充分的理由-没有平台似乎对人们需要看的东西以及应该如何显示这些信息具有正确的感觉&#xff0c;以便它们既可行又相关…