

# 実行に上限を設定してワークロードをパーティション化する
<a name="bounded-execution"></a>

通常、Spark アプリケーションのエラーは、Spark スクリプトが非効率的なこと、大規模な変換を分散メモリ内で実行すること、およびデータセットの異常によって発生します。ドライバーやエグゼキュターがメモリ不足の問題を引き起こす原因はたくさんあります。例えば、データの偏り、オブジェクトのリストが多すぎること、または大きなデータのシャッフルなどです。これらの問題は、Sparkで大量のバックログデータを処理しているときにしばしば発生します。

AWS Glue を使用すると、OOM の問題を解決し、ワークロードのパーティション化によって ETL 処理を容易に行うことができます。ワークロードのパーティション化を有効にすると、各 ETL ジョブ実行では、データセットサイズまたはこのジョブ実行で処理されるファイル数に上限を設定して、未処理のデータのみを選択します。残りのデータは、後で実行されるジョブで処理されます。例えば、1000 個のファイルを処理する必要がある場合、ファイル数を 500 に設定し、2 つのジョブ実行に分けることができます。

ワークロードのパーティション化は、Amazon S3 のデータソースでのみサポートされています。

## ワークロードのパーティション化の有効化
<a name="bounded-execution-enable"></a>

スクリプトでオプションを手動で設定するか、カタログテーブルのプロパティを追加することで、実行に上限を設定できます。

**スクリプトで実行に上限を設定してワークロードのパーティション化を有効にするには、次の手順に従います。**

1. データの再処理を回避するには、新しいジョブまたは既存のジョブでジョブブックマークを有効にします。詳細については、「[Tracking Processed Data Using Job Bookmarks](https://docs.aws.amazon.com/glue/latest/dg/monitor-continuations.html)」を参照してください。

1. スクリプトを修正し、AWS Glue `getSource` API の追加のオプションに上限の制限を設定します。また、ジョブブックマークの変換コンテキストを設定して、`state` 要素を保存します。例:

   Python

   ```
   glueContext.create_dynamic_frame.from_catalog(
       database = "database",
       table_name = "table_name",
       redshift_tmp_dir = "",
       transformation_ctx = "datasource0",
       additional_options = {
           "boundedFiles" : "500", # need to be string
         # "boundedSize" : "1000000000" unit is byte
       }
   )
   ```

   Scala

   ```
   val datasource0 = glueContext.getCatalogSource(
       database = "database", tableName = "table_name", redshiftTmpDir = "", 
       transformationContext = "datasource0",
       additionalOptions = JsonOptions(
           Map("boundedFiles" -> "500") // need to be string
         //"boundedSize" -> "1000000000" unit is byte
       ) 
   ).getDynamicFrame()
   ```

   ```
   val connectionOptions = JsonOptions(
       Map("paths" -> List(baseLocation), "boundedFiles" -> "30")
   )
   val source = glueContext.getSource("s3", connectionOptions, "datasource0", "")
   ```

**Data Catalog テーブルで実行に上限を設定してワークロードのパーティション化を有効にするには**

1. Data Catalog のテーブル構造の `parameters` フィールドに、キーと値のペアを設定します。詳細については、「[Viewing and Editing Table Details](https://docs.aws.amazon.com/glue/latest/dg/console-tables.html#console-tables-details)」を参照してください。

1. データセットサイズの上限または処理されるファイル数を次のように設定します。
   + `boundedSize` をデータセットのターゲットサイズ (バイト単位) に設定します。ジョブの実行は、テーブルからターゲットサイズに達すると停止します。
   + `boundedFiles` をターゲットファイル数に設定します。ジョブの実行は、ターゲット数のファイルを処理すると停止します。
**注記**  
単一の上限のみがサポートされているので、`boundedSize` または `boundedFiles` のどちらか一方だけを設定します。

## ジョブを自動的に実行する AWS Glue トリガーの設定
<a name="bounded-execution-trigger"></a>

実行に上限を設定すると、AWS Glue トリガーを設定してジョブを自動的に実行し、シーケンシャル実行でデータを段階的にロードすることができます。AWS Glue コンソールに移動してトリガーを作成し、スケジュール時刻を設定し、ジョブにアタッチします。その後、自動的に次のジョブ実行がトリガーされ、データの新しいバッチが処理されます。

また、AWS Glue ワークフローを使用して、複数のジョブを調整して、異なるパーティションのデータを並行して処理することもできます。詳細については、「[AWS Glue Triggers](https://docs.aws.amazon.com/glue/latest/dg/about-triggers.html)」および「[AWS Glue Workflows](https://docs.aws.amazon.com/glue/latest/dg/workflows_overview.html)」を参照してください。

ユースケースとオプションの詳細については、ブログ「[Optimizing Spark applications with workload partitioning in AWS Glue](https://aws.amazon.com/blogs/big-data/optimizing-spark-applications-with-workload-partitioning-in-aws-glue/)」を参照してください。