apache spark

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,当这些组件中的任何一个承受压力时,Spark作业可能会失败,可能是内存/ CPU /网络/磁盘。

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

执行器问题 :每个执行器需要2个参数“核心和内存”。 核心决定了执行者可以处理多少个任务,并且该执行者中所有核心/任务之间共享内存。 每个火花作业都有不同类型的需求,因此
反模式,以对所有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

apache spark

apache spark_Apache Spark Job的剖析相关推荐

  1. apache spark_Apache Spark中的自定义日志

    apache spark 您是否曾经对运行了几个小时的Spark作业感到沮丧,但由于基础设施问题而失败了. 您会很晚才知道此故障,并浪费了数小时的时间,当Spark UI日志也无法进行事后检查时,它会 ...

  2. apache spark_Apache Spark软件包,从XML到JSON

    apache spark Apache Spark社区为扩展Spark付出了很多努力. 最近,我们希望将XML数据集转换为更易于查询的内容. 我们主要对每天进行的数十亿笔交易之上的数据探索感兴趣. X ...

  3. apache spark_Apache Spark:更改架构之前必须解决的5个陷阱

    apache spark 迁移到Apache Spark之前需要了解的5件事 似乎每个人都只是在谈论最热门的新技术,而忽略采用它的实际含义. 但这是自然的,对吧? 新功能和承诺胜过其他所有事物,而艰难 ...

  4. spark 源码分析之十八 -- Spark存储体系剖析

    本篇文章主要剖析BlockManager相关的类以及总结Spark底层存储体系. 总述 先看 BlockManager相关类之间的关系如下: 我们从NettyRpcEnv 开始,做一下简单说明. Ne ...

  5. 【Hadoop Summit Tokyo 2016】Hivemall: Apache Hive/Spark/Pig 的可扩展机器学习库

    本讲义出自 Makoto YUI与NTT Takashi Yamamuro在Hadoop Summit Tokyo 2016上的演讲,主要介绍了Hivemall的相关知识以及Hivemall在Spar ...

  6. Apache Kafka / Spark流系统的性能调优

    电信行业的实际案例研究 调试实际的分布式应用程序可能是一项艰巨的任务. 至少在一开始,最常见的Google搜索并没有什么用. 在这篇博客文章中,我将详细介绍如何将Apache Kafka / Spar ...

  7. Apache Kylin Spark Cubing on Kubernetes 初探

    2019独角兽企业重金招聘Python工程师标准>>> 背景介绍 相信凡是关注容器生态圈的人都不会否认,Kubernetes 已经成为容器编排调度的实际标准,不论 Docker 官方 ...

  8. Spark SQL内核剖析(三)

    本文参考了<Spark SQL内核剖析>(朱峰.张韶全.黄明等著)的目录结构和内容,这本书主要集中在对SQL内核实现的剖析上,从源码实现上学习分布式计算和数据库领域的相关技术,非常值得有相 ...

  9. Apache Spark Job的剖析

    Apache Spark是通用的大规模数据处理框架. 了解spark如何执行作业对于获取大部分作业非常重要. 关于Spark评估范式的简短回顾:Spark使用的是惰性评估范式,在该范式中,Spark应 ...

最新文章

  1. BestCoder 1st Anniversary ($) 1002.Hidden String
  2. JVM加载class文件的原理简述
  3. python_16(bootstrap)
  4. coloros11跟Android,安卓10与安卓11究竟差异在哪里?我们拿这两台新机试了一下
  5. Android开发笔记(一百六十三)高仿京东的沉浸式状态栏
  6. 【Angular 4】管道
  7. 论如何优雅的处理回文串 - 回文自动机详解.
  8. 刷新代码IOS 上拉分页刷新--
  9. 编译OpenWRT LEDE 固件的一些说明
  10. 百度网站收录批量查询 介绍百度网站收录批量查询3种方式
  11. mysql星期几转为英文_MySQL如何获取一个指定日期所对应的的星期几(英文星期信息-dayname函数)呢?...
  12. HTML网页媒体元素(视频音频)
  13. 360 os3.0 android7.1,360OS 3.0系统
  14. React使用antd的警告findDOMNode is deprecated in StrictMode. findDOMNode was passed an instance of Wave
  15. BINKS 502375润滑脂
  16. NET CORE读取Excel.xlsx单元格内的图片,并关联当前业务ID推送图片到指定服务器...
  17. 中国剩余定理(也叫孙子定理)
  18. ssi 指令 php,SSI 漏洞学习笔记
  19. 安卓图案解锁NC13585
  20. 实现摄像头在内网、外网、gb28181 实现 “视频监控/直播” 的常用几种方式

热门文章

  1. B-Suffix Array
  2. YBTOJ 特殊数列(哈希表)
  3. NOI.AC#2139-选择【斜率优化dp,树状数组】
  4. UOJ#244-[UER#7]短路【贪心】
  5. 51nod-猴猴吃苹果【线段树】
  6. Prufer序列 生成树定理
  7. 12、数据库的设计范式
  8. 26、临时表的创建和重复数据的处理
  9. Java自动化邮件中发送图表(一)
  10. MySQL extract()函数