

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

# 用于 Ranger 与 Amazon EMR 集成的 Apache Spark 插件
<a name="emr-ranger-spark"></a>

亚马逊 EMR 集成了 EMR，为 SparkSQL 提供了精细 RecordServer 的访问控制。EMR RecordServer 是一个在启用 Apache Ranger 的集群上的所有节点上运行的特权进程。当 Spark 驱动程序或执行器运行 SparkSQL 语句时，所有元数据和数据请求都会通过。 RecordServer要了解有关 EMR 的更多信息 RecordServer，请参阅页面。[适用于 Apache Ranger 的 Amazon EMR 组件](emr-ranger-components.md)

**Topics**
+ [支持的功能](#emr-ranger-spark-supported-features)
+ [重新部署服务定义以使用 INSERT、ALTER 或 DDL 语句](#emr-ranger-spark-redeploy-service-definition)
+ [安装服务定义](#emr-ranger-spark-install-servicedef)
+ [创建 SparkSQL 策略](#emr-ranger-spark-create-sparksql)
+ [注意事项](#emr-ranger-spark-considerations)
+ [限制](#emr-ranger-spark-limitations)

## 支持的功能
<a name="emr-ranger-spark-supported-features"></a>


| SQL statement/Ranger 操作 | STATUS | 支持的 EMR 版本 | 
| --- | --- | --- | 
|  SELECT  |  支持  |  截至 5.32  | 
|  SHOW DATABASES  |  支持  |  截至 5.32  | 
|  SHOW COLUMNS  |  支持  |  截至 5.32  | 
|  SHOW TABLES  |  支持  |  截至 5.32  | 
|  SHOW TABLE PROPERTIES  |  支持  |  截至 5.32  | 
|  DESCRIBE TABLE  |  支持  |  截至 5.32  | 
|  INSERT OVERWRITE  |  支持  |  自 5.34 和 6.4 起  | 
| INSERT INTO | 支持 | 自 5.34 和 6.4 起 | 
|  ALTER TABLE  |  支持  |  截至 6.4  | 
|  CREATE TABLE  |  支持  |  自 5.35 和 6.7 起  | 
|  CREATE DATABASE  |  支持  |  自 5.35 和 6.7 起  | 
|  DROP TABLE  |  支持  |  自 5.35 和 6.7 起  | 
|  DROP DATABASE  |  支持  |  自 5.35 和 6.7 起  | 
|  DROP VIEW  |  支持  |  自 5.35 和 6.7 起  | 
|  CREATE VIEW  |  不支持  |    | 

使用 SparkSQL 时支持以下功能：
+ 对 Hive Metastore 中的表进行精细访问控制，并且可以在数据库、表和列级别创建策略。
+ Apache Ranger 策略可以包括对用户和组的授予策略和拒绝策略。
+ 审核事件已提交到 CloudWatch 日志。

## 重新部署服务定义以使用 INSERT、ALTER 或 DDL 语句
<a name="emr-ranger-spark-redeploy-service-definition"></a>

**注意**  
从 Amazon EMR 6.4 开始，您可以将 Spark SQL 与以下语句结合使用： INSERT INTO （插入）、INSERT OVERWRITE （插入覆盖）或更改 LTER TABLE （表格语句）。从 Amazon EMR 6.7 开始，您可以使用 Spark SQL 创建或删除数据库和表。如果您在部署了 Apache Spark 服务定义的 Apache Ranger 服务器上具有现有安装程序，请使用以下代码重新部署服务定义。  

```
# Get existing Spark service definition id calling Ranger REST API and JSON processor
curl --silent -f -u <admin_user_login>:<password_for_ranger_admin_user> \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-k 'https://*<RANGER SERVER ADDRESS>*:6182/service/public/v2/api/servicedef/name/amazon-emr-spark' | jq .id

# Download the latest Service definition
wget https://s3.amazonaws.com/elasticmapreduce/ranger/service-definitions/version-2.0/ranger-servicedef-amazon-emr-spark.json

# Update the service definition using the Ranger REST API
curl -u <admin_user_login>:<password_for_ranger_admin_user> -X PUT -d @ranger-servicedef-amazon-emr-spark.json \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-k 'https://*<RANGER SERVER ADDRESS>*:6182/service/public/v2/api/servicedef/<Spark service definition id from step 1>'
```

## 安装服务定义
<a name="emr-ranger-spark-install-servicedef"></a>

安装 EMR 的 Apache Spark 服务定义要求先安装 Ranger Admin 服务器。请参阅[设置 Ranger Admin 服务器，以便与 Amazon EMR 集成](emr-ranger-admin.md)。

按照以下步骤安装 Apache Spark 服务定义：

**步骤 1: SSH 进入 Apache Ranger Admin 服务器**

例如：

```
ssh ec2-user@ip-xxx-xxx-xxx-xxx.ec2.internal
```

**步骤 2: 下载服务定义和 Apache Ranger Admin 服务器插件**

在临时目录中，下载服务定义。此服务定义由 Ranger 2.x 版本支持。

```
mkdir /tmp/emr-spark-plugin/
cd /tmp/emr-spark-plugin/

wget https://s3.amazonaws.com/elasticmapreduce/ranger/service-definitions/version-2.0/ranger-spark-plugin-2.x.jar
wget https://s3.amazonaws.com/elasticmapreduce/ranger/service-definitions/version-2.0/ranger-servicedef-amazon-emr-spark.json
```

**步骤 3: 安装适用于 Amazon EMR 的 Apache Spark 插件**

```
export RANGER_HOME=.. # Replace this Ranger Admin's home directory eg /usr/lib/ranger/ranger-2.0.0-admin
mkdir $RANGER_HOME/ews/webapp/WEB-INF/classes/ranger-plugins/amazon-emr-spark
mv ranger-spark-plugin-2.x.jar $RANGER_HOME/ews/webapp/WEB-INF/classes/ranger-plugins/amazon-emr-spark
```

**步骤 4: 注册 Amazon EMR 的 Apache Spark 服务定义**

```
curl -u *<admin users login>*:*_<_**_password_ **_for_** _ranger admin user_**_>_* -X POST -d @ranger-servicedef-amazon-emr-spark.json \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-k 'https://*<RANGER SERVER ADDRESS>*:6182/service/public/v2/api/servicedef'
```

如果此命令成功运行，您会在 Ranger Admin UI 中看到一个名为“AMAZON-EMR-SPARK”的新服务，如下图所示（显示 Ranger 2.0 版）。

![\[在 Ranger Admin 中注册的“AMAZON-EMR-SPARK”。\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/images/ranger-amazon-emr-spark.png)


**步骤 5：创建 AMAZON-EMR-SPARK应用程序的实例**

**Service Name (服务名称)**（如果显示）：将使用的服务名称。建议的值为 **amazonemrspark**。请记下此服务名称，创建 EMR 安全配置时将要用到。

**Display Name (显示名称)：**要为此实例显示的名称。建议的值为 **amazonemrspark**。

**Common Name For Certificate (凭证的公用名称)**：凭证中的 CN 字段，用于从客户端插件连接到管理服务器。此值必须与为插件创建的 TLS 凭证中的 CN 字段匹配。

![\[Ranger Admin 创建服务。\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/images/ranger-create-service.png)


**注意**  
此插件的 TLS 凭证应该已在 Ranger Admin 服务器的信任库中注册。有关更多信息，请参阅[用于 Apache Ranger 与 Amazon EMR 集成的 TLS 证书](emr-ranger-admin-tls.md)。

## 创建 SparkSQL 策略
<a name="emr-ranger-spark-create-sparksql"></a>

创建新策略时，要填写的字段包括：

**Policy Name (策略名称)**：此策略的名称。

**Policy Label (策略标注)**：您可以在此策略上放置的标注。

**Database (数据库)**：应用此策略的数据库。通配符“\$1”表示所有数据库。

**Table（表）**：应用此策略的表。通配符“\$1”表示所有表。

**EMR Spark Column (EMR Spark 列)**：应用此策略的列。通配符“\$1”表示所有列。

**Description (描述)**：策略的描述。

![\[Ranger Admin 创建 SparkSQL 策略详细信息。\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/images/ranger-create-policy-details.png)


要指定用户和组，请在下方输入用户和组以授予权限。您还可以指定 **allow**（允许）条件和 **deny**（拒绝）条件的排除项。

![\[Ranger Admin SparkSQL 策略详细信息允许条件。\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/images/ranger-create-policy-allow-conditions.png)


指定允许和拒绝条件后，单击 **Save (保存)**。

## 注意事项
<a name="emr-ranger-spark-considerations"></a>

EMR 集群中的每个节点都必须能够通过端口 9083 连接到主节点。

## 限制
<a name="emr-ranger-spark-limitations"></a>

以下是当前针对 Apache Spark 插件的限制：
+ Record 服务器将始终连接到 Amazon EMR 集群上运行的 HMS。如果需要，将 HMS 配置为连接到远程模式。您不应该将配置值放在 Apache Spark Hive-site.xml 配置文件中。
+ 使用 EMR 无法读取在 CSV 或 Avro 上使用 Spark 数据源创建的表。 RecordServer使用 Hive 创建和写入数据，并使用 Record 读取。
+ 不支持 Delta Lake、Hudi 和 Iceberg 表。
+ 用户必须有权访问默认数据库。这是 Apache Spark 的要求。
+ Ranger Admin 服务器不支持自动完成。
+ Amazon EMR 的 SparkSQL 插件不支持行筛选器或数据掩码。
+ 将 ALTER TABLE 与 Spark SQL 结合使用时，分区位置必须是表位置的子目录。不支持将数据插入分区位置与表位置不同的分区中。