sparkジョブをyarnクラスターに送信し、コマンドラインまたはjar内で、どのユーザーがジョブを「所有」するかを選択することは可能ですか?
Spark-submitは、ユーザーを含むスクリプトから起動されます。
PS:クラスターにKerberos構成(およびスクリプトのキータブ)がある場合でも可能ですか?
非kerberizedクラスターの場合:export HADOOP_USER_NAME=zorro
Sparkジョブを送信する前にトリックを実行します。
必ずunset HADOOP_USER_NAME
その後、シェルスクリプトの残りの部分(またはインタラクティブなシェルセッション)でデフォルトの資格情報に戻したい場合。
kerberized clusterの場合、他のジョブ/セッション(おそらくdefaultチケットに依存します)を破棄せずに別のアカウントになりすますクリーンな方法は何かでしょうこの行で...
export KRB5CCNAME=FILE:/tmp/krb5cc_$(id -u)_temp_$$
kinit -kt ~/.protectedDir/zorro.keytab [email protected]
spark-submit ...........
kdestroy
カーネル化されていないクラスターの場合、Spark conf as:
--conf spark.yarn.appMasterEnv.HADOOP_USER_NAME=<user_name>
ユーザーが存在する場合でも、spark submit with su $ my_user -c spark submit [...]
Kerberos keytabについてはよくわかりませんが、このユーザーでkinitを作成すれば、問題ないはずです。
パスワードが必要ないためにsuを使用できない場合は、次のスタックオーバーフローの回答をご覧ください: パスワードなしで別のユーザーとしてスクリプトを実行する方法
もう1つの(はるかに安全な)アプローチは、proxy authentication
を使用することです。基本的には、サービスアカウントを作成し、それを他のユーザーに偽装できるようにします。
$ spark-submit --help 2>&1 | grep proxy
--proxy-user NAME User to impersonate when submitting the application.
ケルバライズされた/保護されたクラスターを想定しています。
偽装する必要のあるすべてのユーザーのキータブを保存(および管理)する必要がないため、はるかに安全であると述べました。
偽装を有効にするには、Hadoop側で有効にして、どのアカウントがどのユーザーまたはグループおよびどのサーバーで偽装できるかを指示する必要があるいくつかの設定があります。 svc_spark_prd
サービスアカウント/ユーザーを作成したとしましょう。
hadoop.proxyuser.svc_spark_prd.hosts
-偽装されたSparkアプリケーションの送信を許可されているサーバーの完全修飾ドメイン名のリスト。*
は許可されていますが、どのホストにも推奨されていません。
また、hadoop.proxyuser.svc_spark_prd.users
またはhadoop.proxyuser.svc_spark_prd.groups
のいずれかを指定して、svc_spark_prd
が偽装できるユーザーまたはグループを一覧表示します。 *
は許可されていますが、どのユーザー/グループにも推奨されていません。
また、 プロキシ認証に関するドキュメント も確認してください。
Apache Livy たとえば、このアプローチを使用して、他のエンドユーザーに代わってSparkジョブを送信します。