Как Redshift Spectrum сканирует данные?

Учитывая источник данных из 1,4 ТБ данных Parquet на S3, разделенных полем отметки времени (так что разделы year - month - day), я запрашиваю данные за определенный день (2,6 ГБ данных) и извлекаю все доступные поля в Parquet. файлы через Redshift Spectrum с этим запросом:

SELECT *
FROM my_external_schema.my_external_table
WHERE year = '2020' and month = '01' and day = '01'

Таблица доступна через Glue Crawler, который указывает на папка верхнего уровня в S3; это создает базу данных, а затем с помощью этой команды я связываю базу данных с новым внешняя схема:

create external schema my_external_schema from data catalog
database 'my_external_schema'
iam_role 'arn:aws:iam::123456789:role/my_role'
region 'my-region-9';

Анализируя таблицу в моей среде IDE, я вижу, что таблица создается с помощью этого оператора:

create external table my_external_schema.my_external_table
    (
    id string,
    my_value string,
    my_nice_value string
    )
partitioned by (year string, month string, day string)
row format serde 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
with serdeproperties ('serialization.format'='1')
stored as
inputformat 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
outputformat 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
location 's3://my-bucket/my/location/'
table properties ('CrawlerSchemaDeserializerVersion'='1.0', 'CrawlerSchemaSerializerVersion'='1.0', 'UPDATED_BY_CRAWLER'='my_crawler');

Когда я анализирую запрос от Redshift, я вижу, что вместо этого было отсканировано ~ 86 ГБ данных.

Как такое возможно? Это вызывает беспокойство, потому что Redshift выставляет счета на основе количества отсканированных данных и похоже, что служба сканирует примерно в 40 раз больше, чем фактический объем данных в этом разделе.

Я также попытался выполнить тот же запрос в Афине, и там я получил только 2,55 ГБ отсканированных данных (определенно более разумно).

Я не могу дать слишком много подробностей о размере кластера, но предполагаю, что эти 86 ГБ отсканированных данных поместятся в памяти кластера.


comment
Каков общий размер данных (без секционирования)? Вы уверены, что данные разделены правильно? Не могли бы вы показать нам вашу CREATE EXTERNAL TABLE команду и пример имен путей, используемых для данных?   -  person John Rotenstein    schedule 19.11.2020
comment
Привет, @JohnRotenstein, я обновил вопрос, пытаясь ответить на все ваши вопросы. Предоставляет ли он вам всю запрошенную информацию? Есть еще сомнения? В любом случае спасибо за внимание;)   -  person Vzzarr    schedule 20.11.2020
comment
Сможете ли вы запустить тот же запрос в Афине, чтобы сравнить, сколько данных там сканируется? Также было бы хорошо, если бы вы могли показать оператор создания таблицы.   -  person Philipp Johannis    schedule 20.11.2020
comment
Привет, @PhilippJohannis, как я уже писал в вопросе, таблица автоматически создается Glue Crawler. Есть ли что-нибудь еще, что вы хотели бы знать?   -  person Vzzarr    schedule 20.11.2020
comment
Что ж, вы все еще можете получить оператор создания таблицы, запустив SHOW CREATE TABLE .. - по крайней мере, в Athena. Или вы также можете поделиться снимком экрана с определением в Glue.   -  person Philipp Johannis    schedule 20.11.2020
comment
@PhilippJohannis Я понимаю, что вы имеете в виду ... Я получил информацию через свою IDE и сообщил информацию в вопросе. Я тоже попробую сделать такой же запрос в Афине ...   -  person Vzzarr    schedule 20.11.2020
comment
@PhilippJohannis сделал запрос в Афине, сообщил результат (разумный) в вопросе   -  person Vzzarr    schedule 20.11.2020
comment
Я хочу остановить вас, ребята, я нашел проблему. Я немного опубликую ответ, но в основном я твердо верю, что в консоли Redshift есть ошибка, больше контекста в ответе. Работать с AWS в таких условиях очень неприятно, потому что бизнес-решения принимаются на основе этих цифр.   -  person Vzzarr    schedule 20.11.2020


Ответы (1)


Похоже, проблема в консоли AWS Redshift.

Если мы проанализируем запрос из деталей запроса в консоли Redshift, я могу увидеть, что общий объем сканированных данных составляет 86 ГБ. Как упоминал Взарр, я запускаю тот же запрос на Афину, чтобы сравнить производительность. Время выполнения было в основном таким же, но объем отсканированных данных был совершенно другим: 2,55 ГБ.

Я провел такое же сравнение с другими запросами по внешней схеме S3, с использованием и без использования столбцов разделов: я увидел, что общее количество отсканированных ГБ различается в каждом тесте, иногда сильно отличается (320 МБ в Redshift Spectrum, 20 ГБ в Athena).

Я решил взглянуть на системные таблицы в Redshift, чтобы понять, как работает запрос по внешней схеме. Я провел очень простой тест, используя SVL_S3QUERY:

SELECT (cast(s3_scanned_bytes as double precision) / 1024 / 1024 / 1024) as gb_scanned,
       s3_scanned_rows,
       query
FROM SVL_S3QUERY
WHERE query = '<my-query-id>'

Результат полностью отличался от того, что консоль AWS Redshift сообщает для того же запроса. Не только gb_scanned был неправильным, но и s3_scanned_rows тоже. Запрос возвращает в общей сложности 2,55 ГБ отсканированных данных, в точности то же, что сказала Афина.

Для подтверждения чисел в SVL_S3QUERY я использовал AWS Cost Explorer чтобы дважды проверить общее количество ГБ, отсканированное за день, с учетом того, сколько мы заплатили за Redshift Spectrum: цифры в основном были такими же.

На данный момент я не знаю, откуда и из какой таблицы консоль AWS Redshift берет детали запроса, но они кажутся совершенно неверными.

person Hyruma92    schedule 20.11.2020
comment
Я могу подтвердить, что это «известная ошибка», и команда разработчиков Amazon Redshift исправит ее. Спасибо за подробные подробности! - person John Rotenstein; 22.11.2020