

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

# 使用者模擬
<a name="emr-jupyterhub-user-impersonation"></a>

在 Jupyter 筆記本內執行的 Spark 作業，會在其於 Amazon EMR 上執行期間周遊多個應用程式。例如，使用者在 Jupyter 內執行的 PySpark3 程式碼，將由 Sparkmagic 接收，此應用程式會使用 HTTP POST 要求將該程式碼提交到 Livy，再由其建立可在使用 YARN 的叢集上執行的 Spark 工作。

根據預設，以這種方式提交的 YARN 工作將會以使用者 `livy` 的身分執行，無論該工作當初是由哪位使用者啟動。設定*使用者模擬*之後，筆記本使用者的使用者 ID 也會成為與該 YARN 工作關聯的使用者。因此不需要讓 `shirley` 和 `diego` 起始的工作都與使用者 `livy` 建立關聯，因為由每位使用者所起始的工作，都已分別與 `shirley` 和 `diego` 互有關聯。這樣能幫助您稽核 Jupyter 用量，以及管理組織內的應用程式。

只有當從 Sparkmagic 發出的 Livy 呼叫是未經授權時，此組態才會受到支援。不支援為 Hadoop 應用程式和 Livy 之間提供身分驗證或代理層 (例如 Apache Knox Gateway) 的應用程式。本節中所述用於設定使用者模擬的步驟，則假設 JupyterHub 和 Livy 執行於相同主節點上。如果您的應用程式具有不同的叢集，則您必須修改 [步驟 3：建立 HDFS 使用者主目錄](#Step3-UserImpersonation)，以便在 Livy 主節點上建立該 HDFS 目錄。

**Topics**
+ [步驟 1：設定 Livy](#Step1-UserImpersonation)
+ [步驟 2：新增使用者](#Step2-UserImpersonation)
+ [步驟 3：建立 HDFS 使用者主目錄](#Step3-UserImpersonation)

## 步驟 1：設定 Livy
<a name="Step1-UserImpersonation"></a>

當您建立叢集來啟用 Livy 使用者模擬時，您就會用到 `livy-conf` 和 `core-site` 組態分類，如下面範例所示。將組態分類儲存為 JSON，然後在建立叢集時參考該檔案，或是指定內嵌的組態分類。如需詳細資訊，請參閱[設定應用程式](emr-configure-apps.md)。

```
[
  {
    "Classification": "livy-conf",
    "Properties": {
      "livy.impersonation.enabled": "true"
    }
  },
  {
    "Classification": "core-site",
    "Properties": {
      "hadoop.proxyuser.livy.groups": "*",
      "hadoop.proxyuser.livy.hosts": "*"
    }
  }
]
```

## 步驟 2：新增使用者
<a name="Step2-UserImpersonation"></a>

使用 PAM 或 LDAP 以新增 JupyterHub 使用者。如需詳細資訊，請參閱[使用 PAM 身分驗證](emr-jupyterhub-pam-users.md)及[使用 LDAP 身分驗證](emr-jupyterhub-ldap-users.md)。

## 步驟 3：建立 HDFS 使用者主目錄
<a name="Step3-UserImpersonation"></a>

您已連接到主節點，並可建立使用者。在持續與主節點連線情況下複製下面內容，並將其存成指令碼檔案。這個指令碼會為主節點上的每位 JupyterHub 使用者建立 HDFS 主目錄。這段指令碼會假設您使用預設的管理員使用者 ID *jovyan*。

```
#!/bin/bash

CURL="curl --silent -k"
HOST=$(curl -s http://169.254.169.254/latest/meta-data/local-hostname)

admin_token() {
    local user=jovyan
    local pwd=jupyter
    local token=$($CURL https://$HOST:9443/hub/api/authorizations/token \
        -d "{\"username\":\"$user\", \"password\":\"$pwd\"}" | jq ".token")
    if [[ $token != null ]]; then
        token=$(echo $token | sed 's/"//g')
    else
        echo "Unable to get Jupyter API Token."
        exit 1
    fi
    echo $token
}

# Get Jupyter Admin token
token=$(admin_token)

# Get list of Jupyter users
users=$(curl -XGET -s -k https://$HOST:9443/hub/api/users \
 -H "Authorization: token $token" | jq '.[].name' | sed 's/"//g')

# Create HDFS home dir 
for user in ${users[@]}; 
do
 echo "Create hdfs home dir for $user"
 hadoop fs -mkdir /user/$user
 hadoop fs -chmod 777 /user/$user
done
```