当您浏览Spark + AI Summit令人印象深刻的演讲阵容时,您会发现关于如何利用对象存储的讨论并不多。从某种程度上来说,您可能会期待这样的讨论——毕竟,如果您想在PB级数据集上运行Spark作业,并使其在公有云或私有云中的应用程序可用,那么这将是合乎逻辑的存储架构。
虽然逻辑上合理,但至少在历史上,一直存在一个问题,那就是对象存储的性能不足以使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作业。
Apache Spark与S3 Select的实现作为一个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%(在真正的苹果对苹果比较中可能更快),但读者最大的收获应该是这两个系统都彻底重新定义了与对象存储相关的性能标准。
不用说,随着您扩展MinIO可用的节点数量,与AWS S3相比,这种性能差距将会扩大。
这种性能也扩展到写入方面,Minio和AWS S3的平均总写入IO分别为2.92 GB/秒和2.94 GB/秒。同样,MinIO和AWS S3之间的差异不如整体性能那么显著。
这对Apache Spark社区意味着,对象存储现在可以用于需要高性能和可扩展性的Spark作业。
AWS S3在公有云中提供此功能。MinIO在私有云中提供此功能。
选择使用Minio的私有云路线的一个优势是,私有云提供了更多机会根据特定用例调整硬件。这意味着NVMe驱动器、傲腾内存和100 GbE网络。这将比上面列出的公有云数字至少带来数量级的性能提升。
了解更多信息
如前所述,MinIO的代码是开源的,可以在此处获得。我们在Spark + AI Summit上发表了关于该主题的唯一演讲,并已将幻灯片发布到此处。如果您想了解更多信息,可以联系我们hello@min.io。或者您也可以随时在我们的Slack频道与我们互动。