Инвентарный список из нескольких ведер S3, принадлежащих Афине - PullRequest
0 голосов
/ 23 апреля 2019

Я пытаюсь запросить AWS S3 Список рассылки с использованием Athena. Я могу сделать это, если у меня есть только одно ведро источника. Я не уверен, как настроить это для работы с несколькими исходными корзинами.

мы используем все параметры конфигурации по умолчанию с форматом данных как CSV. S3 Шаблон имени места назначения для улья выглядит так:

 destination-prefix/source-bucket/config-ID/hive/dt=YYYY-MM-DD-HH-MM/symlink.txt

Поэтому, когда я создаю таблицу Athena, я должен использовать статический путь улья.

CREATE EXTERNAL TABLE your_table_name(
  //column names
)
PARTITIONED BY (dt string)
//options ignored
LOCATION 's3://destination-prefix/source-bucket/config-ID/hive/';

Так что, если я хочу запросить данные инвентаризации для нескольких исходных групп, создается впечатление, что мне нужно создать таблицу для каждого «исходного блока».

В качестве альтернативы, без использования Athena я пытаюсь сделать это с помощью AWS CLI

aws s3 ls s3://our-bucket-name/prefix/abc --recursive | awk ‘$1 > “2019-04-01”

Но сначала он получает каждый файл, поскольку нет возможности установить --include или --exclude с помощью "S3 ls"

наконец, вопросы:

  1. Могу ли я настроить AWS Inventory для создания инвентаризации для нескольких сегментов S3, чтобы она помещала все в один и тот же каталог «hive» (т. Е. Игнорировать префикс «source-bucket» при создании Invetory)?

  2. Можно ли настроить чтение Афины из нескольких мест улья? Но с возможностью создания и удаления новых сегментов, я думаю, это становится ужасно.

  3. Есть ли альтернативный способ запроса списка ресурсов вместо Athena или AWS CLI или написания пользовательского кода для использования файла manifest.json для получения этих CSV-файлов.

1 Ответ

0 голосов
/ 23 апреля 2019

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

В руководстве, на которое вы ссылаетесь, написано MSCK REPAIR TABLE … для загрузки ваших запасов. Я бы порекомендовал вам этого не делать, потому что он создаст странные таблицы с разделами, каждый из которых представляет инвентаризацию некоторого момента времени, что вам может понадобиться, если вы хотите сравнить то, что находится в корзине изо дня в день или неделю, чтобы неделю, но, вероятно, не то, что вы хотите большую часть времени. Большую часть времени вы хотите знать, что находится в ведре прямо сейчас. Чтобы получить несколько инвентарных списков в одну и ту же таблицу, вы также не должны запускать эту команду.

Сначала вы немного измените способ создания таблицы:

CREATE EXTERNAL TABLE your_table_name(
  //column names
)
PARTITIONED BY (bucket_name string)
//options ignored
LOCATION 's3://destination-prefix/source-bucket/config-ID/hive/';

Обратите внимание, что я изменил разбиение с dt string на bucket_name string.

Далее вы добавляете разделы вручную:

ALTER TABLE your_table_name
ADD PARTITION (bucket_name = 'some-bucket') LOCATION 's3://destination-prefix/source-bucket/config-ID1/hive/dt=YYYY-MM-DD/'
ADD PARTITION (bucket_name = 'another-bucket') LOCATION 's3://destination-prefix/source-bucket/config-ID2/hive/dt=YYYY-MM-DD/';

Местоположения должны быть URI S3 до самых поздних дат под префиксом «куста» инвентаря для каждого сегмента.

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

ALTER TABLE your_table_name
DROP PARTITION (bucket_name = 'some-bucket')
DROP PARTITION (bucket_name = 'another-bucket');

и добавление их снова, используя тот же SQL, что и выше, но с новыми URI S3.

...