

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

# 解决将 Amazon EMR 与 Lake Formation 配合 AWS 使用时的常见问题
<a name="emr-troubleshoot-lf"></a>

 本部分向您介绍在将 Amazon EMR 与 AWS Lake Formation结合使用时对常见问题进行故障排查的过程。

## 不允许访问数据湖
<a name="emr-troubleshoot-lf-data-access"></a>

您必须明确选择在 Amazon EMR 集群上进行数据筛选，然后才能分析和处理数据湖中的数据。当数据访问失败时，您将在 Notebook 条目的输出中看到一条通用 `Access is not allowed` 消息。

要选择并允许在 Amazon EMR 上进行数据筛选，请参阅《AWS Lake Formation 开发人员指南》**中的[允许在 Amazon EMR 上进行数据筛选](https://docs.aws.amazon.com/lake-formation/latest/dg/getting-started-setup.html#emr-switch)以获取说明。

## 会话过期
<a name="emr-troubleshoot-lf-expiration"></a>

EMR Notebooks 和 Zeppelin 的会话超时由 Lake Formation 的 IAM 角色的 `Maximum CLI/API session duration` 设置控制。此设置的默认值为 1 小时。如果出现会话超时，在尝试返回 Spark SQL 命令时，您将在 Notebook 条目的输出中看到下列消息。

```
Error 401    HTTP ERROR: 401 Problem accessing /sessions/2/statements. 
Reason:  JWT token included in request failed validation. 
Powered by Jetty:// 9.3.24.v20180605   org.springframework.web.client.HttpClientErrorException: 401 JWT token included in request failed validation…
```

要验证您的会话，请刷新页面。系统将提示您使用 IdP 重新进行身份验证并将重定向回 Notebook。重新进行身份验证后，您可以继续运行查询。

## 用户在所请求表上没有权限
<a name="emr-troubleshoot-lf-no-permissisons"></a>

试图访问您没有访问权限的表时，在尝试运行 Spark SQL 命令时，您将在 Notebook 条目的输出中看到下列异常：

```
org.apache.spark.sql.AnalysisException: org.apache.hadoop.hive.ql.metadata.HiveException: Unable to fetch table table. 
Resource does not exist or requester is not authorized to access requested permissions. 
(Service: AWSGlue; Status Code: 400; Error Code: AccessDeniedException; Request ID: …
```

要访问该表，您必须通过在 Lake Formation 中更新与此表关联的权限，向用户授予访问权限。

## 查询与 Lake Formation 共享的跨账户数据
<a name="emr-troubleshoot-lf-cross-account"></a>

使用 Amazon EMR 从其他账户访问与您共享的数据时，某些 Spark 库会尝试调用 `Glue:GetUserDefinedFunctions` API 操作。由于 AWS RAM 托管权限的版本 1 和 2 不支持此操作，因此您会收到以下错误消息：

`"ERROR: User: arn:aws:sts::012345678901:assumed-role/my-spark-role/i-06ab8c2b59299508a is not authorized to perform: glue:GetUserDefinedFunctions on resource: arn:exampleCatalogResource because no resource-based policy allows the glue:GetUserDefinedFunctions action"`

要解决此错误，创建资源共享的数据湖管理员必须更新附加到资源共享的 AWS RAM 托管权限。托管权限的版本 3 AWS RAM 允许主体执行 `glue:GetUserDefinedFunctions` 操作。

如果您创建新的资源共享，Lake Formation 会默认应用最新版本的 AWS RAM 托管权限，您无需执行任何操作。要为现有资源共享启用跨账户数据访问权限，您需要将 AWS RAM 托管权限更新为版本 3。

您可以在中查看分配给与您共享的资源的 AWS RAM 权限 AWS RAM。版本 3 中包含以下权限：

```
Databases
  AWSRAMPermissionGlueDatabaseReadWriteForCatalog 
  AWSRAMPermissionGlueDatabaseReadWrite
    
Tables
  AWSRAMPermissionGlueTableReadWriteForCatalog
  AWSRAMPermissionGlueTableReadWriteForDatabase
    
AllTables
  AWSRAMPermissionGlueAllTablesReadWriteForCatalog
  AWSRAMPermissionGlueAllTablesReadWriteForDatabase
```

**更新现有资源共享的 AWS RAM 托管权限版本**  
您（数据湖管理员）可以按照*AWS RAM 用户指南*中的说明将[AWS RAM 托管权限更新到新版本](https://docs.aws.amazon.com/ram/latest/userguide/working-with-sharing-update-permissions.html)，也可以撤消资源类型的所有现有权限并重新授予这些权限。如果您撤消权限，则 AWS RAM 会删除与该 AWS RAM 资源类型关联的资源共享。重新授予权限时， AWS RAM 会创建新的资源共享，并附上最新版本的 AWS RAM 托管权限。

## 插入、创建和变更表
<a name="emr-troubleshoot-lf-unsupported"></a>

不支持插入、创建和变更受 Lake Formation 策略保护的数据库中的表。如果执行这些操作，在尝试运行 Spark SQL 命令时，您会在 Notebook 条目的输出中看到下列异常。

```
java.io.IOException: com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.model.AmazonS3Exception: 
            Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: …
```

有关更多信息，请参阅 [Amazon EMR 与集成的限制](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-lf-scope.html#emr-lf-limitations)。 AWS Lake Formation