翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
メタストア設定
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サーバーレスアプリケーションのタイプを選択します。
EMR Serverless および AWS Glue Data Catalog のクロスアカウントアクセスを設定する
EMR Serverless のクロスアカウントアクセスを設定するには、まず次の にサインインする必要があります AWS アカウント。
-
AccountA
– EMR Serverless アプリケーションを作成 AWS アカウント している 。 -
AccountB
– EMR Serverless ジョブを実行する AWS Glue データカタログ AWS アカウント を含む 。
-
の管理者またはその他の承認された 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"] } ] } -
ロールが の 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"] } ] } -
ジョブの実行を開始します。このステップは、
AccountA
の EMR Serverless アプリケーションタイプによって若干異なります。
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 メタストアを作成する
-
の手順に従って、プライベートサブネットを使用して Amazon Virtual Private Cloud (Amazon VPC) を作成しますVPC。
-
新しい Amazon サブネットVPCとプライベートサブネットを使用して EMR Serverless アプリケーションを作成します。EMR Serverless アプリケーションを で設定するとVPC、最初に指定したサブネットごとにElastic Network Interface がプロビジョニングされます。次に、指定されたセキュリティグループをそのネットワークインターフェイスにアタッチします。これにより、アプリケーションにアクセスコントロールが付与されます。のセットアップ方法の詳細についてはVPC、「」を参照してくださいVPC アクセスの設定。
-
Amazon のプライベートサブネットに MySQL または Aurora PostgreSQL データベースを作成しますVPC。Amazon RDS データベースの作成方法については、「Amazon RDS DB インスタンスの作成」を参照してください。
-
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
パラメータ--jars
に mariadb-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 メタストアサーバーを使用することはできません。