メタストア設定 - Amazon EMR

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

メタストア設定

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

Hive メタストアには 2 つのオプションがあります。

  • AWS Glue データカタログ

  • 外部 Apache Hive メタストア

AWS Glue Data Catalog をメタストアとして使用する

AWS Glue Data Catalog をメタストアとして使用するように Spark ジョブと Hive ジョブを設定できます。この設定は、永続的なメタストア、または異なるアプリケーション、サービス、または によって共有されるメタストアが必要な場合にお勧めします AWS アカウント。データカタログの詳細については、AWS 「Glue データカタログ の入力」を参照してください。 AWS Glue の料金については、AWS 「Glue の料金」を参照してください。

AWS Glue Data Catalog を使用するようにEMRサーバーレスジョブを、 AWS アカウント アプリケーションと同じ または別の で設定できます AWS アカウント。

AWS Glue データカタログを設定する

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

Spark

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

SDKs または を使用する場合 AWS CLI、ジョブ実行のsparkSubmitパラメータcom.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactoryspark.hadoop.hive.metastore.client.factory.class 設定を に設定することができます。次の例は、 を使用して Data Catalog を設定する方法を示しています 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 アプリケーションの場合、Data Catalog はデフォルトのメタストアです。つまり、EMRServerless Hive アプリケーションでジョブを実行すると、Hive はアプリケーション AWS アカウント と同じ Data Catalog にメタストア情報を記録します。Data Catalog をメタストアとして使用するには、仮想プライベートクラウド (VPC) は必要ありません。

Hive メタストアテーブルにアクセスするには、 AWS Glue のアクセス許可の設定 で説明されている必要な AWS Glue IAM ポリシーを追加します。

EMR Serverless および AWS Glue Data Catalog のクロスアカウントアクセスを設定する

EMR Serverless のクロスアカウントアクセスを設定するには、まず次の にサインインする必要があります AWS アカウント。

  • AccountA – EMR Serverless アプリケーションを作成 AWS アカウント している 。

  • AccountB – EMR Serverless ジョブを実行する AWS Glue データカタログ AWS アカウント を含む 。

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

    { "Version" : "2012-10-17", "Statement" : [ { "Effect" : "Allow", "Principal": { "AWS": [ "arn:aws:iam::accountA:role/job-runtime-role-A" ]}, "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:region:AccountB:catalog"] } ] }
  2. ロールが の Data Catalog リソースにアクセスできるAccountAように、 のEMRサーバーレスジョブランタイムロールにIAMポリシーを追加しますAccountB

    { "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:region:AccountB:catalog"] } ] }
  3. ジョブの実行を開始します。このステップは、 AccountAの EMR Serverless アプリケーションタイプによって若干異なります。

    Spark

    次の例に示すように、hive-site分類に spark.hadoop.hive.metastore.glue.catalogidプロパティを設定します。置換 AccountB -catalog-id でデータカタログの ID を使用しますAccountB

    aws emr-serverless start-job-run \ --application-id "application-id" \ --execution-role-arn "job-role-arn" \ --job-driver '{ "sparkSubmit": { "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": { "spark.hadoop.hive.metastore.glue.catalogid": "AccountB-catalog-id" } }] }'
    Hive

    次の例に示すように、 hive.metastore.glue.catalogidプロパティをhive-site分類に設定します。置換 AccountB -catalog-id でデータカタログの ID を使用しますAccountB

    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 データカタログを使用する際の考慮事項

Hive スクリプトADD JARで JARs に補助を追加できます。その他の考慮事項については、AWS 「Glue Data Catalog を使用する際の考慮事項」を参照してください。

外部 Hive メタストアの使用

EMR Serverless Spark ジョブと Hive ジョブを設定して、Amazon Aurora や Amazon RDS for My などの外部 Hive メタストアに接続できますSQL。このセクションでは、Amazon RDS Hive メタストアをセットアップし、 を設定しVPC、外部メタストアを使用するように EMR Serverless ジョブを設定する方法について説明します。

外部 Hive メタストアを作成する

  1. の手順に従って、プライベートサブネットを使用して Amazon Virtual Private Cloud (Amazon VPC) を作成しますVPC

  2. 新しい Amazon サブネットVPCとプライベートサブネットを使用して EMR Serverless アプリケーションを作成します。EMR Serverless アプリケーションを で設定するとVPC、最初に指定したサブネットごとにElastic Network Interface がプロビジョニングされます。次に、指定されたセキュリティグループをそのネットワークインターフェイスにアタッチします。これにより、アプリケーションにアクセスコントロールが付与されます。のセットアップ方法の詳細についてはVPC、「」を参照してくださいVPC アクセスの設定

  3. Amazon のプライベートサブネットに MySQL または Aurora PostgreSQL データベースを作成しますVPC。Amazon RDS データベースの作成方法については、「Amazon RDS DB インスタンスの作成」を参照してください。

  4. Amazon RDS DB インスタンスの変更 の手順に従って、MySQL または Aurora データベースのセキュリティグループを変更して、EMRサーバーレスセキュリティグループからのJDBC接続を許可します。EMR Serverless RDS セキュリティグループの 1 つからセキュリティグループへのインバウンドトラフィックのルールを追加します。

    タイプ プロトコル ポート範囲 ソース

    すべて TCP

    TCP

    3306

    emr-serverless-security-group

Spark オプションの設定

の使用 JDBC

Amazon RDS for MySQL または Amazon Aurora MySQL インスタンスに基づいて Hive メタストアに接続するように EMR Serverless Spark アプリケーションを設定するには、JDBC接続を使用します。ジョブ実行のspark-submitパラメータ--jarsmariadb-connector-java.jarを渡します。

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/spark-jdbc.py", "sparkSubmitParameters": "--jars s3://amzn-s3-demo-bucket/mariadb-connector-java.jar --conf spark.hadoop.javax.jdo.option.ConnectionDriverName=org.mariadb.jdbc.Driver --conf spark.hadoop.javax.jdo.option.ConnectionUserName=<connection-user-name> --conf spark.hadoop.javax.jdo.option.ConnectionPassword=<connection-password> --conf spark.hadoop.javax.jdo.option.ConnectionURL=<JDBC-Connection-string> --conf spark.driver.cores=2 --conf spark.executor.memory=10G --conf spark.driver.memory=6G --conf spark.executor.cores=4" } }' \ --configuration-overrides '{ "monitoringConfiguration": { "s3MonitoringConfiguration": { "logUri": "s3://amzn-s3-demo-bucket/spark/logs/" } } }'

次のコード例は、Amazon の Hive メタストアとやり取りする Spark エントリポイントスクリプトですRDS。

from os.path import expanduser, join, abspath from pyspark.sql import SparkSession from pyspark.sql import Row # warehouse_location points to the default location for managed databases and tables warehouse_location = abspath('spark-warehouse') spark = SparkSession \ .builder \ .config("spark.sql.warehouse.dir", warehouse_location) \ .enableHiveSupport() \ .getOrCreate() spark.sql("SHOW DATABASES").show() spark.sql("CREATE EXTERNAL TABLE `sampledb`.`sparknyctaxi`(`dispatching_base_num` string, `pickup_datetime` string, `dropoff_datetime` string, `pulocationid` bigint, `dolocationid` bigint, `sr_flag` bigint) STORED AS PARQUET LOCATION 's3://<s3 prefix>/nyctaxi_parquet/'") spark.sql("SELECT count(*) FROM sampledb.sparknyctaxi").show() spark.stop()

thrift サービスの使用

Amazon RDS for MySQL または Amazon Aurora MySQL インスタンスに基づいて Hive メタストアに接続するように EMR Serverless Hive アプリケーションを設定できます。これを行うには、既存の Amazon EMRクラスターのマスターノードで thrift サーバーを実行します。このオプションは、EMRサーバーレスジョブ設定を簡素化するために使用するスリフトサーバーを備えた Amazon EMRクラスターが既にある場合に最適です。

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/thriftscript.py", "sparkSubmitParameters": "--jars s3://amzn-s3-demo-bucket/mariadb-connector-java.jar --conf spark.driver.cores=2 --conf spark.executor.memory=10G --conf spark.driver.memory=6G --conf spark.executor.cores=4" } }' \ --configuration-overrides '{ "monitoringConfiguration": { "s3MonitoringConfiguration": { "logUri": "s3://amzn-s3-demo-bucket/spark/logs/" } } }'

次のコード例は、ドリフトプロトコルを使用して Hive メタストアに接続するエントリポイントスクリプト (thriftscript.py) です。hive.metastore.uris プロパティは、外部 Hive メタストアから読み取るように設定する必要があります。

from os.path import expanduser, join, abspath from pyspark.sql import SparkSession from pyspark.sql import Row # warehouse_location points to the default location for managed databases and tables warehouse_location = abspath('spark-warehouse') spark = SparkSession \ .builder \ .config("spark.sql.warehouse.dir", warehouse_location) \ .config("hive.metastore.uris","thrift://thrift-server-host:thift-server-port") \ .enableHiveSupport() \ .getOrCreate() spark.sql("SHOW DATABASES").show() spark.sql("CREATE EXTERNAL TABLE sampledb.`sparknyctaxi`( `dispatching_base_num` string, `pickup_datetime` string, `dropoff_datetime` string, `pulocationid` bigint, `dolocationid` bigint, `sr_flag` bigint) STORED AS PARQUET LOCATION 's3://<s3 prefix>/nyctaxi_parquet/'") spark.sql("SELECT * FROM sampledb.sparknyctaxi").show() spark.stop()

Hive オプションを設定する

の使用 JDBC

Amazon RDS MySQL インスタンスまたは Amazon Aurora インスタンスのいずれかで外部 Hive データベースの場所を指定する場合は、デフォルトのメタストア設定を上書きできます。

注記

Hive では、メタストアテーブルへの複数の書き込みを同時に実行できます。2 つのジョブ間でメタストア情報を共有する場合は、同じメタストアテーブルの異なるパーティションに書き込まない限り、同じメタストアテーブルに同時に書き込まないようにしてください。

hive-site 分類で次の設定を設定して、外部 Hive メタストアをアクティブ化します。

{ "classification": "hive-site", "properties": { "hive.metastore.client.factory.class": "org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClientFactory", "javax.jdo.option.ConnectionDriverName": "org.mariadb.jdbc.Driver", "javax.jdo.option.ConnectionURL": "jdbc:mysql://db-host:db-port/db-name", "javax.jdo.option.ConnectionUserName": "username", "javax.jdo.option.ConnectionPassword": "password" } }

スリフトサーバーの使用

Amazon RDS for MySQL または Amazon Aurora M に基づいて Hive メタストアに接続するように EMR Serverless Hive アプリケーションを設定できますySQLinstance。これを行うには、既存の Amazon EMRクラスターのメインノードで thrift サーバーを実行します。このオプションは、スリフトサーバーを実行する Amazon EMRクラスターが既にあり、EMRサーバーレスジョブ設定を使用する場合に最適です。

EMR Serverless がリモートスリフトメタストアにアクセスできるように、hive-site分類で次の設定を設定します。外部 Hive メタストアから読み取るように hive.metastore.urisプロパティを設定する必要があります。

{ "classification": "hive-site", "properties": { "hive.metastore.client.factory.class": "org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClientFactory", "hive.metastore.uris": "thrift://thrift-server-host:thirft-server-port" } }

外部メタストアを使用する場合の考慮事項

  • MariaDB と互換性のあるデータベースをメタストアJDBCとして設定できます。これらのデータベースの例は、MariaDB 、My SQL、Amazon Aurora RDS用です。

  • メタストアは自動初期化されません。メタストアが Hive バージョンのスキーマで初期化されていない場合は、Hive スキーマツール を使用します。

  • EMR Serverless は Kerberos 認証をサポートしていません。EMR Serverless Spark ジョブまたは Hive ジョブでは、Kerberos 認証で thrift メタストアサーバーを使用することはできません。