web-dev-qa-db-ja.com

AWS AthenaでMSCK REPAIR TABLEを自動的に実行する方法

1時間ごとに実行されるsparkバッチジョブがあります。実行ごとに、S3に新しいデータを生成し、ディレクトリ命名パターンDATA/YEAR=?/MONTH=?/DATE=?/datafileで保存します。

S3にデータをアップロードした後、Athenaを使用して調査したいと思います。さらに、データソースとしてAthenaに接続して、QuickSightでそれらを視覚化したいと思います。

問題は、my Sparkバッチを実行するたびに、手動でクエリS3を実行しない限り、MSCK REPARI TABLEに保存されている新しく生成されたデータがAthenaによって検出されないことです。

完全に自動化されたデータ視覚化パイプラインを作成できるように、Athenaにデータを自動的に更新させる方法はありますか?

19
YangZhao

このタスクをスケジュールするには、いくつかの方法があります。ワークフローをどのようにスケジュールしますか? AirflowLuigiAzkaban 、cron、または AWS Data pipeline のようなシステムを使用していますか?

これらのいずれかから、次のCLIコマンドを実行できます。

$ aws athena start-query-execution --query-string "MSCK REPAIR TABLE some_database.some_table" --result-configuration "OutputLocation=s3://SOMEPLACE"

別のオプションは AWS Lambda です。 S3への新しいアップロードに応答してMSCK REPAIR TABLE some_database.some_tableを呼び出す関数を使用できます。

Lambda関数の例は次のように書くことができます。

import boto3

def lambda_handler(event, context):
    bucket_name = 'some_bucket'

    client = boto3.client('athena')

    config = {
        'OutputLocation': 's3://' + bucket_name + '/',
        'EncryptionConfiguration': {'EncryptionOption': 'SSE_S3'}

    }

    # Query Execution Parameters
    sql = 'MSCK REPAIR TABLE some_database.some_table'
    context = {'Database': 'some_database'}

    client.start_query_execution(QueryString = sql, 
                                 QueryExecutionContext = context,
                                 ResultConfiguration = config)

次に、バケットのDATA/プレフィックスの下に新しいデータが追加されたときにLambda関数を実行するトリガーを設定します。

最終的に、Sparkジョブスケジューラを使用したジョブの実行後にパーティションを明示的に再構築すると、自己文書化できるという利点があります。一方、AWS Lambdaはこのようなジョブに便利です。

13
Zerodf

代わりにADD PARTITIONを実行する必要があります。

aws athena start-query-execution --query-string "ALTER TABLE ADD PARTITION..."

S3の場所から新しく作成されたパーティションを追加します。Athenaはデータのパーティション化にHiveを活用します。パーティションを持つテーブルを作成するには、CREATE TABLEステートメントの実行中にテーブルを定義する必要があります。 PARTITIONED BYを使用して、データを分割するキーを定義します。

2
Tony Marti