1時間ごとに実行されるsparkバッチジョブがあります。実行ごとに、S3
に新しいデータを生成し、ディレクトリ命名パターンDATA/YEAR=?/MONTH=?/DATE=?/datafile
で保存します。
S3
にデータをアップロードした後、Athena
を使用して調査したいと思います。さらに、データソースとしてAthenaに接続して、QuickSight
でそれらを視覚化したいと思います。
問題は、my Sparkバッチを実行するたびに、手動でクエリS3
を実行しない限り、MSCK REPARI TABLE
に保存されている新しく生成されたデータがAthenaによって検出されないことです。
完全に自動化されたデータ視覚化パイプラインを作成できるように、Athenaにデータを自動的に更新させる方法はありますか?
このタスクをスケジュールするには、いくつかの方法があります。ワークフローをどのようにスケジュールしますか? Airflow 、 Luigi 、 Azkaban 、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はこのようなジョブに便利です。
代わりにADD PARTITION
を実行する必要があります。
aws athena start-query-execution --query-string "ALTER TABLE ADD PARTITION..."
S3
の場所から新しく作成されたパーティションを追加します。Athenaはデータのパーティション化にHiveを活用します。パーティションを持つテーブルを作成するには、CREATE TABLE
ステートメントの実行中にテーブルを定義する必要があります。 PARTITIONED BY
を使用して、データを分割するキーを定義します。