ablog

不器用で落着きのない技術者のメモ

Spark on EMR から Glue カタログにアクセスできない

事象

  • Spark on EMR で Glue カタログのデータベース名を表示しようとすると、"because no identity-based policy allows the glue:GetDatabase action" で AccessDeniedException が発生する。
$ pyspark
>>> from pyspark.sql import SparkSession
>>> spark = SparkSession.builder.           \
  appName("ExamplePySparkSubmitTask").  \
  config("spark.databricks.hive.metastore.glueCatalog.enabled", "true"). \
  enableHiveSupport(). \
  getOrCreate()
>>> spark.sql("show databases").show()

23/05/30 09:43:16 INFO HiveConf: Found configuration file file:/etc/spark/conf.dist/hive-site.xml
23/05/30 09:43:17 INFO AWSGlueClientFactory: Using region from ec2 metadata : us-east-1
23/05/30 09:43:18 WARN CredentialsLegacyConfigLocationProvider: Found the legacy config profiles file at [/home/hadoop/.aws/config]. Please move it to the latest default location [~/.aws/credentials].
23/05/30 09:43:18 ERROR AWSCatalogMetastoreClient: Unable to verify existence of default database:
com.amazonaws.services.glue.model.AccessDeniedException: User: arn:aws:sts::123456789012:assumed-role/AmazonEMR-InstanceProfile-20230526T163514/i-054ce60ab26593e63 is not authorized to perform: glue:GetDatabase on resource: arn:aws:glue:us-east-1:123456789012:catalog because no identity-based policy allows the glue:GetDatabase action (Service: AWSGlue; Status Code: 400; Error Code: AccessDeniedException; Request ID: 3510e93b-da89-4f17-93ff-43e53e6c68d1; Proxy: null)

原因

  • 必要な IAM 権限が付与されていないため。

解決策

  • EMR クラスター作成時に IAM ロール "EMR_EC2_DefaultRole" または IAM ポリシー "AmazonElasticMapReduceforEC2Role" を付与する。

2. 左側のナビゲーションペインの [EMR on EC2] で [クラスター] を選択し、[クラスターの作成] を選択します。
3. [アプリケーションバンドル] で [Spark] または [カスタム] を選択します。クラスターをカスタマイズする場合は、必ず Zeppelin または Spark をアプリケーションの 1 つとして選択してください。
4. [AWSGlue Data Catalog 設定] で [Spark テーブルメタデータに使用] チェックボックスをオンにします。

Spark SQL のメタストアとしての AWS Glue Data Catalog の使用 - Amazon EMR

参考

Amazon EMR リリース 5.8.0 以降では、AWS Glue Data Catalog をメタストアとして使用するように Spark SQL を設定できます。永続的なメタストア、またはさまざまなクラスター、サービス、アプリケーション、あるいは AWS アカウントで共有されるメタストアが必要である場合は、この設定をお勧めします。

(中略)

[AWSGlue Data Catalog 設定] で [Spark テーブルメタデータに使用] チェックボックスをオンにします。

(中略)

AWS Glue アクションに対するアクセス許可
Amazon EMR の デフォルトの EC2 インスタンスプロファイルを使用する場合、アクションは必要ありません。EMR_EC2_DefaultRole にアタッチされている AmazonElasticMapReduceforEC2Role 管理ポリシーでは、必要なすべての AWS Glue アクションが許可されます。

glue — AWS CLI 1.27.141 Command Reference