

# 修改 Athena 外部 Hive 元存储连接器
<a name="datastores-hive-reference-implementation"></a>

如果您有特殊要求，则可以修改外部 Hive 元存储的 Athena 连接器以供自己使用。Athena 为 GitHub.com（网址为 [https://github.com/awslabs/aws-athena-hive-metastore](https://github.com/awslabs/aws-athena-hive-metastore)）上的连接器提供参考实现。在大多数使用案例中，无需修改参考实施。但是，如有必要，您可以修改源代码并自行构建构件。

参考实施是一个具有以下模块的 [Apache Maven](https://maven.apache.org/) 项目：
+ `hms-service-api` – 包含 Lambda 函数和 Athena 服务客户端之间的 API 操作。这些 API 操作是在 `HiveMetaStoreService` 接口中定义的。由于这是一个服务合同，因此，您不应更改此模块中的任何内容。
+ `hms-lambda-handler` – 一组默认 Lambda 处理程序，用于处理所有 Hive 元数据仓 API 调用。类 `MetadataHandler` 是用于所有 API 调用的调度程序。您无需更改此程序包。
+ `hms-lambda-func` – 一个具有以下组件的示例 Lambda 函数。
  + `HiveMetaStoreLambdaFunc` – 一个扩展 `MetadataHandler` 的示例 Lambda 函数。
  + `ThriftHiveMetaStoreClient` – 一个与 Hive 元存储进行通信的 Thrift 客户端。此客户端是针对 Hive 2.3.0 编写的。如果您使用其他 Hive 版本，则可能需要更新此类以确保响应对象可兼容。
  + `ThriftHiveMetaStoreClientFactory` – 控制 Lambda 函数的行为。例如，您可以通过覆盖 `getHandlerProvider()` 方法来提供自己的一组处理程序提供程序。
  + `hms.properties` – 配置 Lambda 函数。在大多数情况下，只需更新以下两个属性。
    + `hive.metastore.uris` – 格式为 `thrift://<host_name>:9083` 的 Hive 元存储 URI。
    + `hive.metastore.response.spill.location`：当响应对象的大小超过给定阈值（例如 4 MB）时，用于存储响应对象的 Amazon S3 位置。阈值是在属性 `hive.metastore.response.spill.threshold` 中定义的。建议不要更改默认值。
**注意**  
这两个属性可以由 [Lambda 环境变量](https://docs.aws.amazon.com/lambda/latest/dg/env_variables.html) `HMS_URIS` 和 `SPILL_LOCATION` 覆盖。当您希望将 Lambda 函数用于不同的 Hive 元数据仓或溢出位置时，请使用这些变量而不是重新编译该函数的源代码。
+ `hms-lambda-layer` – 一个 Maven 程序集项目，用于将 `hms-service-api`、`hms-lambda-handler` 及其依赖关系放入一个 `.zip` 文件中。此 `.zip` 文件将注册为 Lambda 层以供多个 Lambda 函数使用。
+ `hms-lambda-rnp` – 记录来自 Lambda 函数的响应，然后将其用于重播响应。您可以使用此模型来模拟 Lambda 响应以进行测试。

## 自行构建构件
<a name="datastores-hive-reference-implementation-building-the-artifacts-yourself"></a>

修改源代码后，您可以自行构建构件并将其上载到 Amazon S3 位置。

在构建构件之前，请更新 `hms-lambda-func` 模块中 `hms.properties` 文件中的属性 `hive.metastore.uris` 和 `hive.metastore.response.spill.location`。

要构建构件，您必须已安装 Apache Maven 并运行命令 `mvn install`。这将在模块 `hms-lambda-layer` 中的名为 `target` 的输出文件夹中生成层 `.zip` 文件，并在模块 `hms-lambd-func` 中生成 Lambda 函数 `.jar` 文件。