AWS Glue Streaming
AWS Glue のコンポーネントである AWS Glue Streaming を使用すると、ストリーミングデータをほぼリアルタイムで効率的に処理できるようになり、データインジェスト、処理、機械学習などの重要なタスクを実行できるようになります。AWS Glue Streaming は、Apache Spark Streaming フレームワークを使用して、ストリーミングデータを大規模に処理できるサーバーレスサービスを提供します。AWS Glue は、サーバーレスインフラストラクチャ、自動スケーリング、ビジュアルジョブ開発、ストリーミングジョブの瞬時オンノートブック、その他のパフォーマンスの向上など、Apache Spark 上でさまざまな最適化を提供します。
ストリーミングのユースケース
AWS Glue Streaming の一般的なユースケースには以下が含まれます。
ほぼリアルタイムのデータ処理: AWS Glue Streaming により、組織はストリーミングデータをほぼリアルタイムで処理できるため、最新の情報に基づいて洞察を導き出し、タイムリーな意思決定を行うことができます。
不正検出: AWS Glue Streaming はストリーミングデータのリアルタイム分析に利用できるため、クレジットカード詐欺、ネットワーク侵入、オンライン詐欺などの不正行為の検出に役立ちます。受信データを継続的に処理して分析することで、疑わしいパターンや異常を迅速に特定できます。
ソーシャルメディア分析: AWS Glue Streaming では、ツイート、投稿、コメントなどのソーシャルメディアデータをリアルタイムで処理できるため、組織はトレンドの監視、感情分析、ブランドの評判の管理をリアルタイムで行うことができます。
モノのインターネット (IoT) 分析: AWS Glue Streaming は、IoT デバイス、センサー、接続された機械によって生成される高速データストリームの処理と分析に適しています。これにより、リアルタイムの監視、異常検知、予知保全、およびその他の IoT 分析のユースケースが可能になります。
クリックストリーム分析: AWS Glue Streaming では、ウェブサイトやモバイルアプリケーションからのリアルタイムのクリックストリームデータを処理して分析できます。これにより、企業はユーザーの行動に関する洞察を得たり、ユーザー体験をパーソナライズしたり、リアルタイムのクリックストリームデータに基づいてマーケティングキャンペーンを最適化したりすることができます。
ログの監視と分析: AWS Glue Streaming では、サーバー、アプリケーション、ネットワークデバイスからのログデータをリアルタイムで継続的に処理および分析できます。これは、異常の検出、問題のトラブルシューティング、システムの状態とパフォーマンスの監視に役立ちます。
レコメンデーションシステム: AWS Glue Streaming では、ユーザーアクティビティデータをリアルタイムで処理し、レコメンデーションモデルを動的に更新できます。これにより、ユーザーの行動や好みに基づいた、パーソナライズされたリアルタイムのレコメンデーションが可能になります。
これらは、AWS Glue Streaming を適用できるさまざまなユースケースの例です。AWS エコシステムやマネージドサービスとの統合により、クラウドでのリアルタイムのストリーム処理や分析を便利に行えるようになります。
AWS Glue Streaming を使用することの利点は何ですか。
AWS Glue Streaming を使用する利点は以下のとおりです。
サーバーレス: AWS Glue Streaming はサーバーレスなので、インフラストラクチャを管理する必要がありません。これにより、運用上のオーバーヘッドが軽減され、ユーザーは、インフラストラクチャ管理ではなくデータ処理および分析タスクに集中できます。
自動スケーリング: AWS Glue Streaming には自動スケーリング機能があり、ワークロードに基づいて処理能力を動的に調整します。データ量の変動に合わせて自動的にスケールアウトまたはスケールインを行い、最適なパフォーマンスとリソース使用率を確保します。
ビジュアル開発: ストリーミングジョブの開発は複雑な場合があります。AWS GlueStreaming は、ビジュアルオーサリングツールである AWS Glue Studio を提供することで、この課題を解決します。AWS GlueStudio を使用すると、ストリーミングワークフローの作成プロセスが簡略化され、開発者がストリーミングアプリケーションを視覚的に設計および管理できるようになるため、習得時間が短縮され、生産性が向上します。
費用対効果: AWS Glue Streaming はサーバーレスサービスであり、インフラストラクチャのプロビジョニングや保守が不要になるため、コスト効率が向上します。ユーザーへの請求は、ストリーミングジョブの実行中に消費されたリソースに基づいて行われるため、実際の使用量に基づくコストの最適化とスケーリングが可能になります。
複雑なワークロードの処理: AWS Glue Streaming は複雑なストリーミングワークロードを処理するように設計されています。大量のリアルタイムデータの処理と分析、高度な変換のサポート、他の AWS サービスとの統合が可能なため、高度なストリーミングデータパイプラインおよび分析ワークフローが可能になります。
ロックインなし: AWS Glue Streaming には柔軟性があり、ベンダーロックインを回避できます。ユーザーは AWS Glue Streaming を広範な AWS エコシステムの一部として活用し、他の AWS サービスとシームレスに統合できます。これにより、特定のテクノロジーやプラットフォームに縛られることなく、既存のデータソース、アプリケーション、サービスと簡単に統合できます。
AWS Glue Streaming はどのようなときに使うべきですか。
ストリーミングのユースケースに関して言えば、多くの選択肢があります。AWS Glue Streaming は以下のシナリオで推奨されます。
既に AWS Glue または Spark をバッチ処理に使用している場合は、AWS Glue Streaming が理想的な選択肢です。新しい言語やフレームワークを学習しなくても、ストリーミングジョブの構築にシームレスに移行できます。AWS Glue Streaming を利用すると、既存の知識とインフラストラクチャを活用してジョブ開発プロセスを簡素化し、データ処理機能をリアルタイムのストリーミングシナリオに簡単に拡張できます。
バッチ、ストリーミング、およびイベント駆動型ワークロードを処理する統合サービスまたは製品が必要な場合は、AWS Glue Streaming が最適なソリューションです。AWS Glue Streaming を利用すれば、データ処理のニーズを 1 つのフレームワークに統合できるため、複数のシステムを管理する複雑さがなくなります。これにより、さまざまなワークロードタイプ間での一貫性と互換性を確保しながら、多様なデータワークフローを効率的に開発および保守できます。
AWS Glue Streaming は、ストリーミングデータ量が非常に多く、ストリームやリレーショナルデータベース間の結合などの複雑な変換を伴うシナリオに適しています。大量のデータストリームを効率的に処理して分析できるため、要求の厳しいワークロードにも簡単に取り組むことができます。高速なデータインジェストでも、複雑なデータ操作でも、AWS Glue Streaming のスケーラビリティと高度な処理機能により、最適なパフォーマンスと正確な結果が得られます。
ストリーミングジョブの構築に視覚的なアプローチを希望する場合は、AWS Glue が提供する、ストリーミングアプリケーションを視覚的に設計および管理できる AWS Glue Studio によって、開発プロセスを簡素化することができます。この直感的なインターフェイスにより、開発者はビジュアルインターフェイスを使用してストリーミングワークフローを作成、設定、監視できるため、習得時間が短縮され、生産性が向上します。
AWS Glue Streaming は、10 秒を超える厳しい SLA (サービスレベル契約) が適用されるほぼリアルタイムのユースケースに最適です。
Apache Iceberg、Apache Hudi、または Delta Lake を使用してトランザクションデータレイクを構築する場合、AWS Glue Streaming は、これらのオープンテーブル形式をネイティブにサポートします。このシームレスな統合により、これらのトランザクションデータレイクからストリーミングデータを直接処理できるようになり、データ整合性、完全性、互換性が確保されます。
さまざまなデータターゲットのストリーミングデータを取り込む必要がある場合: AWS Glue Streaming は、Amazon Redshift、Amazon RDS、Amazon Aurora、Oracle、SQL Server などのさまざまなデータターゲットにネイティブターゲットを提供します。
サポートされているデータソース
AWS Glue Streaming では、次のデータソースがサポートされています。
Amazon Kinesis
Amazon MSK (Managed Streaming for Apache Kafka)
セルフマネージド Apache Kafka
サポートされるデータターゲット
AWS Glue Streaming では、次のようなさまざまなデータターゲットがサポートされています。
AWS Glue データカタログがサポートするデータターゲット
Amazon S3
Amazon Redshift
MySQL
PostgreSQL
Oracle
Microsoft SQL Server
Snowflake
JDBC を使用して接続できるすべてのデータベース
Apache Iceberg、Delta、および Apache Hudi
AWS Glue Marketplace コネクタ
ストリーミングジョブのリアルタイムモードの有効化
リアルタイムモード (RTM) は、AWS Glue 6.0 で利用可能な Spark 構造化ストリーミングの新しい実行モデルです。RTM はエンドツーエンドのレイテンシーを秒単位または分単位から秒未満に短縮します。リアルタイムモードは、Spark 構造化ストリーミングジョブにのみ適用されます。レガシー Spark ストリーミング (DStreams) やその他のジョブタイプには適用されません。
RTM は Trigger.RealTime を使用します。タスクはバッチ期間 (デフォルトは 5 分) 内に継続的に実行され、間隔をまたいでデータを蓄積するのではなく、到着時にレコードを処理します。これは、forEachBatch/Trigger.ProcessingTime が各間隔でタスクをポーリング、処理、コミット、再起動するデフォルトのマイクロバッチモデルとは異なります。
重要
RTM では、ジョブ引数による明示的なオプトインが必要です。すべてのソースパーティションをカバーするのに十分なタスクスロットがない場合、RTM は未割り当てのパーティションをサイレントにドロップします。すべての Kafka パーティションをカバーするのに十分なワーカーをプロビジョニングする必要があります。
前提条件
リアルタイムモードを有効にする前に、ジョブが以下の要件を満たしていることを確認します。
-
AWS Glue バージョン 6.0
-
ジョブは Spark 構造化ストリーミングを使用する必要があります。リアルタイムモードは、レガシー Spark ストリーミング (DStreams) やその他のジョブタイプには適用されません。
-
ジョブタイプは Spark ストリーミング (
gluestreamingコマンド) である必要があります -
ジョブ言語は Scala (
--job-language scala) である必要があります。PySpark RTM のサポートは、Spark 4.2 まで利用できません。 -
Kafka ソースのみ。Amazon Kinesis は AWS Glue 6.0 の RTM ではサポートされていません。
-
ステートレスオペレーションのみ (選択、フィルタリング、プロジェクト、マップ)。集計、結合、重複排除、ウィンドウオペレーションなどのステートフルオペレーションはサポートされていません。
-
出力モードは Update である必要があります。追加モードは RTM ではサポートされていません。
-
自動スケーリングはリアルタイムモードと互換性がありません。RTM ジョブに対して自動スケーリングを有効にしないでください。ソーストピック内のすべての Kafka パーティションをカバーするのに十分な固定数のワーカーを設定します。
リアルタイムモードを使用するタイミング
リアルタイムモードは、特定のクラスのストリーミングワークロード用に設計されています。以下の場合は、リアルタイムモードの使用を検討してください。
-
エンドツーエンドのレイテンシーは 1 秒未満である必要があり、マイクロバッチのレイテンシー (1~2 秒以上) はこのユースケースでは高すぎます。
-
パイプラインは、Kafka から Kafka または別のシンクへのレコードのフィルタリング、射影、エンリッチメント、ルーティングなどのステートレス変換を実行します。
-
予測可能な固定数の Kafka パーティションがあり、それに応じてワーカーをプロビジョニングできます。
-
ジョブは Scala で記述されています。
以下の場合は、引き続きマイクロバッチモードを使用します。
-
集計、結合、重複排除、ウィンドウ計算などのステートフルオペレーションが必要です。
-
Amazon Kinesis をソースとして使用します。
-
PySpark ジョブを記述します。
-
可変データボリュームを処理するため、自動スケーリングに依存します。
-
forEachBatchまたは GlueContext ストリーミング API を使用します。 -
ユースケースでは、秒単位のレイテンシーが許容されます。
リアルタイムモードの仕組み
マイクロバッチモデルとリアルタイムモードの違いを以下に示します。
- マイクロバッチモード
-
各間隔で、タスクの起動、蓄積されたデータの読み取り、データ処理、チェックポイントのコミット、タスクの終了を行い、これを繰り返します。最小レイテンシーは約 1~2 秒です。
- リアルタイムモード
-
タスクを 1 度起動すると、
batchDurationMsの期間 (デフォルトは 5 分間) 実行されます。タスクは、到着したレコードを 1 秒未満のレイテンシーで処理します。期限になると、タスクは一斉に停止します。ドライバーはチェックポイントをコミットし、次のバッチでタスクを再起動します。
どちらのモードでも、同じチェックポイント形式と復旧メカニズムを使用します。主な違いは、タスクの有効期間です。マイクロバッチモードは、間隔ごとにタスクを終了し、再起動します。リアルタイムモードは、より長期間のバッチウィンドウでタスクを継続的に実行します。
重要
すべてのソースパーティションを処理するのに十分なタスクスロットがない場合、RTM は未割り当てのパーティションをサイレントにドロップします。すべてのパーティションをカバーできる十分なワーカーをプロビジョニングしてください。
リアルタイムモードを有効にするには
リアルタイムモードを有効にするには、--enable-real-time-mode ジョブ引数を true に設定します。この引数は、AWS Glue コンソールまたは API を使用して設定できます。
リアルタイムモードを有効にするには (コンソール)
-
AWS Glue コンソール
を開き、ストリーミングジョブを開きます。 -
[Job details] (ジョブの詳細) タブを選択します。
-
[Glue バージョン] には、[Glue 6.0] を選択します。[タイプ] には、[Spark Streaming] を選択します。
-
[ジョブパラメータ] セクションまでスクロールします。
-
[新しいパラメータを追加] を選択します。
-
[キー] に「
--enable-real-time-mode」と入力します。[Value (値)] に「true」と入力します。 -
[保存] を選択します。
注記
先頭にダッシュが必要です。ジョブパラメータ は、DefaultArguments のコンソールビューです。
リアルタイムモードを有効にするには (API)
--enable-real-time-mode フラグは、ジョブ定義の DefaultArguments マップに保存されます。ジョブを作成または更新するときに設定できます。
新しいジョブを作成するには (AWS CLI)
次のコマンドを実行します。
aws glue create-job \ --name my-rtm-job \ --role arn:aws:iam::123456789012:role/MyGlueRole \ --glue-version 6.0 \ --worker-type G.1X --number-of-workers 4 \ --command '{"Name":"gluestreaming","ScriptLocation":"s3://my-bucket/scripts/rtm-job.scala"}' \ --default-arguments '{ "--enable-real-time-mode": "true", "--job-language": "scala", "--class": "GlueApp", "--TempDir": "s3://my-bucket/tmp/" }' \ --region us-east-2
新しいジョブを作成するには (boto3)
以下のコードを使用します。
import boto3 glue = boto3.client("glue", region_name="us-east-2") glue.create_job( Name="my-rtm-job", Role="arn:aws:iam::123456789012:role/MyGlueRole", GlueVersion="6.0", WorkerType="G.1X", NumberOfWorkers=4, Command={ "Name": "gluestreaming", "ScriptLocation": "s3://my-bucket/scripts/rtm-job.scala", }, DefaultArguments={ "--enable-real-time-mode": "true", "--job-language": "scala", "--class": "GlueApp", "--TempDir": "s3://my-bucket/tmp/", }, )
既存のジョブを更新するには (AWS CLI)
次のコマンドを実行します。
aws glue update-job \ --job-name my-existing-job \ --job-update '{ "GlueVersion": "6.0", "DefaultArguments": { "--enable-real-time-mode": "true", "--job-language": "scala" } }'
ストリーミングスクリプトの記述
ジョブ引数は、リアルタイムモードを使用する意図を宣言します。スクリプトがトリガーを選択します。
次の Scala の例は、Trigger.RealTime を使用するストリーミングクエリを示しています。
import org.apache.spark.sql.streaming.Trigger val query = df.writeStream .format("kafka") .outputMode("update") .trigger(Trigger.RealTime(60000L)) // checkpoint interval in milliseconds .start() query.awaitTermination()
Trigger.RealTime は、チェックポイント間隔をミリ秒単位で受け取ります。更新出力モードが必要です。追加モードでは OUTPUT_MODE_NOT_SUPPORTED がスローされます。
フラグが設定されている限り、モードを 1 つのスクリプトに混在させることができます。
dfA.writeStream.outputMode("update").trigger(Trigger.RealTime(60000L)).start() dfB.writeStream.outputMode("append").trigger(Trigger.ProcessingTime("30 seconds")).start()
フラグがない場合の動作
--enable-real-time-mode フラグが設定されていない場合のジョブの動作を以下に示します。
-
--enable-real-time-modeフラグなしでリアルタイムクエリを開始するジョブは、クエリの開始時に失敗します。失敗メッセージは、引数を追加するように指示するものです。 -
マイクロバッチのみのジョブは、このフラグがなくても影響を受けません。
-
フラグを設定するが、マイクロバッチクエリのみを使用するジョブも影響を受けません。
考慮事項と制限事項
リアルタイムモードを使用する場合は、以下を考慮してください。
- パーティションドロップ
-
すべてのソースパーティションをカバーできる十分なタスクスロットがない場合、未割り当てのパーティションは処理されません。すべての Kafka パーティションをカバーするよう、ワーカーをプロビジョニングします。
- 自動スケーリングなし
-
リアルタイムモードジョブでは、自動スケーリングを有効にしないでください。自動スケーリングは RTM と互換性がなく、低レイテンシーのメリットを相殺するレイテンシーをもたらします。ソーストピックの Kafka パーティションの数以上の固定数のワーカーをプロビジョニングします。
- Kafka のみ
-
Amazon Kinesis ソースは、AWS Glue 6.0 の RTM をサポートしていません。
- Scala のみ
-
PySpark は、Spark 4.2 まで RTM がサポートされていません。
- ステートレスのみ
-
集計、結合、重複排除、ウィンドウ操作、
transformWithStateはサポートされていません。 - forEachBatch の互換性がない
-
RTM は
forEachBatchモデルを使用しません。writeStreamをTrigger.RealTimeと直接使用してください。 - チェックポイントからの復元
-
ジョブの再起動時に、RTM は最後のチェックポイントから復旧します。チェックポイントは
batchDurationMsごとに発生します。最悪の場合の再処理は、1 つのバッチウィンドウ (最低 1 回配信セマンティクス) の期間です。