AWS Quicksight не может увидеть Athena DB в другом регионе - PullRequest
0 голосов
/ 10 октября 2019

Моя Athena БД находится в регионе ap-south-1, а AWS QuickSight в этом регионе не существует.

Как я могу соединить QuickSight с Athena в этом случае?

1 Ответ

1 голос
/ 10 октября 2019

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

С Консолью AWS

Этот подход является наиболее простым и не требует дополнительной настройки, поскольку все основано на операторах Athena DDL .

  1. Получить определение таблицы с помощью
    SHOW CREATE TABLE `database`.`table`;
    
    Это должно вывести что-то вроде:
    CREATE EXTERNAL TABLE `database`.`table`(
      `col_1` string, 
      `col_2` bigint, 
      ... 
      `col_n` string)
    ROW FORMAT SERDE 
      'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' 
    STORED AS INPUTFORMAT 
      'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' 
    OUTPUTFORMAT 
      'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
    LOCATION
      's3://some/location/on/s3'
    TBLPROPERTIES (
      'classification'='parquet',
      ... 
      'compressionType'='gzip')
    
  2. Изменить на нужный регион
  3. Создать database там, где вы хотитедля хранения определений таблиц или использования значений по умолчанию.
  4. Оператор Execute, созданный SHOW CREATE TABLE. Обратите внимание, что вам может потребоваться изменить имя базы данных относительно предыдущего шага
  5. Если ваша таблица разбита на разделы, вам потребуется загрузить все разделы. Если данные на S3 придерживаются стиля разбиения HIVE, то есть

    s3://some/location/on/s3
    |
    ├── day=01
    |   ├── hour=00
    |   └── hour=01
    ...
    

    , тогда вы можете использовать

    MSCK REPAIR TABLE `database`.`table`
    

    В качестве альтернативы, вы можете загружать разделы один за другим

    ALTER TABLE `database`.`table` 
    ADD PARTITION (day='01', hour='00') 
    LOCATION 's3://some/location/on/s3/01/00';
    
    ALTER TABLE `database`.`table` 
    ADD PARTITION (day='01', hour='01') 
    LOCATION 's3://some/location/on/s3/01/01';
    
    ...
    

С AWS API

Вы можете использовать AWS SDK, например, boto3 для python, который предоставляет простой в использовании объектно-ориентированный API. Здесь у вас есть два варианта:

  1. Использовать клиент Athena. Как и в предыдущем подходе, вам потребуется получить определение таблицы из консоли AWS. Но все остальные шаги можно выполнить в сценарии с использованием метода start_query_execution клиента Athena. В Интернете есть множество ресурсов, например, этот

  2. Используйте клиент AWS Glue. Этот метод основан исключительно на работе с каталогом данных клея AWS, который используется Athena во время выполнения запроса. Основная идея состоит в том, чтобы создать два клиента склеивания, один для исходного и один для целевого каталога. Например,

    import boto3
    KEY_ID = "__KEY_ID__"
    SECRET = "__SECRET__"
    
    glue_source = boto3.client(
        'glue',
        region_name="ap-south-1",
        aws_access_key_id=KEY_ID,
        aws_secret_access_key=SECRET
    )
    
    glue_destination = boto3.client(
        'glue',
        region_name="us-east-1",
        aws_access_key_id=KEY_ID,
        aws_secret_access_key=SECRET
    )
    
    # Or you can do it with creating sessions
    glue_source = boto3.session.Session(profile_name="profile_for_ap_south_1").client("glue")
    glue_destination = boto3.session.Session(profile_name="profile_for_us_east_1").client("glue")
    

    Тогда вам нужно будет использовать методы типа get и create. Это также потребует анализа ответов, которые будут получены от клиентов склеивания.

С помощью сканеров клея AWS

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

...