Когда были разработаны первые API-интерфейсы для хранения объектов, они были сосредоточены на эффективном хранении и извлечении объектов. Успех Amazon с S3 и реализация надежного S3 API быстро стали фактическим стандартом для объектного хранилища в облаке.

MinIO, осознавая это, вложил значительные средства в создание наиболее совместимой реализации S3 API за пределами Amazon. Это, в свою очередь, сделало MinIO стандартом в области объектного хранилища частного облака, о чем свидетельствуют более 200 миллионов запросов Docker на сегодняшний день.

Однако, как и в случае с любой другой технологией, API-интерфейс объектного хранилища должен развиваться и адаптироваться к изменяющимся требованиям пользователей, и в этом случае эти меняющиеся требования обусловлены новыми рабочими процессами, связанными с большими данными, аналитикой и машинным обучением. Одна из динамичных областей развития S3 API - помочь пользователям максимально использовать свои озера данных.

Эта эволюция важна, потому что AI, ML / DL и другие аналитические подходы занимают центральное место в стратегии корпоративных данных сегодня, и такие рабочие нагрузки редко заботятся об объекте как таковом, вместо этого им нужен доступ к отфильтрованным данным, которые имеют отношение к конкретная работа.

Это привело к созданию S3 Select API, который, по сути, представляет собой возможности SQL-запросов, встроенные прямо в хранилище объектов. MinIO также недавно представила свою реализацию Select API. Пользователи могут выполнять запросы Select к своим объектам и извлекать соответствующее подмножество объекта, вместо того, чтобы загружать весь объект.

В этом посте мы поговорим об одной из самых популярных платформ для анализа данных в экосистеме больших данных - Spark. В частности, мы рассмотрим поддержку Select в MinIO и то, как она дополняет Spark и аналогичные платформы. Наконец, мы рассмотрим недавно выпущенный MinIO Spark-Select и поймем, как он улучшает производительность запросов за счет использования поддержки SQL в MinIO.

Поддержка MinIO S3 Select API

Типичный поток данных до выпуска Select API выглядел бы следующим образом:

  • Приложения загружают объект целиком, используя GetObject()
  • Загрузите объект в локальную память.
  • Запустите процесс запроса, пока объект находится в памяти.

С помощью S3 Select API приложения теперь могут загружать определенное подмножество объекта - только то подмножество, которое удовлетворяет заданному запросу Select. Это напрямую влияет на эффективность и производительность:

  • Сниженные требования к пропускной способности
  • Оптимизирует вычислительные ресурсы и память
  • Благодаря меньшему объему памяти можно выполнять больше заданий параллельно - с теми же вычислительными ресурсами.
  • Чем быстрее работа завершается, тем лучше используются аналитики и эксперты в предметной области.

Приложение может добавить S3 Select API с помощью AWS SDK. Давайте посмотрим на пример использования MinIO Select API с aws-sdk-python.

Для начала вам потребуется активировать экземпляр сервера MinIO и настроить mc для взаимодействия с этим экземпляром. Затем загрузите образец csv файла и загрузите его в соответствующую корзину на сервере MinIO.

$ curl "https://esa.un.org/unpd/wpp/DVD/Files/1_Indicators%20(Standard)/CSV_FILES/WPP2017_TotalPopulationBySex.csv" > TotalPopulation.csv
$ gzip TotalPopulation.csv
$ mc mb myminio/mycsvbucket
$ mc cp TotalPopulation.csv.gz myminio/mycsvbucket/sampledata/

Затем установите aws-sdk-python и используйте приведенный ниже фрагмент кода для запроса файла csv прямо на сервере MinIO.

Подробную документацию по MinIO Select API можно найти здесь: https://docs.minio.io/docs/minio-select-api-quickstart-guide.html

MinIO Spark-Select

Теперь, когда поддержка MinIO Select API стала общедоступной, любое приложение может использовать этот API для передачи заданий запросов на сам сервер MinIO.

Однако такое приложение, как Spark, которое уже используется тысячами предприятий, если оно будет интегрировано с Select API, окажет огромное влияние на ландшафт науки о данных, сделав задания Spark на порядок быстрее.

Технически для Spark SQL имеет смысл передавать возможные запросы в MinIO и загружать в память только соответствующее подмножество объектов для дальнейшего анализа. Это сделает Spark SQL быстрее, использует меньше ресурсов вычислений и памяти и позволит одновременно запускать больше заданий Spark.

Для поддержки этого мы недавно выпустили проект Spark-Select для интеграции Select API со Spark SQL. Проект Spark-Select доступен под лицензией Apache License V2.0 на

Проект Spark-Select работает как источник данных Spark, реализованный через интерфейс DataFrame. На очень высоком уровне Spark-Select работает путем преобразования входящих фильтров в операторы SQL Select. Затем он отправляет эти запросы в MinIO. Поскольку MinIO отвечает подмножеством данных на основе запроса Select, Spark делает его доступным как DataFrame, который доступен для дальнейших операций как обычный DataFrame. Как и в случае с любым DataFrame, эти данные теперь могут использоваться любой другой библиотекой Spark, например. Spark MLlib, Spark Streaming и другие.

Spark-Select в настоящее время поддерживает форматы файлов JSON, CSV и Parquet для развертывания запросов. Это означает, что объект должен быть одного из этих типов, чтобы нажатие на него работало.

Spark-Select можно интегрировать со Spark через spark-shell, pyspark, spark-submit и т. Д. Вы также можете добавить его как зависимость Maven, sbt-spark-package или jar импорт.

Давайте посмотрим на пример использования Spark-Select с Spark-Shell.

  • Запустите сервер MinIO и настройте mc для взаимодействия с этим сервером.
  • Создайте корзину и загрузите образец файла
$ curl "https://raw.githubusercontent.com/minio/spark-select/master/examples/people.csv" > people.csv
$ mc mb myminio/sjm-airlines
$ mc cp people.csv myminio/sjm-airlines
  • Загрузите пример кода из репозитория spark-select
$ curl "https://raw.githubusercontent.com/minio/spark-select/master/examples/csv.scala" > csv.scala
> $SPARK_HOME/bin/spark-shell --master local[4] --jars "../bin/hadoop-aws-2.8.2.jar,../bin/httpclient-4.5.3.jar,../bin/aws-java-sdk-core-1.11.234.jar,../bin/aws-java-sdk-kms-1.11.234.jar,../bin/aws-java-sdk-1.11.234.jar,../bin/aws-java-sdk-s3-1.11.234.jar,../bin/joda-time-2.9.9.jar" --packages io.minio:spark-select_2.11:2.0 
  • После успешного вызова spark-shell запустите файл csv.scala
scala> :load csv.scala
Loading examples/csv.scala...
import org.apache.spark.sql._
import org.apache.spark.sql.types._
schema: org.apache.spark.sql.types.StructType = StructType(StructField(name,StringType,true), StructField(age,IntegerType,false))
df: org.apache.spark.sql.DataFrame = [name: string, age: int]
+-------+---+
|   name|age|
+-------+---+
|Michael| 31|
|   Andy| 30|
| Justin| 19|
+-------+---+
scala>

Как видите, возвращаются только поля со значением age > 19.

Я надеюсь, что приведенный выше пример дает представление о том, как spark-select может помочь отправить запросы на сервер MinIO и ускорить конвейеры анализа данных.

Приглашаем вас ознакомиться с проектом по адресу https://github.com/minio/spark-select.

Резюме

Мир хранения объектов не просто растет, он меняется одновременно. Эти изменения можно увидеть в растущем числе точек соприкосновения с аналитикой и машинным обучением, которые появляются в экосистеме. Хотя этот пост посвящен SQL Select со стратегической и тактической точки зрения, в ближайшие недели будет больше информации, посвященной другим аналитическим фреймворкам.

Ключевой вывод заключается в том, что объектное хранилище быстро переходит от традиционных вариантов использования аварийного восстановления и архивирования к более динамичным вариантам использования, в которых упор делается на аналитику и машинное обучение. SQL как язык данных данных имеет решающее значение для успеха этих вариантов использования.

Все это подчеркивает повышенную важность объектного хранилища на предприятии как в общедоступном, так и в частном облаке. Также проводится различие между устаревшими хранилищами объектов и собственными облачными хранилищами объектов. В конечном итоге это означает Amazon для общедоступного облака и Minio для частного облака.