

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# EMR Serverless のメタストア設定
<a name="metastore-config"></a>

*Hive メタストア*は、スキーマ、パーティション名、データ型など、テーブルに関する構造情報を一元的に保存する場所です。EMR Serverless を使用することにより、このテーブルメタデータをジョブにアクセスできるメタストアに保持します。

Hive メタストアとして 2 つのオプションがあります。
+  AWS Glue データカタログ
+ 外部の Apache Hive メタストア

## AWS Glue データカタログをメタストアとして使用する
<a name="glue-metastore"></a>

Glue データカタログをメタストアとして使用するように Spark AWS ジョブと Hive ジョブを設定できます。永続的なメタストア、またはさまざまなアプリケーション、サービス、あるいは AWS アカウントで共有されるメタストアが必要である場合は、この設定をお勧めします。データカタログの詳細については、「 [AWS Glue データカタログの入力](https://docs.aws.amazon.com/glue/latest/dg/populate-data-catalog.html)」を参照してください。 AWS Glue の料金については、「 [AWS Glue の料金](https://aws.amazon.com/glue/pricing)」を参照してください。

EMR Serverless ジョブは、 AWS アカウント アプリケーションと同じ または別の で AWS Glue データカタログを使用するように設定できます AWS アカウント。

### AWS Glue データカタログを設定する
<a name="glue-metastore-configure"></a>

データカタログを設定するには、使用する EMR Serverless アプリケーションのタイプを選択します。

------
#### [ Spark ]

EMR Studio を使用して EMR Serverless Spark アプリケーションでジョブを実行する場合、 AWS Glue データカタログがデフォルトのメタストアです。

SDKs または を使用する場合は AWS CLI、ジョブ実行の`sparkSubmit`パラメータ`com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory`で `spark.hadoop.hive.metastore.client.factory.class`設定を に設定します。次の例は、 AWS CLIを使用してデータカタログを設定する方法を示しています。

```
aws emr-serverless start-job-run \
    --application-id application-id \
    --execution-role-arn job-role-arn \
    --job-driver '{
        "sparkSubmit": {
            "entryPoint": "s3://amzn-s3-demo-bucket/code/pyspark/extreme_weather.py",
            "sparkSubmitParameters": "--conf spark.hadoop.hive.metastore.client.factory.class=com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory --conf spark.driver.cores=1 --conf spark.driver.memory=3g --conf spark.executor.cores=4 --conf spark.executor.memory=3g"
        }
    }'
```

または、Spark コードで新しい `SparkSession` を作成するときにこの設定をすることができます。

```
from pyspark.sql import SparkSession

spark = (
    SparkSession.builder.appName("SparkSQL")
    .config(
        "spark.hadoop.hive.metastore.client.factory.class",
        "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory",
    )
    .enableHiveSupport()
    .getOrCreate()
)

# we can query tables with SparkSQL
spark.sql("SHOW TABLES").show()

# we can also them with native Spark
print(spark.catalog.listTables())
```

------
#### [ Hive ]

EMR Serverless Hive アプリケーションの場合、データカタログはデフォルトのメタストアです。つまり、EMR Serverless Hive アプリケーションでジョブを実行すると、Hive は AWS アカウント アプリケーションと同じ 内のデータカタログにメタストア情報を記録します。データカタログをメタストアとして使用するのに、仮想プライベートクラウド (VPC) は必要ありません。

Hive メタストアテーブルにアクセスするには、「 Glue AWS の [IAM アクセス許可の設定」で説明されている必要な AWS Glue ](https://docs.aws.amazon.com/glue/latest/dg/getting-started-access.html)ポリシーを追加します。

------

### EMR Serverless および AWS Glue データカタログのクロスアカウントアクセスを設定する
<a name="glue-metastore-cross-account"></a>

EMR Serverless のクロスアカウントアクセスを設定するには、まず以下にサインインします AWS アカウント。
+ `AccountA` – EMR Serverless アプリケーションを作成 AWS アカウント している 。
+ `AccountB` – EMR Serverless AWS ジョブを実行する Glue データカタログ AWS アカウント を含む 。

1. `AccountB` の管理者またはその他の承認された ID が、`AccountB` のデータカタログにリソースポリシーをアタッチしていることを確認します。このポリシーは、`AccountB` カタログ内のリソースに対してオペレーションを実行するための特定のクロスアカウントアクセス許可を `AccountA` に付与します。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "glue:GetDatabase",
           "glue:CreateDatabase",
           "glue:GetDataBases",
           "glue:CreateTable",
           "glue:GetTable",
           "glue:UpdateTable",
           "glue:DeleteTable",
           "glue:GetTables",
           "glue:GetPartition",
           "glue:GetPartitions",
           "glue:CreatePartition",
           "glue:BatchCreatePartition",
           "glue:GetUserDefinedFunctions"
         ],
         "Resource": [
           "arn:aws:glue:*:123456789012:catalog"
         ],
         "Sid": "AllowGLUEGetdatabase"
       }
     ]
   }
   ```

------

1. IAM ポリシーを `AccountA` の EMR Serverless ジョブランタイムロールに追加して、ロールが `AccountB` のデータカタログリソースにアクセスできるようにします。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "glue:GetDatabase",
           "glue:CreateDatabase",
           "glue:GetDataBases",
           "glue:CreateTable",
           "glue:GetTable",
           "glue:UpdateTable",
           "glue:DeleteTable",
           "glue:GetTables",
           "glue:GetPartition",
           "glue:GetPartitions",
           "glue:CreatePartition",
           "glue:BatchCreatePartition",
           "glue:GetUserDefinedFunctions"
         ],
         "Resource": [
           "arn:aws:glue:*:123456789012:catalog"
         ],
         "Sid": "AllowGLUEGetdatabase"
       }
     ]
   }
   ```

------

1.  ジョブの実行を開始します。このステップは、`AccountA` の EMR Serverless アプリケーションタイプによって少し異なります。

------
#### [ Spark ]

   以下の例に示されているように、`spark.hadoop.hive.metastore.glue.catalogid` プロパティを `sparkSubmitParameters` に渡します。*`AccountB-catalog-id`* は、`AccountB` のデータカタログの ID に置き換えます。

   ```
   aws emr-serverless start-job-run \
   --application-id "application-id" \
   --execution-role-arn "job-role-arn" \
   --job-driver '{
       "sparkSubmit": {
           "entryPoint": "s3://amzn-s3-demo-bucket/scripts/test.py",
            "sparkSubmitParameters": "--conf spark.hadoop.hive.metastore.client.factory.class=com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory --conf spark.hadoop.hive.metastore.glue.catalogid=AccountB-catalog-id --conf spark.executor.cores=1 --conf spark.executor.memory=1g --conf spark.driver.cores=1 --conf spark.driver.memory=1g --conf spark.executor.instances=1"
       }
     }' \
   --configuration-overrides '{
       "monitoringConfiguration": {
       "s3MonitoringConfiguration": {
       "logUri": "s3://amzn-s3-demo-bucket/logs/"
       }
     }
   }'
   ```

------
#### [ Hive ]

   以下の例に示されているように、`hive.metastore.glue.catalogid` プロパティを `hive-site` 分類に設定します。*`AccountB-catalog-id`* は、`AccountB` のデータカタログの ID に置き換えます。

   ```
   aws emr-serverless start-job-run \
   --application-id "application-id" \
   --execution-role-arn "job-role-arn" \
   --job-driver '{
       "hive": {
       "query": "s3://amzn-s3-demo-bucket/hive/scripts/create_table.sql",
       "parameters": "--hiveconf hive.exec.scratchdir=s3://amzn-s3-demo-bucket/hive/scratch --hiveconf hive.metastore.warehouse.dir=s3://amzn-s3-demo-bucket/hive/warehouse"
       }
   }' \
   --configuration-overrides '{
       "applicationConfiguration": [{
           "classification": "hive-site",
           "properties": {
               "hive.metastore.glue.catalogid": "AccountB-catalog-id"
           }
       }]
   }'
   ```

------

### AWS Glue データカタログを使用する際の考慮事項
<a name="glue-metastore-considerations"></a>

Hive スクリプトで `ADD JAR` に補助 JAR を追加できます。その他の考慮事項については、「 [Glue Data Catalog AWS を使用する際の考慮事項](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-hive-metastore-glue.html#emr-hive-glue-considerations-hive)」を参照してください。