Spark UI的见解

作为延续解剖的-Apache的火花的工作后,我将分享如何利用星火UI调谐工作。 我将继续使用先前文章中使用的相同示例,新的spark应用程序将在以下方面完成工作

–阅读纽约市停车票

–通过“板ID”进行汇总并计算违规日期

–保存结果

此代码的DAG看起来像这样

Spark用户界面

这是多阶段的工作,因此需要一些数据混洗,因为此示例混洗写入为564mb,输出为461MB。

让我们看看我们可以做些什么来减少这种情况?

让我们从“ Stage2”开始采取自上而下的方法。 首先想到的是探索压缩。
当前代码

aggValue.map {case (key, value) => Array(key, value._1, value._2.mkString(",")).mkString("\t")}.saveAsTextFile(s"/data/output/${now}")

新密码

aggValue.map {case (key, value) => Array(key, value._1, value._2.mkString(",")).mkString("\t")}.saveAsTextFile(s"/data/output/${now}", classOf[GzipCodec])

新代码仅在写入时启用gzip,让我们看看我们在Spark UI上看到的内容

Spark用户界面

用Gzip保存

只需写入编码器,写入量下降了70%。 现在达到135Mb并加快了工作速度。

让我们先看看还有什么可能,然后再进行更多的内部调整

最终输出如下所示

1RA32   1       05/07/2014
92062KA 2       07/29/2013,07/18/2013
GJJ1410 3       12/07/2016,03/04/2017,04/25/2015
FJZ3486 3       10/21/2013,01/25/2014
FDV7798 7       03/09/2014,01/14/2014,07/25/2014,11/21/2015,12/04/2015,01/16/2015

进攻日期以原始格式存储,可以对此应用少量编码以提高速度。

Java 8添加了LocalDate来简化日期操作,该类带有一些方便的功能,其中之一就是toEpocDay。

此函数将日期转换为1970年的日期,因此这意味着在4个字节(Int)中,我们最多可以存储5K年,与当前格式占用10个字节相比,这似乎可以节省很多。

epocDay的代码段

val issueDate = LocalDate.parse(row(aggFieldsOffset.get("issue date").get), ISSUE_DATE_FORMAT)val issueDateValues = mutable.Set[Int]()issueDateValues.add(issueDate.toEpochDay.toInt)result = (fieldOffset.map(fieldInfo => row(fieldInfo._2)).mkString(","), (1, issueDateValues))

更改后的Spark UI。 我还做了另一项更改以使用KryoSerializer

Spark用户界面

这是一个巨大的改进,随机写入从564Mb更改为409MB(提高27%),输出从134Mb更改为124 Mb(提高8%)

现在让我们转到Spark UI上的另一部分,该部分显示了执行者端的日志。

以上运行的GC日志显示以下内容

2018-10-28T17:13:35.332+0800: 130.281: [GC (Allocation Failure) [PSYoungGen: 306176K->20608K(327168K)] 456383K->170815K(992768K), 0.0222440 secs] [Times: user=0.09 sys=0.00, real=0.03 secs]
2018-10-28T17:13:35.941+0800: 130.889: [GC (Allocation Failure) [PSYoungGen: 326784K->19408K(327168K)] 476991K->186180K(992768K), 0.0152300 secs] [Times: user=0.09 sys=0.00, real=0.02 secs]
2018-10-28T17:13:36.367+0800: 131.315: [GC (GCLocker Initiated GC) [PSYoungGen: 324560K->18592K(324096K)] 491332K->199904K(989696K), 0.0130390 secs] [Times: user=0.11 sys=0.00, real=0.01 secs]
2018-10-28T17:13:36.771+0800: 131.720: [GC (GCLocker Initiated GC) [PSYoungGen: 323744K->18304K(326656K)] 505058K->215325K(992256K), 0.0152620 secs] [Times: user=0.09 sys=0.00, real=0.02 secs]
2018-10-28T17:13:37.201+0800: 132.149: [GC (Allocation Failure) [PSYoungGen: 323456K->20864K(326656K)] 520481K->233017K(992256K), 0.0199460 secs] [Times: user=0.12 sys=0.00, real=0.02 secs]
2018-10-28T17:13:37.672+0800: 132.620: [GC (Allocation Failure) [PSYoungGen: 326016K->18864K(327168K)] 538169K->245181K(992768K), 0.0237590 secs] [Times: user=0.17 sys=0.00, real=0.03 secs]
2018-10-28T17:13:38.057+0800: 133.005: [GC (GCLocker Initiated GC) [PSYoungGen: 324016K->17728K(327168K)] 550336K->259147K(992768K), 0.0153710 secs] [Times: user=0.09 sys=0.00, real=0.01 secs]
2018-10-28T17:13:38.478+0800: 133.426: [GC (Allocation Failure) [PSYoungGen: 322880K->18656K(326144K)] 564301K->277690K(991744K), 0.0156780 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
2018-10-28T17:13:38.951+0800: 133.899: [GC (Allocation Failure) [PSYoungGen: 323808K->21472K(326656K)] 582842K->294338K(992256K), 0.0157690 secs] [Times: user=0.09 sys=0.00, real=0.02 secs]
2018-10-28T17:13:39.384+0800: 134.332: [GC (Allocation Failure) [PSYoungGen: 326624K->18912K(317440K)] 599490K->305610K(983040K), 0.0126610 secs] [Times: user=0.11 sys=0.00, real=0.02 secs]
2018-10-28T17:13:39.993+0800: 134.941: [GC (Allocation Failure) [PSYoungGen: 313824K->17664K(322048K)] 600522K->320486K(987648K), 0.0111380 secs] [Times: user=0.00 sys=0.00, real=0.02 secs] 

让我们专注于一条线

2018-10-28T17:13:39.993+0800: 134.941: [GC (Allocation Failure) [PSYoungGen: 313824K->17664K(322048K)] 600522K->320486K(987648K) , 0.0111380 secs] [Times: user=0.00 sys=0.00, real=0.02 secs] 

次要GC之前的堆为600MB,之后为320MB,总堆大小为987MB。

执行器分配了2GB内存,并且此Spark应用程序未使用所有内存,我们可以通过发送更多任务或更大任务来给执行器增加更多负载。

我将输入分区从270减少到100

Spark用户界面

带270个输入分区

Spark UI

带100个输入分区

100个输入分区看起来更好,可减少大约10%以上的数据洗牌。

其他技巧

现在,我将分享一些将大大改变GC的东西!

优化前的代码

private def mergeValues(value1: (Int, mutable.Set[Int]), value2: (Int, mutable.Set[Int])): (Int, mutable.Set[Int]) = {val newCount = value1._1 + value2._1val dates = value1._2dates.foreach(d => value2._2.add(d))(newCount, value2._2)}private def saveData(aggValue: RDD[(String, (Int, mutable.Set[Int]))], now: String) = {aggValue.map { case (key, value) => Array(key, value._1, value._2.mkString(",")).mkString("\t") }.coalesce(100).saveAsTextFile(s"/data/output/${now}", classOf[GzipCodec])}

优化后的代码

private def mergeValues(value1: GroupByValue, value2: GroupByValue): GroupByValue = {if (value2.days.size > value1.days.size) {value2.count = value1.count + value2.countvalue1.days.foreach(d => value2.days.add(d))value2}else {value1.count = value1.count + value2.countvalue2.days.foreach(d => value1.days.add(d))value1}}private def saveData(aggValue: RDD[(String, GroupByValue)], now: String) = {aggValue.mapPartitions(rows => {val buffer = new StringBuffer()rows.map {case (key, value) =>buffer.setLength(0)buffer.append(key).append("\t").append(value.count).append("\t").append(value.days.mkString(","))buffer.toString}}).coalesce(100).saveAsTextFile(s"/data/output/${now}", classOf[GzipCodec])}

新代码正在对集合进行优化合并,它向大集合中添加了小集合,并且还引入了Case类。

另一种优化是保存功能,其中它使用mapPartitions通过使用StringBuffer减少对象分配。

我使用http://gceasy.io获得了一些GC统计信息。

Spark用户界面

更改代码之前

Spark用户界面

更改代码后

新代码为例如产生更少的垃圾。

总GC 126 GB和122 GB(约提高4%)

最大GC时间720ms与520 ms(约好25%)

优化看起来很有希望。

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

请继续关注有关此内容的更多信息。

翻译自: https://www.javacodegeeks.com/2018/11/insights-spark-ui.html

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

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

相关文章

run在java_Java语言start和run方法的区别

Java语言start和run方法的区别导语:Thread类定义了一个功能,用于存储线程要运行的代码,该存储功能就是run方法。那么它和start方法有什么不同呢?让我们了解一下吧!调用start方法方可启动线程,而run方法只是thread的一个普通方法&…

[渝粤教育] 西南科技大学 知识产权法学 在线考试复习资料

知识产权法学——在线考试复习资料 一、单选题 1.我国加入《巴黎公约》的时间是( )。 A.1975年 B.1985年 C.1995年 D.2005年 2.产品发明获得专利权的实质条件不包括( )。 A.新颖性 B.技术性 C.创造性 D.实用性 3.( )是以团体、协会或其他组织的名义注册,供本组织成员在商事活…

光纤收发器的6个指示灯说明

我们常用的光纤收发器都有6个指示灯,那么每个指示灯都代表什么含义呢?是否所有指示灯都亮起才代表光纤收发器正常工作呢?接下来飞畅科技的小编就来为大家详细说明一下,一起来看看吧! 光纤收发器的指示灯说明&#xff…

[渝粤教育] 西南科技大学 翻译 在线考试复习资料

翻译——在线考试复习资料 一、简答题 1.短文翻译(英译汉) When I was nine years old living in a small town in North Carolina I found an ad for selling greeting cards in the back of a children’s magazine. I thought to myself I can do this. I begged my mother…

java list比较器_JAVA比较器

Java中的对象&#xff0c;正常情况下&#xff0c;只能进行比较&#xff1a; 或 ! 。不能使用 > 或 < 的。但是在开发场景中&#xff0c;我们需要对多个对象进行排序&#xff0c;言外之意&#xff0c;就需要比较对象的大小。如何实现&#xff1f;使用两个接口中的任何一个…

如何通过光纤收发器指示灯来判断收发器的故障

我们常用的光纤收发器都有6个LED指示灯&#xff0c;它们显示了收发器的工作状态&#xff0c;根据LED所示&#xff0c;就能判断出收发器是否工作正常和可能有什么问题&#xff0c;从而能帮助找出故障。那么&#xff0c;光纤收发器的每个指示灯都有什么含义呢&#xff1f;是否所有…

[渝粤教育] 西南科技大学 财务管理与分析 在线考试复习资料

财务管理与分析——在线考试复习资料 一、单选题 1.某投资方案年营业收入240万元,年销售成本170万元,其中折旧70万元,所得税率40%,则该方案年营业现金净流量为( )。 A.70万元 B.112万元 C.140万元 D.84万元 2.如果投资规模不同的两个独立投资项目的评价,应优先选择( )。 A.净现…

standalone应用_具有Spring Boot的Spring Integration Standalone应用程序

standalone应用我之前在博客中写过一种编写独立的Spring Integration应用程序的方法。 Spring Boot使创建此独立应用程序变得更加简单。 简单的流程是轮询USGS服务&#xff0c;以提供有关世界各地地震活动的信息并记录该信息。 使用Spring Integration描述的流程如下&#xf…

【渝粤教育】电大中专学习指南 (3)作业 题库

1.中央广播电视中等专业学校&#xff08;&#xff09;颁发国民教育系列中等学历教育毕业证书的资格。 A.不具有 B.具有 错误 正确答案&#xff1a;左边查询 学生答案&#xff1a;A 2.并面向社会直接招收初中毕业生和在职青年举办&#xff08;&#xff09;职业教育。 A.高等 B.中…

单纤光纤收发器a与b怎么放?如何使用光纤收发器的AB端?

光纤收发器的ab端是发射端&#xff08;a端&#xff09;和接收端&#xff08;b端&#xff09;&#xff0c;单纤收发器两端分别是A端与B端&#xff0c;这两端的波长不同&#xff0c;发射端的波长比接收端的波长短&#xff0c;而双纤收发器其实是不分AB端的&#xff0c;因为它两端…

您的API是什么情况?

免责声明&#xff1a;在纯REST中&#xff0c;API是不透明的&#xff0c;URL应该是在对先前请求的响应中作为链接发送的内容。 但是&#xff0c;我不是在讲纯REST&#xff0c;而是在讲更实用的API&#xff0c;其中涉及REST的一些概念以及通用的API最佳实践。 编写API时&#xf…

【渝粤教育】电大中专就业指导_1作业 题库

1.&#xff08;&#xff09;给中职生就业带来的机遇和挑战 A.发展标准化服务业 B.一带一路 C.“十三五”规划 正确 正确答案&#xff1a;左边查询 学生答案&#xff1a;C 2.最受企业欢迎的人才应具备&#xff08;&#xff09;素质 A.文化认同、敬业精神、团队意识、创新思想、应…

家用光纤猫设备、光纤收发器和光电交换机介绍

光纤能转换网线吗&#xff1f;光纤是一种光导玻璃纤维&#xff0c;传输的是光信号&#xff0c;是不能直接与网线连接&#xff0c;需要通过光电转换设备&#xff0c;将光信号转换成网络信号&#xff0c;常见的光电转换设备有家用光纤猫设备、光纤收发器和光电交换机。接下来就由…

java 收集系统资源_方法:Linux 下用JAVA获取CPU、内存、磁盘的系统资源信息

CPU使用率&#xff1a;InputStream is null;InputStreamReader isr null;BufferedReader brStat null;StringTokenizer tokenStat null; // 用来分隔String的应用类try {System.out.println("Get usage rate of CUP : ");Process process Runtime.getRuntime().…

【渝粤教育】电大中专建筑施工组织作业 题库

1.对于一个建设工程而言&#xff0c;有代表不同利益方的项目管理&#xff0c;其中&#xff08; &#xff09;的项目管理是管理的核心。 A.供货方 B.业主方 C.设计方 D.施工方 正确 正确答案&#xff1a;左边查询 学生答案&#xff1a;B 2.下列选项中&#xff0c;关于施工总承包…

浅谈模拟光端机和数字光端机的区别?

光纤和光端机应用在监控领域里主要是为了解决两个问题&#xff1a;一是传输距离&#xff0c;一是环境干扰。双绞线和同轴电缆只能解决短距离、小范围内的监控图象传输问题&#xff0c;如果需要传输数公里甚至上百公里距离的图象信号则需要采用光纤传输方式。光端机为监控系统提…

【渝粤教育】电大中专消费者行为学30分钟交卷作业 题库

1.消费行为学的研究对象是市场商品交换活动中消费者各种心理现象和行为的产生、发展及其规律。主要表现在以下哪几方面&#xff08; &#xff09; A.消费活动中营销环境 B.以上选项全选 C.消费者行为的发展变化趋势 D.消费者在消费过程中的行为和规律 E.消费者在购买行为中的心…

Java io字符流读入英文_Java IO 系列教程(四)-字符输入流(2)

本文介绍字符输入流在前面一节中&#xff0c;我们向一个文件中写入了一些字符&#xff0c;通过图片可以看出总共是6个中文字符和一个换行&#xff0c;总共是20个字节&#xff0c;可以推算出字符编码是utf-8&#xff0c;每个汉子占3三个字节。本文就用字符输入流来读一下。代码部…

AWS上的应用程序自动扩展–选项及其对性能的影响

扩展软件应用程序是至关重要的&#xff0c;以避免由于网站的客户群或需要处理大量数据集的应用程序等增加而导致工作负载增加的性能瓶颈。云服务提供商通常是访问其他应用程序的最佳方法随需应变的资源&#xff0c;可根据应用程序的负载变化来扩大或缩小。 1.什么是可伸缩性&a…

【渝粤教育】电大中专电子商务网站建设与维护 (14)作业 题库

1.诚信通是阿里巴巴为从事中国国内贸易的中小企业推出的会员制网上贸易服务&#xff0c;主要用以解决网络贸易信用问题。 &#xff08; &#xff09; A.正确 B.错误 错误 正确答案&#xff1a;左边查询 学生答案&#xff1a;未作答 2.阿里巴巴是于1999年创立的&#xff08; &am…