EMR Serverless のメタストア設定
Hive メタストアは、スキーマ、パーティション名、データ型など、テーブルに関する構造情報を一元的に保存する場所です。EMR Serverless を使用すると、このテーブルメタデータをジョブにアクセスできるメタストアに保持できます。
Hive メタストアとして 2 つのオプションがあります。
-
AWS Glue データカタログ
-
外部の Apache Hive メタストア
メタストアとしての AWS Glue データカタログの使用
AWS Glue データカタログをメタストアとして使用するように Spark ジョブと Hive ジョブを設定できます。永続的なメタストア、またはさまざまなアプリケーション、サービス、あるいは AWS アカウントで共有されるメタストアが必要である場合は、この設定をお勧めします。データカタログの詳細については、「AWS Glue データカタログの作成」を参照してください。AWS Glue の料金については、「AWS Glue の価格
EMR Serverless ジョブは、アプリケーションと同じ AWS アカウントまたは別の AWS アカウントで AWS Glue データカタログを使用するように設定できます。
AWS Glue データカタログを設定する
データカタログを設定するには、使用する EMR Serverless アプリケーションのタイプを選択します。
EMR Serverless および AWS Glue データカタログのクロスアカウントアクセスを設定する
EMR Serverless のクロスアカウントアクセスを設定するには、まず次の AWS アカウントにサインインする必要があります。
-
AccountA
– EMR Serverless アプリケーションを作成している AWS アカウント。 -
AccountB
– EMR Serverless ジョブ実行でアクセスさせる AWS Glue データカタログを含む AWS アカウント。
-
AccountB
の管理者またはその他の承認された ID が、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"] } ] } -
IAM ポリシーを
AccountA
の EMR Serverless ジョブランタイムロールに追加して、ロールが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
に補助 JAR を追加できます。その他の考慮事項については、「AWS Glue Data Catalog を使用する場合の考慮事項」を参照してください。
外部の Hive メタストアの使用
EMR Serverless Spark ジョブと Hive ジョブを設定して、Amazon Aurora や Amazon RDS for MySQL などの外部 Hive メタストアに接続できます。このセクションでは、Amazon RDS Hive メタストアの設定方法、VPC の設定方法、外部メタストアを使用するように EMR Serverless ジョブを設定する方法について説明します。
外部の Hive メタストアを作成する
-
VPC を作成するの手順に従って、プライベートサブネットを使用して Amazon Virtual Private Cloud (Amazon VPC) を作成します。
-
新しい Amazon VPC とプライベートサブネットを使用して EMR Serverless アプリケーションを作成します。EMR Serverless アプリケーションを VPC で設定すると、最初に、指定したサブネットごとに Elastic Network Interface がプロビジョニングされます。次に、指定されたセキュリティグループをそのネットワークインターフェイスにアタッチします。これにより、アプリケーションへのアクセスコントロールが可能になります。VPC のセットアップ方法の詳細については、「データに接続するための EMR Serverless アプリケーションの VPC アクセスの設定」を参照してください。
-
Amazon VPC のプライベートサブネットに MySQL または Aurora PostgreSQL データベースを作成します。Amazon RDS データベースを作成する方法については、「Amazon RDS DB インスタンスの作成」を参照してください。
-
Amazon RDS DB インスタンスを変更するの手順に従って、MySQL または Aurora データベースのセキュリティグループを変更して、EMR Serverless セキュリティグループからの JDBC 接続を許可します。EMR Serverless セキュリティグループの 1 つから RDS セキュリティグループへのインバウンドトラフィックのルールを追加します。
タイプ プロトコル ポート範囲 ソース すべての 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 RDS の Hive メタストアとやり取りする Spark エントリポイントスクリプトです。
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 Serverless ジョブ設定を簡素化するために使用する thrift サーバーを備えた 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/" } } }'
次のコード例は、thrift プロトコルを使用して 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
" } }
thrift サーバーの使用
Amazon RDS for MySQL または Amazon Aurora MySQL インスタンスに基づいて Hive メタストアに接続するように EMR Serverless Hive アプリケーションを設定できます。これを行うには、既存の Amazon EMR クラスターのメインノードで thrift サーバーを実行します。このオプションは、thrift サーバーを実行する Amazon EMR クラスターが既にあり、EMR Serverless ジョブ設定を使用する場合に最適です。
EMR Serverless がリモート thrift メタストアにアクセスできるように、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 と互換性のあるデータベースをメタストアとして設定できます。これらのデータベースの例としては、RDS for MariaDB、MySQL、Amazon Aurora などがあります。
-
メタストアは自動初期化されません。メタストアが Hive バージョンのスキーマで初期化されていない場合は、Hive スキーマツール
を使用します。 -
EMR Serverless は Kerberos 認証をサポートしていません。EMR Serverless の Spark ジョブまたは Hive ジョブでは、Kerberos 認証で thrift メタストアサーバーを使用することはできません。