使用S3 Select在对象存储上运行Peta-Scale Spark作业
当您看一下大多数数据科学会议的精彩演讲时,您将看不到关于如何利用对象存储的大量讨论。在某种程度上,您会期望-最终,如果您想在Peta级数据集上运行Spark或Presto作业,并使它可用于公共或私有云中的应用程序,这将是逻辑存储体系结构。
虽然合乎逻辑,但至少在历史上存在一个问题,那就是对象存储的性能不足以使运行Spark作业实际可行。随着现代的云原生方法的出现,这种变化及其对Apache Spark?社区的意义非常重大。
此更改的核心是对S3 API的扩展,以包括SQL查询功能S3 Select。使用S3 Select,用户可以直接在其对象上执行查询,仅返回相关的子集,而不必下载整个对象,这比检索整个对象存储库的常规方法要有效得多。
MinIO开创了S3兼容对象存储的先河。MinIO的S3 Select API实现与本机功能匹配,同时在执行Spark作业时提供了更好的资源利用率。这些进步使一系列常用查询的性能提高了几个数量级。
结合使用Apache Spark和S3 Select
使用MinIO S3 Select API,应用程序可以将查询作业卸载到MinIO服务器本身,从而大大提高了分析工作流程的速度。
通过将可能的查询下推到MinIO,然后仅将对象的相关子集加载到内存中进行进一步分析,Spark SQL可以运行得更快,消耗更少的网络资源,使用更少的计算/内存资源,并允许更多的Spark作业并行运行。
使用S3 Select的Apache Spark的实现可作为Spark数据源,通过DataFrame接口实现。在非常高的级别上,Spark和S3 Select将传入的筛选器转换为SQL S3 Select语句。然后,将这些查询发送到MinIO。当MinIO响应基于Select查询的数据子集时,Apache Spark使其可作为DataFrame进行进一步的操作。与任何DataFrame一样,此数据现在可以由任何其他Apache Spark库使用,例如Spark MLlib,Spark Streaming等。
目前,MinIO的S3 Select和Apache Spark实现支持JSON,CSV和Parquet文件格式进行查询下推。Apache Spark和S3 Select可以通过spark-shell,pyspark,spark-submit等集成。还可以将其添加为Maven依赖项,sbt-spark-package或jar导入。
与其所有软件一样,MinIO开源了此代码。可以在此处 找到以进行进一步检查。
高速查询处理
为了提供性能感觉,MinIO在8个节点上运行了TestDFSIO基准测试,并将其与AWS S3本身的类似性能进行了比较。MinIO的平均总读取IO为17.5 GB /秒,而AWS S3为10.3 GB /秒。虽然MinIO的速度提高了70%(在真正的苹果与苹果的比较中甚至可能更快),但读者的最大收获应该是两个系统都完全重新定义了与对象存储相关的性能标准。
不用说,与AWS S3的性能差距会随着您扩展MinIO可用节点的数量而增加。
此性能也扩展到写入,Minio和AWS S3的平均总体写入IO分别为2.92 GB /秒和2.94 GB /秒。同样,MinIO和AWS S3之间的差异远没有整体性能重要。
对于Apache Spark社区而言,这意味着对象存储正在为需要高性能和可伸缩性的Spark作业发挥作用。
AWS S3在公共云中提供了该功能。MinIO在私有云中提供了该功能。
与Minio一起使用私有云路线的一个优势是,私有云提供了更多将硬件调整到特定用例的机会。这意味着NVMe驱动器,Optane内存和100 GbE网络。与上面列出的公共云数量相比,这将至少提供至少一个数量级的性能改进。
1