Databricks缓存提升Apache Spark性能
2018年1月9日 在公司博客上
我们很高兴地宣布Databricks缓存的一般可用性,a砖运行时功能的一部分bob体育亚洲版统一分析平台bob体育客户端下载可以将Apache Spark工作负载的扫描速度提高到10倍,无需更改任何应用程序代码。
在这篇博客中,我们将介绍这个新特性的两个主要关注点:易用性和性能。
- 与Spark的显式内存缓存相反,Databricks缓存自动为用户缓存热输入数据,并在集群中实现负载平衡。
- 它利用了NVMe SSD硬件采用最先进的柱状压缩技术,可将交互和报告工作负载性能提高10倍。更重要的是,它可以缓存比Spark的内存缓存多30倍的数据。
Apache Spark中的显式缓存
Spark的一个关键特性是显式内存缓存。它是一种多功能工具,因为它可以用来存储任意计算的结果(包括输入和中间结果),这样它们就可以被多次重用。例如,迭代机器学习算法的实现可以选择缓存特征化数据,然后每次迭代可以从内存中读取数据。
一个特别重要和广泛的用例是缓存扫描操作的结果。这允许用户消除与读取远程数据相关的低吞吐量。出于这个原因,许多打算重复运行相同或类似工作负载的用户决定投入额外的开发时间来手动优化他们的应用程序,通过指示Spark准确地缓存哪些文件以及何时缓存,从而实现“显式缓存”。
尽管Spark缓存很实用,但它也有一些缺点。首先,当数据缓存在主存中时,它所占用的空间本可以在查询执行期间更好地用于其他目的,例如用于shuffle或散列表。其次,当数据缓存在磁盘上时,它必须在读取时进行反序列化——这个过程太慢,无法充分利用NVMe ssd通常提供的高读带宽。因此,偶尔火花的应用程序实际上,当打开Spark缓存时,它们的性能会下降。
第三,对于希望以交互方式探索数据或构建报告的用户来说,必须提前计划并明确声明应该缓存哪些数据是一个挑战。虽然Spark缓存为数据工程师提供了所有可调优的功能,但数据科学家经常发现很难对缓存进行推理,特别是在多租户环境中,工程师仍然要求尽可能快地返回结果,以保持迭代时间短。
NVMe ssd的挑战
固态硬盘(ssd)已经成为标准的存储技术。虽然最初以其低随机寻道延迟而闻名,但在过去几年中,ssd也大幅提高了其读写吞吐量。
创建NVMe接口是为了克服SATA和AHCI的设计限制,并允许无限制地访问现代ssd提供的优秀性能。这包括利用基于闪存的存储设备的内部并行性和极低的读取延迟的能力。NVMe使用多个长命令队列,以及其他增强功能,允许驱动器有效地处理大量并发请求。这种面向并行的架构完美地补充了现代多核cpu和Spark等数据处理系统的并行性。
有了NVMe接口,ssd在属性和性能上更接近于主存,而不是慢速磁驱动器。因此,它们是存储缓存数据的理想场所。
然而,为了充分利用NVMe ssd的潜力,仅仅将远程数据复制到本地存储是不够的。我们在AWS i3实例上的实验表明,当从本地ssd读取常用文件格式时,只能利用可用I/O带宽的一小部分。
上图显示了在EC2 i3实例类型上Spark针对本地NVMe ssd的I/O带宽利用率。如上所示,现有的格式都不能使I/O带宽饱和。cpu密集型的解码速度太慢,无法跟上ssd的速度!
“就是管用”
在设计Databricks Cache时,我们不仅关注于实现最佳的读取性能,而且还关注于创建一个“只是工作”的解决方案,不需要用户额外的努力。缓存负责:
- 选择要缓存的数据-无论何时访问远程文件,数据的转码副本立即放在缓存中
- 清除长期未使用的数据—当分配的磁盘空间用完时,缓存会自动删除最近最少使用的条目
- 负载平衡-缓存的数据均匀地分布在集群中的所有节点上,并且在自动缩放和/或不均匀地使用不同节点的情况下调整位置
- 数据安全—缓存中的数据保持与其他临时文件(例如shuffle文件)相同的加密方式
- 数据更新—当远程添加或删除文件时,缓存会自动检测,并显示最新的数据状态
自Databricks运行时3.3起,Databricks缓存已预先配置,并默认在所有使用AWS的集群上启用I3实例类型.由于这种类型的实例具有较高的写吞吐量,因此可以对数据进行转码并将其放入缓存中,而不会减慢执行初始远程读取的查询速度。喜欢选择其他类型的工作节点的用户可以使用Spark配置启用缓存(请参阅文档页面有关详情)。
对于那些宁愿显式地提前预缓存所有必要数据的客户端,我们实现了缓存选择命令。它急切地将所选择的数据部分加载到缓存中。用户可以指定要缓存的数据的垂直(即选定的列)和水平(即计算给定谓词所需的行)切片。
性能
为了利用NVMe ssd,而不是直接缓存输入的“原始字节”,这个新功能会以一种新的临时磁盘缓存格式自动对数据进行转码,这种格式经过了高度优化,提供了优越的解码速度,从而更好地利用I/O带宽。代码转换是异步执行的,以最小化将数据加载到缓存中的查询的开销。
增强的读取性能(在避免通常与访问远程数据相关的高延迟的能力之上)在各种各样的查询中导致了显著的加速。例如,对于以下TPC-DS查询子集,与读取相比,我们看到每个查询都有一致的改进拼花数据存储在AWS S3中,与5.7倍在查询53中加速。
在我们的内测程序的一些客户工作负载中,我们看到了高达的性能改进10倍!
结合Spark Cache和Databricks Cache
Spark缓存和Databricks缓存都可以同时使用,没有问题。事实上,它们相互补充得很好:Spark缓存提供了存储任意中间计算结果的能力,而Databricks缓存提供了对输入数据的自动、卓越性能。
在我们的实验中,Databricks Cache实现了4 x读取速度比DISK_ONLY模式下的Spark cache快。当与MEMORY_ONLY模式相比较时,Databricks Cache仍然提供3 x加速,同时设法保持较小的内存占用。
Databricks Cache配置
适用于所有AWSI3实例类型同时运行Databricks Runtime3.3 +,缓存选项默认为所有Parquet文件启用,此缓存功能也可以无缝地与三角洲湖.
要对其他Azure或AWS实例类型使用新缓存,请设置以下配置参数在集群配置中:
spark.databricks.io.cache.enabled真正的spark.databricks.io.cache.maxDiskUsage"{每个节点为缓存数据保留的磁盘空间}"spark.databricks.io.cache.maxMetaDataCache"{每个节点为缓存元数据保留的磁盘空间}"
结论
Databricks缓存在易用性和查询性能方面为Databricks用户提供了实质性的好处。它可以以混合匹配的方式与Spark缓存相结合,为手头的任务使用最好的工具。随着即将到来的进一步性能增强和对其他数据格式的支持,Databricks Cache应该成为各种工作负载的主要使用。
在未来,我们将发布更多的性能改进,并扩展该特性以支持其他文件格式。
要尝试此新功能,请选择i3的实例类型集群bob体育亚洲版统一分析平台bob体育客户端下载.