

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 用户模拟
<a name="emr-jupyterhub-user-impersonation"></a>

在 Amazon EMR 上执行期间，在 Jupyter notebook 中运行的 Spark 作业将访问多个应用程序。例如，Sparkmagic 接收到用户在 Jupyter 中运行的 PySpark 3 个代码，Sparkmagic 使用 HTTP POST 请求将其提交给 Livy，然后使用 YARN 创建一个 Spark 作业在集群上执行。

默认情况下，以这种方式提交的 YARN 作业以 `livy` 用户身份运行，而不管启动该作业的用户如何。通过设置*用户模拟*，您也可以将 Notebook 用户的用户 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-conf` 和 `core-site` 配置分类启用 Livy 用户模拟，如以下示例所示。将配置分类保存为 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
```