制限事項
Serverless Spark のエンジンバージョンは、次の要件を満たしている必要があります。
esr-4.x: esr-4.2.0 以降
esr-3.x: esr-3.0.1 以降
esr-2.x: esr-2.4.1 以降
注意事項
Ranger はサービス認証を担当します。 ID 認証を実装する場合は、OpenLDAP サービスを使用します。 詳細については、「Spark Thrift Server の LDAP 認証の設定」をご参照ください。
前提条件
Spark Thrift Server が作成されていること。 詳細については、「Spark Thrift Server の管理」をご参照ください。
手順
手順 1: ネットワーク接続の設定
指定された Ranger プラグインが Ranger Admin に接続して関連する権限が付与されるように、E-MapReduce (EMR) Serverless Spark と VPC (Virtual Private Cloud) 間のネットワーク接続を設定する必要があります。 詳細については、「VPC を介した EMR Serverless Spark とデータソース間のネットワーク接続の設定」をご参照ください。
手順 2: Ranger プラグインの設定
Spark Thrift Server の Ranger 認証を設定する前に、Spark Thrift Server を停止する必要があります。 その後、次の操作を実行して Spark Thrift Server を変更します。 [ネットワーク接続] ドロップダウンリストから作成済みの接続を選択し、使用する Ranger プラグインのタイプに基づいて、関連する設定項目を [Spark 設定] パラメーターに追加します。 Spark Thrift Server を変更した後、変更を有効にするために再起動する必要があります。
方法 1: 組み込みの Ranger プラグインを使用する
この方法は、バージョンが esr-3.1.0 以降の Spark Thrift Server でのみ使用できます。
spark.ranger.plugin.enabled true
spark.jars /opt/ranger/ranger-spark.jar
ranger.plugin.spark.policy.rest.url http://<ranger_admin_ip>:<ranger_admin_port>
<ranger_admin_ip>
と <ranger_admin_port>
は、Ranger Admin の内部 IP アドレスとポート番号を指定します。 ビジネス要件に基づいてパラメーターを設定します。 EMR on ECS クラスタにデプロイされている Ranger サービスに接続する場合は、<ranger_admin_ip>
パラメーターをマスターノードの内部 IP アドレスに設定し、<ranger_admin_port>
パラメーターを 6080 に設定します。
方法 2: カスタム Ranger プラグインを使用する
カスタム Ranger プラグインを使用する場合は、カスタム Ranger プラグインを Object Storage Service (OSS) にアップロードし、カスタム JAR パッケージとクラスの名前を指定できます。
spark.jars oss://<bucket>/path/to/user-ranger-spark.jar
spark.ranger.plugin.class <class_name>
spark.ranger.plugin.enabled true
ranger.plugin.spark.policy.rest.url http://<ranger_admin_ip>:<ranger_admin_port>
ビジネス要件に基づいて、次のパラメーターを設定します。
spark.jars
: カスタム JAR パッケージが格納されている OSS パス。spark.ranger.plugin.class
: カスタム Ranger プラグインの Spark 拡張クラスの名前。<ranger_admin_ip>
と<ranger_admin_port>
: Ranger Admin の内部 IP アドレスとポート番号。 EMR on ECS クラスタにデプロイされている Ranger サービスに接続する場合は、<ranger_admin_ip>
パラメーターをマスターノードの内部 IP アドレスに設定し、<ranger_admin_port>
パラメーターを 6080 に設定します。
(オプション) 手順 3: Ranger の監査機能の設定
Ranger では、Solr や Hadoop 分散ファイルシステム (HDFS) など、監査情報を格納するために使用するサービスを指定できます。 デフォルトでは、EMR Serverless Spark の Ranger の監査機能は無効になっています。 監査機能を有効にする場合は、関連する設定項目を [Spark 設定] パラメーターに追加できます。
EMR on ECS クラスタにデプロイされている Solr サービスに接続する場合は、次の設定項目を [Spark 設定] パラメーターに追加します。
xasecure.audit.is.enabled true
xasecure.audit.destination.solr true
xasecure.audit.destination.solr.urls http://<solr_ip>:<solr_port>/solr/ranger_audits
xasecure.audit.destination.solr.user <user>
xasecure.audit.destination.solr.password <password>
パラメーターの説明:
xasecure.audit.is.enabled
: Ranger の監査機能を有効にするかどうかを指定します。xasecure.audit.destination.solr
: 監査情報を Solr に格納するかどうかを指定します。xasecure.audit.destination.solr.urls
: Solr の URL。<solr_ip>
は Solr の IP アドレスを示し、<solr_port>
は Solr のポート番号を示します。 その他の URL 情報は、ビジネス要件に基づいて設定します。xasecure.audit.destination.solr.user
とxasecure.audit.destination.solr.password
: ユーザー名とパスワード。 これらのパラメーターは、Solr の基本認証を有効にする場合に必須です。EMR on ECS クラスタにデプロイされている Ranger サービスに接続する場合は、[Ranger-plugin] サービスページの [ranger-spark-audit.xml] タブで、
xasecure.audit.destination.solr.urls
、xasecure.audit.destination.solr.user
、およびxasecure.audit.destination.solr.password
設定項目の値を表示できます。
監査機能を設定した後に EMR Serverless Spark でジョブを送信すると、Ranger の Web UI にアクセスして、[アクセス] タブでユーザーアクセスの監査情報を表示できます。 Ranger の Web UI へのアクセス方法については、「EMR コンソールでオープンソースコンポーネントの Web UI にアクセスする」をご参照ください。
Ranger の Web UI で監査情報を表示できるのは、Solr を使用して監査情報を格納する場合のみです。
手順 4: 接続のテスト
Spark Beeline を使用して、データベースやテーブルなど、権限のないリソースにアクセスすると、次のエラーが発生します。
0: jdbc:hive2://pre-emr-spark-gateway-cn-hang> create table test(id int);
Error: org.apache.hive.service.cli.HiveSQLException: Error running query: org.apache.kyuubi.plugin.spark.authz.AccessControlException: Permission denied: user [test] does not have [create] privilege on [database=testdb/table=test]
at org.apache.spark.sql.hive.thriftserver.HiveThriftServerErrors$.runningQueryError(HiveThriftServerErrors.scala:44)
at org.apache.spark.sql.hive.thriftserver.SparkExecuteStatementOperation.org$apache$spark$sql$hive$thriftserver$SparkExecuteStatementOperation$$execute(SparkExecuteStatementOperation.scala:325)
at org.apache.spark.sql.hive.thriftserver.SparkExecuteStatementOperation$$anon$2$$anon$3.$anonfun$run$2(SparkExecuteStatementOperation.scala:230)
at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)
at org.apache.spark.sql.hive.thriftserver.SparkOperation.withLocalProperties(SparkOperation.scala:79)
at org.apache.spark.sql.hive.thriftserver.SparkOperation.withLocalProperties$(SparkOperation.scala:63)
at org.apache.spark.sql.hive.thriftserver.SparkExecuteStatementOperation.withLocalProperties(SparkExecuteStatementOperation.scala:43)
at org.apache.spark.sql.hive.thriftserver.SparkExecuteStatementOperation$$anon$2$$anon$3.run(SparkExecuteStatementOperation.scala:230)
at org.apache.spark.sql.hive.thriftserver.SparkExecuteStatementOperation$$anon$2$$anon$3.run(SparkExecuteStatementOperation.scala:225)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1730)
at org.apache.spark.sql.hive.thriftserver.SparkExecuteStatementOperation$$anon$2.run(SparkExecuteStatementOperation.scala:239)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:750)
権限を確認する場合は、Ranger でユーザーが持つデフォルトの権限に注意してください。 たとえば、すべてのユーザーはデータベースを切り替えたり作成したりする権限を持っており、データベースとテーブルの所有者は、データベースとテーブルに対するすべての権限を持っています。 データベースやテーブルなど、ユーザー A によって作成されたリソースに対するユーザー B の権限を確認することをお勧めします。 自分自身で作成したリソースに対するユーザーの権限を確認すると、特定の権限設定が有効にならない場合があります。 これは、リソースの所有者がリソースに対するすべての権限を持っているために発生します。
Ranger Admin が正しく設定されていない場合、SQL 文は正常に実行され、エラーは報告されません。 ただし、Ranger 認証は有効になりません。