искра читать секционированные данные в S3 частично в glacier

У меня есть набор данных в паркете в S3, разделенный по дате (dt), причем самая старая дата хранится в AWS Glacier, чтобы сэкономить деньги. Например, у нас...

s3://my-bucket/my-dataset/dt=2017-07-01/    [in glacier]
...
s3://my-bucket/my-dataset/dt=2017-07-09/    [in glacier]
s3://my-bucket/my-dataset/dt=2017-07-10/    [not in glacier]
...
s3://my-bucket/my-dataset/dt=2017-07-24/    [not in glacier]

Я хочу прочитать этот набор данных, но только подмножество дат, которые еще не находятся в леднике, например:

val from = "2017-07-15"
val to = "2017-08-24"
val path = "s3://my-bucket/my-dataset/"
val X = spark.read.parquet(path).where(col("dt").between(from, to))

К сожалению, у меня есть исключение

java.io.IOException: com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.model.AmazonS3Exception: The operation is not valid for the object's storage class (Service: Amazon S3; Status Code: 403; Error Code: InvalidObjectState; Request ID: C444D508B6042138)

Мне кажется, что spark не нравится секционированный набор данных, когда некоторые разделы находятся в Glacier. Я всегда мог прочитать конкретно каждую дату, добавить столбец с текущей датой и reduce(_ union _) в конце, но это чертовски уродливо, и в этом нет необходимости.

Есть ли какой-нибудь совет для чтения доступных данных в хранилище данных даже со старыми данными в glacier?


person Boris    schedule 21.08.2017    source источник
comment
Я не верю, что это возможно. AWS Glacier, похоже, не поддерживает предикаты pushdown...   -  person eliasah    schedule 21.08.2017
comment
Не используйте glacier, если вам нужно получить некоторые последние данные. Это не стоит проблем, и вы можете попасть в ценовую ловушку. Просто сохраните данные и стандарт-IA. medium.com/@karppinen/   -  person mootmoot    schedule 21.08.2017
comment
Привет мутот. Я не хочу размораживать данные в Glacier (это было бы непомерно дорого). Моя точка зрения заключалась в том, что я хочу использовать разделы моего набора данных, которые еще НЕ находятся в glacier, но есть другие разделы (которые я не хочу читать)! Я думаю, что единственный способ — изменить AWS SDK, чтобы он вообще не пытался сканировать зависшие разделы.   -  person Boris    schedule 22.08.2017
comment
@Boris: Вы смогли найти ответ на этот вопрос? Учитывая, что сейчас доступно еще больше вариантов ледника (глубокий ледник), этот процесс стал болезненным. Какие-либо предложения? PS: я видел обсуждение здесь на jira.apache.org/jira/browse/SPARK. -21797   -  person Manish Ranjan    schedule 02.04.2019
comment
нет, до сих пор не исправили. Если вы внедрили issues.apache.org/jira/browse/HADOOP-14837 тогда Spark мог бы видеть, что было в автономном режиме, и, возможно, пропустить его, но на самом деле это уровень беспокойства, которого Spark не должен делать. Разделите автономные и горячие данные или ожидайте трассировки стека   -  person stevel    schedule 03.04.2019
comment
@ManishRanjan ты получил ответ?   -  person maaz    schedule 10.04.2019


Ответы (5)


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

Apache Spark не может напрямую обрабатывать хранилище glacier TABLE/PARTITION, сопоставленное с S3 .

java.io.IOException: com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.model.AmazonS3Exception: операция недействительна для класса хранилища объекта (сервис: Amazon S3; код состояния : 403; код ошибки: InvalidObjectState; идентификатор запроса: C444D508B6042138)

Когда S3 перемещает любые объекты из классов хранения S3

  • СТАНДАРТ,

  • СТАНДАРТ_IA,

  • REDUCED_REDUNDANCY

    к классу хранения GLACIER у вас есть объект, который S3 сохранил в Glacier, который вам не виден, и S3 будет взимать плату только за хранение Glacier.

Это по-прежнему объект S3, но он имеет класс хранения GLACIER.

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

Перемещение данных в корзину S3, считанных в Apache Spark, решит вашу проблему.

Примечание. Apache Spark, AWS athena и т. д. не могут считывать объекты напрямую из glacier, если вы попытаетесь получить ошибку 403.

Если вы архивируете объекты с помощью хранилища Glacier, вы должны проверить класс хранения объекта, прежде чем пытаться его извлечь. Обычный запрос GET будет работать должным образом, если объект хранится в стандартном хранилище S3 или хранилище с уменьшенной избыточностью (RRS). Это не удастся (с ошибкой 403), если объект заархивирован в Glacier. В этом случае вы должны использовать операцию RESTORE (описанную ниже), чтобы сделать ваши данные доступными в S3.

person vaquar khan    schedule 03.04.2019

Если вы определяете свою таблицу через Hive и используете каталог хранилища метаданных Hive для запроса к ней, она не будет пытаться перейти на невыбранные разделы. Взгляните на настройку spark.sql.hive.metastorePartitionPruning.

person Madhava Carrillo    schedule 06.02.2018

Ошибка 403 связана с тем, что вы не можете прочитать объект, который находится в архиве в Glacier, источник

Чтение файлов из Glacier

Если вы хотите прочитать файлы из Glacier, вам необходимо восстановить их на s3 перед использованием в Apache Spark, копия будет доступна на s3 в течение времени, указанного во время команды восстановления, подробнее см. здесь, вы можете использовать консоль S3, cli или любой другой язык для выполнения это тоже

Удаление некоторых файлов Glacier, которые вы не хотите восстанавливать

Допустим, вы не хотите восстанавливать все файлы из Glacier и отбрасывать их при обработке, из Spark 2.1.1, 2.2.0 вы можете игнорировать эти файлы (с IO/Runtime Exception), установив spark.sql.files.ignoreCorruptFiles в true источник

person maaz    schedule 03.04.2019

Коннекторы S3 от Amazon (s3://) и ASF (s3a://) не работают с Glacier. Конечно никто не тестирует s3a на glacier. и если бы были проблемы, вы бы оставили их исправить самостоятельно. Просто скопируйте данные в s3 или на локальную HDFS и потом работайте с ними там

person stevel    schedule 22.08.2017

попробуйте этот параметр: ss.sql(set spark.sql.hive.caseSensitiveInferenceMode=NEVER_INFER) или добавьте конфигурацию spark-defaults.conf:

spark.sql.hive.caseSensitiveInferenceMode NEVER_INFER
person zhouyan8603    schedule 29.03.2021