热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

spark官方文档_Spark调优SparkonOSS性能调优实践

最近就计算与存储分离的一套组合:SparkOSS的性能进行了调优,取得了一些数据,这里记录一下。我测试的工作负载如下:这里测试的具体的数据

最近就计算与存储分离的一套组合: Spark + OSS的性能进行了调优,取得了一些数据,这里记录一下。我测试的工作负载如下:

这里测试的具体的数据是一个Parquet格式保存的数据,每个数据文件10G左右。Spark集群的配置是每个Executor4C16G, 几十个Executor的一个集群。

计算与存储分离从架构上来说可以让分工更进一步细化: 做计算引擎的专心做计算引擎,做存储的专心做存储;从用户角度来说让用户可以避免Vendor Locked In, 把数据以公开的格式保存在对象存储上, 用户如果什么时候想迁移到其它平台,只要把数据复制走就好了。但是对性能调优也带来了挑战,原本紧密结合的计算和存储被拆开,调优的时候需要通盘考虑。

OSS参数调优

计算跟存储分离之后,很影响速度的一块是从存储拉取数据的速度,开源引擎(Spark, Presto) 在跟这些对象存储(AWS S3, Aliyun OSS)打交道都是通过Hadoop File System的接口, Aliyun OSS也实现了HDFS的接口, 在它的官方文档上暴露了一些可以进行调优的参数: https://hadoop.apache.org/docs/r3.2.0/hadoop-aliyun/tools/hadoop-aliyun/index.html 。

fs.oss.multipart.download.size

从Aliyun OSS读取数据的每个请求获取数据的大小。
757efc127c753fc888c9cd6e55f15664.png

可以看出,在指定的工作负载下 128000 是个最优值,当Download Size小于这个值的时候可能又太多时间花在来回Round Trip上,因此比较耗时,如果Download Size大于这个值的话,单次获取数据花费时间过长,导致后续计算流程饥饿,因此性能会下降(猜测)。

fs.oss.multipart.download.ahead.part.max.number

OSS预读取的个数。
7266ea7e4b9daa875716d4a7eb82f50e.png

在我的工作负载下,最优值是 4, 在预读取数值过小的时候没有起到预读取的效果,而在预读取数据过多的时候,对于ORC/Parquet这种列存数据,会存在多次seek操作,过多的预读会造成数据浪费和网络阻塞。

fs.oss.multipart.download.threads

OSS同时下载数据的线程数。
  • 2:    68s

  • 4:    62s

  • 8:    64s

  • 16:  62s

  • 32: 64s

如果从平均时间来看,选择不同的线程数性能差距不是太大,但是如果线程数太少(2), 性能确实会比线程数多一点的时候差一点,因为没有充分利用多核的性能。

Spark的性能

spark.sql.files.maxPartitionBytes

这个参数控制Spark任务一个partition的数据量大小。这个参数会影响读取OSS数据的时候产生的Task的个数。
c60296b0c3149fb387cac20559b2a237.png

从数据可以看出,134217728 * 3是最优值,Max Partition Bytes太小的时候Task数太多,需要太多轮才能执行完所有的Task;而如果太大前面花过多时间在数据读取上,造成后续计算资源饥饿(猜测)。

总结

这次优化的思路是从底向上,从存储到计算挨个调优,从存储本身的格式,到OSS拉取数据的效率,最后到Spark切分分区的个数。不过这里得到的参数实在特定的负载下进行的测试,不代表它们是通用的最优值。

计算引擎跟Object Store配合工作需要做更多的调优工作,原因在于Object Store其实不是一个真正的文件系统[1],很多在文件系统上很高效的操作在Object Store上面比较低效,比如rename, 在文件系统上面rename一个目录是很轻量级的操作,但是在Object Store上面需要对目录下面每个具体的文件进行rename操作,而每个rename操作背后都可能对应一个http请求,因此把Object Store当做文件系统使用需要做专门的性能调优。比如spark关于写入操作就有一个针对Object Store的优化算法,以减少rename的调用次数: spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version=2[1]。

关于针对Object Store查询的优化,Qubole做过很多事情,主要的优化点是Split Calculation, 在查询开始的初期计算引擎需要获取所有文件的元数据,比如文件大小,以决定哪些文件应该归入一个Split,如果文件比较多的话,这个过程会耗费很多时间,Qubole做的一项优化就是批量获取元信息,大大减少Split Calculation的时间,极端情况下可以优化几十倍。[2][3][4]。

参考资料

  1. Spark: Integration with Cloud Infrastructures

  2. SparkSQL in the Cloud: Optimized Split Calculation

  3. Optimizing Hadoop for S3 – Part 1

  4. Optimizing S3 Bulk Listings for Performant Hive Queries

后记

数据湖开发者社区由 阿里云开发者社区 与 阿里云Data Lake Analytics团队 共同发起,致力于推广数据湖相关技术,包括hudi、delta、spark、presto、oss、元数据、存储加速、格式发现等,学习如何构建数据湖分析系统,打造适合业务的数据架构。

阿里云Data Lake Analytics是Serverless化的交互式联邦查询服务。使用标准SQL即可轻松分析与集成对象存储(OSS)、数据库(PostgreSQL/MySQL等)、NoSQL(TableStore等)数据源的数据。




推荐阅读
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文介绍了在Win10上安装WinPythonHadoop的详细步骤,包括安装Python环境、安装JDK8、安装pyspark、安装Hadoop和Spark、设置环境变量、下载winutils.exe等。同时提醒注意Hadoop版本与pyspark版本的一致性,并建议重启电脑以确保安装成功。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • Android日历提醒软件开源项目分享及使用教程
    本文介绍了一款名为Android日历提醒软件的开源项目,作者分享了该项目的代码和使用教程,并提供了GitHub项目地址。文章详细介绍了该软件的主界面风格、日程信息的分类查看功能,以及添加日程提醒和查看详情的界面。同时,作者还提醒了读者在使用过程中可能遇到的Android6.0权限问题,并提供了解决方法。 ... [详细]
  • 本文分析了Wince程序内存和存储内存的分布及作用。Wince内存包括系统内存、对象存储和程序内存,其中系统内存占用了一部分SDRAM,而剩下的30M为程序内存和存储内存。对象存储是嵌入式wince操作系统中的一个新概念,常用于消费电子设备中。此外,文章还介绍了主电源和后备电池在操作系统中的作用。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • Hadoop源码解析1Hadoop工程包架构解析
    1 Hadoop中各工程包依赖简述   Google的核心竞争技术是它的计算平台。Google的大牛们用了下面5篇文章,介绍了它们的计算设施。   GoogleCluster:ht ... [详细]
  • mapreduce源码分析总结
    这篇文章总结的非常到位,故而转之一MapReduce概述MapReduce是一个用于大规模数据处理的分布式计算模型,它最初是由Google工程师设计并实现的ÿ ... [详细]
  • 对于开源的东东,尤其是刚出来不久,我认为最好的学习方式就是能够看源代码和doc,測试它的样例为了方便查看源代码,关联导入源代 ... [详细]
  • Thisissuewasoriginallyopenedbyashashicorp/terraform#5664.Itwasmigratedhe ... [详细]
  • Spark Streaming和Kafka整合之路(最新版本)
    2019独角兽企业重金招聘Python工程师标准最近完成了SparkStreaming和Kafka的整合工作,耗时虽然不长,但是当中还是遇到了不少 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
author-avatar
otion
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有