為經過 Kerberos 驗證的 HDFS 使用者和 SSH 連線設定 Amazon EMR 叢集 - Amazon EMR

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

為經過 Kerberos 驗證的 HDFS 使用者和 SSH 連線設定 Amazon EMR 叢集

Amazon EMR 會為叢集上執行的應用程式,建立 Kerberos 驗證的使用者用戶端 – 例如,hadoop 使用者、spark 使用者等。您也可以新增使用 Kerberos 驗證至叢集程序的使用者。已驗證的使用者接著可以使用其 Kerberos 登入資料連接到叢集並使用應用程式。對於要對叢集進行驗證的使用者,需要以下組態:

  • 叢集上必須存在符合 KDC 中 Kerberos 主體的 Linux 帳戶。Amazon EMR 在與 Active Directory 整合的架構中自動執行此操作。

  • 您必須在主節點上為每個使用者建立 HDFS 使用者目錄,並提供該目錄的使用者許可。

  • 您必須設定 SSH 服務,以便在主節點上啟用 GSSAPI。此外,使用者必須有啟用 GSSAPI 的 SSH 用戶端。

將 Linux 使用者和 Kerberos 主體新增至主節點

如果您不使用 Active Directory,您必須在叢集主節點上建立 Linux 帳戶,並將這些 Linux 使用者的主體新增到 KDC。其中包含主節點的 KDC 中的主體。除了使用者主體以外,主節點上執行的 KDC 需要本機主機的主體。

當您的架構包含 Active Directory 整合,系統會自動建立本機 KDC 上的 Linux 使用者和主體 (如果適用)。您可以略過此步驟。如需詳細資訊,請參閱 跨領域信任外部 KDC – 叢集 KDC 位於具有 Active Directory 跨領域信任的不同叢集上

重要

當主節點終止時,KDC 以及主體資料庫都會遺失,因為主節點使用暫時性儲存。如果建立 SSH 連線的使用者,建議您使用設定為高可用性的外部 KDC 來建立跨領域信任。或者,如果您使用 Linux 帳戶建立 SSH 連線的使用者,請使用引導操作和指令碼自動化帳戶建立程序,以便在您建立新叢集時重複使用。

在建立時或建立叢集後提交步驟到叢集,是新增使用者和 KDC 主體的最簡單方法。或者,您也可以使用 EC2 金鑰對連接至主節點,作為執行命令的預設 hadoop 使用者。如需詳細資訊,請參閱使用 SSH 連線至 Amazon EMR 叢集主節點

以下範例會將 bash 指令碼 configureCluster.sh 提交至已存在的叢集 (參考其叢集 ID)。指令碼會儲存至 Amazon S3。

aws emr add-steps --cluster-id <j-2AL4XXXXXX5T9> \ --steps Type=CUSTOM_JAR,Name=CustomJAR,ActionOnFailure=CONTINUE,\ Jar=s3://region.elasticmapreduce/libs/script-runner/script-runner.jar,\ Args=["s3://amzn-s3-demo-bucket/configureCluster.sh"]

以下範例示範 configureCluster.sh 指令碼的內容。指令碼也會處理建立 HDFS 使用者目錄並啟用 SSH 的 GSSAPI,這些程序將在以下章節中介紹。

#!/bin/bash #Add a principal to the KDC for the primary node, using the primary node's returned host name sudo kadmin.local -q "ktadd -k /etc/krb5.keytab host/`hostname -f`" #Declare an associative array of user names and passwords to add declare -A arr arr=([lijuan]=pwd1 [marymajor]=pwd2 [richardroe]=pwd3) for i in ${!arr[@]}; do #Assign plain language variables for clarity name=${i} password=${arr[${i}]} # Create a principal for each user in the primary node and require a new password on first logon sudo kadmin.local -q "addprinc -pw $password +needchange $name" #Add hdfs directory for each user hdfs dfs -mkdir /user/$name #Change owner of each user's hdfs directory to that user hdfs dfs -chown $name:$name /user/$name done # Enable GSSAPI authentication for SSH and restart SSH service sudo sed -i 's/^.*GSSAPIAuthentication.*$/GSSAPIAuthentication yes/' /etc/ssh/sshd_config sudo sed -i 's/^.*GSSAPICleanupCredentials.*$/GSSAPICleanupCredentials yes/' /etc/ssh/sshd_config sudo systemctl restart sshd

新增使用者 HDFS 目錄

若要讓您的使用者登入叢集以執行 Hadoop 作業,您必須為 Linux 帳戶新增 HDFS 使用者目錄,並授予每位使用者目錄的擁有權。

在建立時或建立叢集後提交步驟到叢集,是建立 HDFS 目錄的最簡單方法。或者,您也可以使用 EC2 金鑰對連接到主節點,作為執行命令的預設 hadoop 使用者。如需詳細資訊,請參閱使用 SSH 連線至 Amazon EMR 叢集主節點

以下範例會將 bash 指令碼 AddHDFSUsers.sh 提交至已存在的叢集 (參考其叢集 ID)。指令碼會儲存至 Amazon S3。

aws emr add-steps --cluster-id <j-2AL4XXXXXX5T9> \ --steps Type=CUSTOM_JAR,Name=CustomJAR,ActionOnFailure=CONTINUE,\ Jar=s3://region.elasticmapreduce/libs/script-runner/script-runner.jar,Args=["s3://amzn-s3-demo-bucket/AddHDFSUsers.sh"]

以下範例示範 AddHDFSUsers.sh 指令碼的內容。

#!/bin/bash # AddHDFSUsers.sh script # Initialize an array of user names from AD, or Linux users created manually on the cluster ADUSERS=("lijuan" "marymajor" "richardroe" "myusername") # For each user listed, create an HDFS user directory # and change ownership to the user for username in ${ADUSERS[@]}; do hdfs dfs -mkdir /user/$username hdfs dfs -chown $username:$username /user/$username done

為 SSH 啟用 GSSAPI

Kerberos 驗證的使用者若要使用 SSH 連接到主節點,SSH 服務必須已啟用 GSSAPI 身分驗證。若要啟用 GSSAPI,請從主節點命令列執行下列命令,或使用步驟將其作為指令碼來執行。重新設定 SSH 後,您必須重新啟動服務。

sudo sed -i 's/^.*GSSAPIAuthentication.*$/GSSAPIAuthentication yes/' /etc/ssh/sshd_config sudo sed -i 's/^.*GSSAPICleanupCredentials.*$/GSSAPICleanupCredentials yes/' /etc/ssh/sshd_config sudo systemctl restart sshd