事务写入云存储数据砖
2017年5月31日 在工程的博客
在另一个今天发布的博客文章,我们显示在HDFS选择S3的五大原因。主导地位的简单而有效的云存储系统,如Amazon S3,内部系统(比如Apache Hadoop的假设是,有时是痛苦的,明确的。Apache引发用户需要快速和事务性正确写入云存储系统。这篇文章将介绍如何砖允许客户实现既通过比较当前Hadoop的性能和正确性缺陷提交协议与砖的I / O (DBIO)事务提交协议。
为什么引发需要事务写吗?
大规模数据处理这样的框架Apache火花实现容错,执行工作所需的工作分解成retriable任务。因为任务可能偶尔会失败,火花必须确保只有成功的任务和工作的输出是可见的。形式上,这是通过使用一个提交协议,它指定应该如何写结果的工作。
的工作承诺火花阶段工作确保只有成功就业的输出是可见的读者。在我们的经验中,提交工作是一个很大的性能和正确性问题来源当火花是用于进行设置,例如,直接写像S3存储服务。
为了更好地理解为什么工作承诺是必要的,让我们来比较一下两种不同的失败场景如果火花不是使用提交协议。
- 如果任务失败,它可能会让部分写S3数据(或其他存储)。火花调度器将re-attempt任务,这可能会导致重复的输出数据。
- 如果整个工作失败,它可能会让部分结果从单个任务S3。
这些场景可以是非常有害的。为了避免这些数据腐败场景,火花从Hadoop依靠提交协议类第一阶段任务输出到临时的位置,只有将数据移动到其最终位置在任务或作业完成。正如我们将显示,这些Hadoop协议并非专为原生云设置和强迫用户选择性能和正确性。
比较现有的提交协议
之前引入砖I / O (DBIO)事务的提交,我们先评估现有的Hadoop提交协议。提交协议可以评估在两个维度:
- 性能——协议在提交文件的速度有多快?当然,你希望你的工作尽快运行。
- 事务性——只能工作完成部分或腐败的结果吗?理想情况下,工作输出应该是可见的以事务的方式(即。,all or nothing). If the job fails, readers should not observe corrupt or partial outputs.
性能测试
火花附带两默认Hadoop提交算法——版本1,最后上演了任务输出文件而动位置的工作,和版本2,移动文件作为单独的完成工作任务。让我们来比较一下它们的性能。我们使用一个引发2.1集群砖社区版对于这些测试运行:
/ /追加10 m行指定的Hadoop FileOutputCommitter版本spark.range (10 e6.toLong).repartition (One hundred.).write.mode (“添加”).option (“mapreduce.fileoutputcommitter.algorithm.version”,”“).parquet (“/ tmp /测试- - - - - -”)/ /比较总工作运行时使用v1和v2显示(Seq ((“V1 Hadoop提交”),(“Hadoop提交V2”).toDF (“算法”,“时间(s)”))
因为它开始移动文件并行任务一旦完成,v2 Hadoop提交协议几乎是5倍v1。这就是为什么最新的Hadoop发行版v2是默认的提交协议。
事务性测试
现在让我们看看事务性。我们评估这个通过模拟工作失败引起的持续失败任务,这通常发生在实践中,例如,这可能发生在一个特定的文件如果有不好的记录,不能被解析。可以如下:
/ /添加更多的行前面的输出目录spark.range (10000年).repartition (7)。{地图我= >如果(我= =9999年{thread . sleep ()5000年);扔新RuntimeException (“哎呀!”)}其他的我}.write.option (“mapreduce.fileoutputcommitter.algorithm.version”,”“).mode (“添加”).parquet (“/ tmp /测试- - - - - -”)/ /比较新添加的行数从失败的工作val newRowsV1 = spark.read.parquet (“/ tmp / test 1”).count () -10000000val newRowsV2 = spark.read.parquet (“/ tmp /测试2”).count () -10000000显示(Seq ((“V1 Hadoop提交”newRowsV1), (“Hadoop提交V2”newRowsV2)) .toDF (“算法”,“腐败行”))
我们看到的经验,虽然v2更快,但也留下了部分结果工作失败,打破事务性的要求。在实践中,这意味着与链接ETL作业工作失败——即使重试成功可以复制一些输入数据的下游工作。这需要仔细的管理使用链接ETL作业时。
没有妥协DBIO事务提交
注意:此功能可从砖(火花2.1 -db4)
所有Hadoop用户面对这对他们的工作性能可靠性权衡写云存储时,是否使用火花。尽管v1是更多的事务,它非常缓慢,因为在S3中移动文件是昂贵的。然而,这种权衡不是根本,所以在砖,我们构建了一个新的DBIO事务提交协议,坐标在砖与高可用性服务。的基本思想如下:
当用户写文件的工作,DBIO将为您执行以下操作。
- 标记文件编写与独特的事务id。
- 直接写文件的最终位置。
- 马克提交事务时提交工作。
当一个用户去阅读文件,DBIO将为您执行以下操作。
- 检查是否有事务id以及地位和忽略文件如果事务没有完成或读入数据。
这个简单的想法大大提高了性能没有交易的可靠性。我们从上面运行相同的性能测试和比较与默认Hadoop提交算法:
在这个性能测试,火花在砖上运行Hadoop将击败版本的提交协议。事实上,这种比较适用于所有类型的ETL工作负载。我们还执行每个协议的理论分析正确性:正确并协议保证输出的不同类型的失败?
没有提交协议 | Hadoop提交V1 | Hadoop提交V2 | DBIO事务提交 | |
---|---|---|---|---|
任务失败 | 没有 | (db_icon name =“选择目录”)是的 | (db_icon name =“选择目录”)是的 | (db_icon name =“选择目录”)是的 |
工作失败(例如持续的任务) | 没有 | (db_icon name =“选择目录”)是的 | 没有 | (db_icon name =“选择目录”)是的 |
司机在提交失败 | 没有 | 没有 | 没有 | (db_icon name =“选择目录”)是的 |
As the table shows, Databricks ’ new transactional commit protocol provides strong guarantees in the face of different types of failures. Moreover, by enforcing correctness, this brings several additional benefits to Spark users.
安全任务的猜测——任务投机允许火花大胆的发射任务时执行某些任务是观察到的异常缓慢。与当前Hadoop提交协议,投机引发任务是不安全,使写作时S3由于文件冲突的可能性。与事务提交,您可以安全地使任务的猜测“火花。猜测真正的“
集群中的火花配置。投机减少流浪者的影响作业完成任务,大大提高性能在某些情况下。
原子文件覆盖——有时有用自动覆盖现有的文件。今天,火花实现覆盖,首先删除数据集,然后执行工作产生新的数据。这个中断所有当前读者和不是容错。与事务提交,可以“逻辑删除”文件在提交时自动把它们标记为删除。原子覆盖可以连接的设置“spark.databricks.io.directoryCommit。enableLogicalDelete真|假”
。这提高了用户体验在那些同时访问相同的数据集。
增强一致性——我们的事务提交协议,结合其他数据砖服务,帮助减轻S3最终一致性与链接ETL作业可能出现的问题。
在砖使DBIO事务提交
从我们的火花2.1 -db4集群形象,DBIO提交协议(文档使用以下SQL)可以启用配置:
%sql集spark.sql.sources.commitProtocolClass=com.databricks.io.CommitProtocol
这也可以设置在创建集群通过设置相同的集群配置。我们也使DBIO默认事务提交砖3.0运行时β——将快速和正确的ETL数据砖的客户。你可以阅读更多关于这个特性我们的文档。
结论
回顾一下,我们发现现有的Hadoop提交协议迫使performance-integrity权衡使用时进行设置。相比之下,DBIO事务提交提供了最佳的性能和强大的正确性保证。