Amazon Web Services ブログ

AWS DMS 3.1.3 での Parquet データ形式のサポートの発表

本日、AWS DMS は、Apache Parquet データ形式で、AWS がサポートするソースから Amazon S3 へのデータの移行のサポートを発表しました。これは、DMS 3.1.3 の多数ある新機能の 1 つです。お客様の多くは、データレイクを構築するために DMS で「ターゲットとしての S3」サポートを利用しています。そして、このデータを Amazon EMR、Amazon Athena、Amazon Redshift Spectrum などの他の AWS のサービスと共に使用しています。そうした中、さまざまな形式で S3 への移行をサポートする方法が求められ、この機能が利用可能になりました。

この記事では、選択した S3 バケットおよびフォルダに、Parquet 形式のデータを移行するように DMS タスクを設定する方法を説明します。

概要

Apache Parquet は、効率的な圧縮およびエンコードスキームをサポートするように構築されています。複数のプロジェクトで、データに適切な圧縮およびエンコードスキームを適用することによるパフォーマンスへの影響が実証されています。Parquet は列ごとのレベルで圧縮スキームを指定することを可能にし、今後発明、実装されるより多くのエンコーディングを追加できることが将来的に保証されています。AWS DMS 3.1.3 では、Parquet 形式で S3 への移行をサポートできます。

ウォークスルー

まず、適切な設定で S3 ターゲットエンドポイントを作成します。Parquet 形式のデータを移行するために必要な追加の接続属性を使用してこれを行うには、AWS CLI を使用する方法、DMS コンソールを使用する方法の 2 つの方法があります。

AWS CLI を使用して S3 ターゲットエンドポイントを作成する

次のコマンドを使用して、既存の S3 エンドポイントを変更し、データ形式が Parquet である追加の接続属性を指定します。

aws dms modify-endpoint --endpoint-arn arn:aws:dms:us-west-2:249813873556:endpoint:NRK76ZBYH2RNLNMALZHSNJICE4 --s3-settings '{"ServiceAccessRoleArn": "arn:aws:iam::249813873556:role/S3-Target-DMS", "BucketName": "test-dms-s3-target", "DataFormat": "parquet"}'

結果セットは、次のようになります。

{
    "Endpoint": {
        "Status": "active",
        "S3Settings": {
            "CompressionType": "NONE",
            "EnableStatistics": true,
            "BucketFolder": "",
            "CsvRowDelimiter": "\\n",
            "ParquetVersion": "parquet-1-0",
            "CsvDelimiter": ",",
            "ServiceAccessRoleArn": "arn:aws:iam::249813873556:role/S3-Target-DMS",
            "DataFormat": "parquet",
            "BucketName": "test-dms-s3-target",
            "EncodingType": "rle-dictionary"
        },
        "EndpointType": "TARGET",
        "ServiceAccessRoleArn": "arn:aws:iam::249813873556:role/S3-Target-DMS",
        "SslMode": "none",
        "EndpointArn": "arn:aws:dms:us-west-2:249813873556:endpoint:NRK76ZBYH2RNLNMALZHSNJICE4",
        "ExtraConnectionAttributes": "bucketName=test-dms-s3-target;compressionType=NONE;csvDelimiter=,;csvRowDelimiter=\\n;",
        "EngineDisplayName": "Amazon S3",
        "EngineName": "s3",
        "EndpointIdentifier": "target-s3"
    }
}

必ず最新バージョンの AWS CLI を使用してください。古いバージョンを使用すると、次のエラーが表示されます。

"Unknown parameter in S3Settings: "DataFormat", must be one of: ServiceAccessRoleArn, ExternalTableDefinition, CsvRowDelimiter, CsvDelimiter, BucketFolder, BucketName, CompressionType"

DMS コンソールを使用して S3 ターゲットエンドポイントを作成する

以下の手順で、S3 ターゲットエンドポイントを作成します。

  1. DMS コンソールの [Resource management] で、[Endpoints]、[Create endpoint] の順に選択します。
  2. 以下のように追加の接続属性を追加します。
compressionType=NONE;csvDelimiter=,;csvRowDelimiter=\n;DataFormat=parquet

エンドポイント設定画面は、次のスクリーンショットのようになります。

この例では、Microsoft SQL Server がソースです。次のコマンドで、このソースにテーブルを作成します。

create table  person (
  PersonID int NOT NULL PRIMARY KEY,
  LastName varchar(255),
  FirstName varchar(255),
  Address varchar(255),
  City varchar(255) 
);

SQL Server のテーブル結果セットにいくつかのレコードを挿入すると、次のようになります。

personid lastname firstname address city
1 jordan michael 12345 street ave chicago
2 potter harry 4567 terrace seattle
3 smith will 8901 3rd ave los angeles
4 staton jason 7896 street las vegas

前のターゲットエンドポイントを使用してタスクを作成します。タスクの移行が完了すると、次のスクリーンショットに示すように、Parquet ファイルが S3 バケットに作成されます。

Parquet ファイルを Amazon Redshift にコピーするか、Athena または AWS Glue を使用してファイルを照会することができます。その方法は、以下のセクションを参照してください。

Amazon Redshift を使用して Parquet ファイルをコピーする

Parquet ファイルを Amazon Redshift にコピーし、Amazon Redshift クラスターに接続し、以下のように SQL Server ソースから同じ構文を使用してテーブルを作成します。

create table person (
  PersonID int,
  LastName varchar(255),
  FirstName varchar(255),
  Address varchar(255),
  City varchar(255) 
);

これで、テーブルは Amazon Redshift で準備ができています。以下のコマンドを使用して、Amazon Redshift クラスターに対して copy コマンドを実行します。

COPY person
FROM 's3://bucketname/foldername/'
IAM_ROLE 'arn:aws:iam::<accountnumber>:role/<role_name>'
FORMAT AS PARQUET;

Athena を使ってファイルを照会する

ここで、Athena を使って Parquet ファイルから結果セットを取得します。Athena コンソールでテーブルを作成し、以下のコマンドを使用して入力データセットの場所を指定します。この例では、データセットは S3 です。

  CREATE EXTERNAL TABLE `s3parquettable`(
  `personid` int,
  `lastname` string,
  `firstname` string,
  `address` string,
  `city` string)
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://<bucketname>/Foldername'
TBLPROPERTIES (
  'has_encrypted_data'='false',
  'transient_lastDdlTime'='1553697314')

必要な詳細を入力してテーブルを作成すると、クエリを実行して以下の結果セットを返すことができます。

personid lastname firstname address city
1 jordan michael 12345 street ave chicago
2 potter harry 4567 terrace seattle
3 smith will 8901 3rd ave los angles
4 staton jason 7896 street las vegas

結論

DMS 3.1.3 を使用して、Parquet 形式のデータを S3 バケットに移行するように DMS タスクを設定できるようになりました。AWS CLI または AWS DMS コンソールを使用して、2 つの異なる方法で S3 ターゲットエンドポイントを作成することができます。

ご質問またはご提案については、以下でコメントを残してください。移行がうまくいきますように!

 


著者について

 

Harish Bannai は、AWS のクラウドサポートエンジニアです。 彼は当社の顧客と協力してデータベースプロジェクトに関する指導や技術支援を行い、AWS を使用する際にソリューションの価値を向上させる手助けをしています。