

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

# 修改 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` – Lambda 函數擴展 `MetadataHandler` 的範例。
  + `ThriftHiveMetaStoreClient` – 與 Hive 中繼存放區通訊的 Thrift 用戶端。此用戶端是為 Hive 2.3.0 編寫的。如果您使用不同的 Hive 版本，可能需要更新這個類別，以確保回應物件是相容的。
  + `ThriftHiveMetaStoreClientFactory` – 控制 Lambda 函數的行為。例如，您可以透過覆寫 `getHandlerProvider()` 方法來提供自己的一組處理常式提供者。
  + `hms.properties` – 設定 Lambda 函數。大多數情況下只需要更新下列兩個屬性。
    + `hive.metastore.uris` – Hive 中繼存放區的 URI，格式為 `thrift://<host_name>:9083`。
    + `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` 覆寫。當您想要使用具有不同 Hive 中繼存放區或溢出位置的函數時，請使用這些變數，而不要重新編譯 Lambda 函數的來源程式碼。
+ `hms-lambda-layer` – 將 `hms-service-api`、`hms-lambda-handler` 和其依存項目放入 `.zip` 檔案中的 Maven 組合專案。`.zip` 檔案會註冊為 Lambda 層，以供多個 Lambda 函數使用。
+ `hms-lambda-rnp` – 記錄來自 Lambda 函數的回應，然後使用其重播回應。您可以使用此模型來模擬 Lambda 回應以進行測試。

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

修改原始程式碼之後，您可以自行建置成品，然後將它們上傳到 Amazon S3 位置。

在建置成品之前，請先更新 `hms-lambda-func` 模組中 `hive.metastore.response.spill.location` 檔案內的屬性 `hive.metastore.uris` 和 `hms.properties`。

要建置成品，您必須安裝 Apache Maven 並執行命令 `mvn install`。如此會在模組 `hms-lambda-layer` 中名為 `target` 的輸出資料夾中產生層 `.zip` 檔案，以及在 `hms-lambd-func` 模組中產生 Lambda 函數 `.jar` 檔案。