

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

# 執行 EMR Serverless 任務時使用 Hive 組態
<a name="jobs-hive"></a>

您可以在 `type` 參數設定為 的應用程式上執行 Hive 任務`HIVE`。任務必須與與 Amazon EMR 發行版本相容的 Hive 版本相容。例如，當您在具有 Amazon EMR 6.6.0 版的應用程式上執行任務時，您的任務必須與 Apache Hive 3.1.2 相容。如需每個版本的應用程式版本資訊，請參閱 [Amazon EMR Serverless 發行版本](release-versions.md)。

## Hive 任務參數
<a name="hive-params"></a>

當您使用 [`StartJobRun` API](https://docs.aws.amazon.com/emr-serverless/latest/APIReference/API_StartJobRun.html) 執行 Hive 任務時，請指定下列參數。

**Topics**
+ [Hive 任務執行時間角色](#hive-defaults-executionRoleArn)
+ [Hive 任務驅動程式參數](#hive-defaults-jobDriver)
+ [Hive 組態覆寫參數](#hive-defaults-configurationOverrides)

### Hive 任務執行時間角色
<a name="hive-defaults-executionRoleArn"></a>

使用 **`executionRoleArn`**為應用程式用來執行 Hive 任務的 IAM 角色指定 ARN。此角色必須包含下列許可：
+ 從資料所在的 S3 儲存貯體或其他資料來源讀取
+ 從 Hive 查詢檔案和 init 查詢檔案所在的 S3 儲存貯體或字首讀取
+ 讀取和寫入 Hive Scratch 目錄和 Hive Metastore 倉儲目錄所在的 S3 儲存貯體
+ 寫入您要寫入最終輸出的 S3 儲存貯體
+ 將日誌寫入`S3MonitoringConfiguration`指定 的 S3 儲存貯體或字首
+ 如果您使用 KMS 金鑰來加密 S3 儲存貯體中的資料，則存取 KMS 金鑰
+ 存取 AWS Glue Data Catalog

如果您的 Hive 任務讀取資料或從其他資料來源寫入資料，請在此 IAM 角色中指定適當的許可。如果您未將這些許可提供給 IAM 角色，您的任務可能會失敗。如需詳細資訊，請參閱 [Amazon EMR Serverless 的任務執行期角色](security-iam-runtime-role.md)。

### Hive 任務驅動程式參數
<a name="hive-defaults-jobDriver"></a>

使用 **`jobDriver`**為任務提供輸入。任務驅動程式參數只接受您要執行之任務類型的一個值。當您將 指定`hive`為任務類型時，EMR Serverless 會將 Hive 查詢傳遞給 `jobDriver` 參數。Hive 任務具有下列參數：
+ **`query`** – 這是 Amazon S3 中您要執行之 Hive 查詢檔案的參考。
+ **`parameters`** – 這些是您要覆寫的其他 Hive 組態屬性。若要覆寫屬性，請將它們以 的形式傳遞至此參數`--hiveconf property=value`。若要覆寫變數，請將它們以 的形式傳遞至此參數`--hivevar key=value`。
+ **`initQueryFile`** – 這是 init Hive 查詢檔案。Hive 會在查詢之前執行此檔案，並使用它來初始化資料表。

### Hive 組態覆寫參數
<a name="hive-defaults-configurationOverrides"></a>

使用 **`configurationOverrides`**覆寫監控層級和應用程式層級組態屬性。此參數接受具有下列兩個欄位的 JSON 物件：
+ **`monitoringConfiguration`** – 使用此欄位指定您希望 EMR Serverless 任務存放 Hive 任務日誌的 Amazon S3 URL (`s3MonitoringConfiguration`)。請確定您建立此儲存貯體的方式 AWS 帳戶 與託管您應用程式的儲存貯體相同，且與您執行任務 AWS 區域 的儲存貯體相同。
+ **`applicationConfiguration`** – 您可以在此欄位中提供組態物件，以覆寫應用程式的預設組態。可以使用速記語法，以提供組態或參考 JSON 檔案中物件的組態。組態物件是由分類、屬性和選用的巢狀組態所組成。屬性由您想要在檔案中覆寫的設定組成。您可以在單一 JSON 物件中，為多個應用程式指定多個分類。
**注意**  
可用的組態分類會因特定 EMR Serverless 版本而有所不同。例如，自訂 Log4j `spark-driver-log4j2`和 的分類`spark-executor-log4j2`僅適用於 6.8.0 版和更新版本。

如果您在應用程式覆寫和 Hive 參數中傳遞相同的組態，Hive 參數會優先。下列清單會將組態從最高優先順序排名為最低優先順序。
+ 您使用 作為 Hive 參數一部分提供的組態`--hiveconf property=value`。
+ 當您啟動任務時，您作為應用程式一部分提供的組態會覆寫 。
+ 您在建立應用程式`runtimeConfiguration`時作為 的一部分提供的組態。
+ Amazon EMR 為發行版本指派的最佳化組態。
+ 應用程式的預設開放原始碼組態。

如需在應用程式層級宣告組態，以及在任務執行期間覆寫組態的詳細資訊，請參閱 [EMR Serverless 的預設應用程式組態](default-configs.md)。

## Hive 任務屬性
<a name="hive-defaults"></a>

下表列出當您提交 Hive 任務時所設定的強制性屬性。


**強制性 Hive 任務屬性**  

| 設定 | Description | 
| --- | --- | 
| hive.exec.scratchdir | EMR Serverless 在 Hive 任務執行期間建立暫存檔案的 Amazon S3 位置。 | 
| hive.metastore.warehouse.dir | Hive 中受管資料表資料庫的 Amazon S3 位置。 | 

下表列出您可以在提交 Hive 任務時覆寫的選用 Hive 屬性及其預設值。


**選用 Hive 屬性和預設值**  

| 設定 | Description | 預設值 | 
| --- | --- | --- | 
| fs.s3.customAWSCredentialsProvider | 您要使用的 AWS 登入資料提供者。 | com.amazonaws.auth.DefaultAWSCredentialsProviderChain | 
| fs.s3a.aws.credentials.provider | 您要搭配 S3A 檔案系統使用的 AWS 登入資料提供者。 | com.amazonaws.auth.DefaultAWSCredentialsProviderChain | 
| hive.auto.convert.join | 根據輸入檔案大小，開啟常見聯結自動轉換至 mapjoins 的選項。 | TRUE | 
| hive.auto.convert.join.noconditionaltask | 當 Hive 根據輸入檔案大小將常見聯結轉換為映射聯結時開啟最佳化的選項。 | TRUE | 
| hive.auto.convert.join.noconditionaltask.size | 聯結會直接轉換為低於此大小的映射聯結。 | 最佳值是根據 Tez 任務記憶體計算 | 
| hive.cbo.enable | 使用 Calcite 架構開啟成本型最佳化的選項。 | TRUE | 
| hive.cli.tez.session.async | 在 Hive 查詢編譯時啟動背景 Tez 工作階段的選項。設定為 時false，Tez AM 會在 Hive 查詢編譯之後啟動。 | TRUE | 
| hive.compute.query.using.stats | 啟用 Hive 以使用中繼存放區中存放的統計資料回答特定查詢的選項。對於基本統計資料，將 hive.stats.autogather設定為 TRUE。如需更進階的查詢集合，請執行 analyze table queries。 | TRUE | 
| hive.default.fileformat | CREATE TABLE 陳述式的預設檔案格式。如果您在CREATE TABLE命令STORED AS [FORMAT]中指定 ，您可以明確覆寫此項目。 | TEXTFILE | 
| hive.driver.cores | 用於 Hive 驅動程式程序的核心數量。 | 2 | 
| hive.driver.disk | Hive 驅動程式的磁碟大小。 | 20G | 
| hive.driver.disk.type | Hive 驅動程式的磁碟類型。 | 標準 | 
| hive.tez.disk.type | Tez 工作者的磁碟大小。 | 標準 | 
| hive.driver.memory | 每個 Hive 驅動程式程序要使用的記憶體量。Hive CLI 和 Tez Application Master 與 20% 的前端空間平均共用此記憶體。 | 6G | 
| hive.emr-serverless.launch.env.[KEY] | 在所有 Hive 特定程序中設定KEY環境變數的選項，例如 Hive 驅動程式、Tez AM 和 Tez 任務。 |  | 
| hive.exec.dynamic.partition | 在 DML/DDL 中開啟動態分割區的選項。 | TRUE | 
| hive.exec.dynamic.partition.mode | 指定您要使用嚴格模式或非嚴格模式的選項。在嚴格模式下，請指定至少一個靜態分割區，以防您不小心覆寫所有分割區。在非嚴格模式中，所有分割區都可以是動態的。 | strict | 
| hive.exec.max.dynamic.partitions | Hive 建立的動態分割區總數上限。 | 1000 | 
| hive.exec.max.dynamic.partitions.pernode | Hive 在每個映射器和縮減器節點中建立的動態分割區數目上限。 | 100 | 
| hive.exec.orc.split.strategy | 預期下列其中一個值：BI、 ETL或 HYBRID。這不是使用者層級組態。 BI 指定您想要花較少的時間在分割產生中，而不是查詢執行。 ETL 指定您想要花更多時間在分割產生中。 指定根據啟發式HYBRID選擇上述策略。 | HYBRID | 
| hive.exec.reducers.bytes.per.reducer | 每個縮減器的大小。預設值為 256 MB。如果輸入大小為 1G，任務會使用 4 個縮減器。 | 256000000 | 
| hive.exec.reducers.max | 減少程式的數量上限。 | 256 | 
| hive.exec.stagingdir | 存放 Hive 在資料表位置和 hive.exec.scratchdir 屬性中指定之暫存目錄位置內建立之暫存檔案的目錄名稱。 | .hive-staging | 
| hive.fetch.task.conversion | 預期下列其中一個值：NONE、 MINIMAL或 MORE。Hive 可以將選取的查詢轉換為單一FETCH任務。這可將延遲降至最低。 | MORE | 
| hive.groupby.position.alias | 讓 Hive 在GROUP BY陳述式中使用資料欄位置別名的選項。 | FALSE | 
| hive.input.format | 預設輸入格式。HiveInputFormat 如果您遇到 問題，請將 設定為 CombineHiveInputFormat。 | org.apache.hadoop.hive.ql.io.CombineHiveInputFormat | 
| hive.log.explain.output | 開啟 Hive 日誌中任何查詢延伸輸出說明的選項。 | FALSE | 
| hive.log.level | Hive 記錄層級。 | INFO | 
| hive.mapred.reduce.tasks.speculative.execution | 開啟縮減器推測啟動的選項。僅支援 Amazon EMR 6.10.x 及更低版本。 | TRUE | 
| hive.max-task-containers | 並行容器的數量上限。設定的映射器記憶體會乘以此值，以判斷可分割運算和任務先佔用量的可用記憶體。 | 1000 | 
| hive.merge.mapfiles | 在僅映射任務結束時，導致小型檔案合併的選項。 | TRUE | 
| hive.merge.size.per.task | 任務結束時合併檔案的大小。 | 256000000 | 
| hive.merge.tezfiles | 在 Tez DAG 結束時開啟小型檔案合併的選項。 | FALSE | 
| hive.metastore.client.factory.class | 產生實作IMetaStoreClient界面之物件的原廠類別名稱。 | com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory | 
| hive.metastore.glue.catalogid | 如果 AWS Glue Data Catalog 充當中繼存放區，但在與任務不同的 AWS 帳戶 中執行，則為任務執行 AWS 帳戶 所在 的 ID。 | NULL | 
| hive.metastore.uris | 中繼存放區用戶端用來連線至遠端中繼存放區的偏離 URI。 | NULL | 
| hive.optimize.ppd | 開啟述詞下推的選項。 | TRUE | 
| hive.optimize.ppd.storage | 開啟述詞下推至儲存處理常式的選項。 | TRUE | 
| hive.orderby.position.alias | 讓 Hive 在ORDER BY陳述式中使用資料欄位置別名的選項。 | TRUE | 
| hive.prewarm.enabled | 開啟 Tez 容器預熱的選項。 | FALSE | 
| hive.prewarm.numcontainers | 要為 Tez 預熱的容器數量。 | 10 | 
| hive.stats.autogather | 讓 Hive 在INSERT OVERWRITE命令期間自動收集基本統計資料的選項。 | TRUE | 
| hive.stats.fetch.column.stats | 關閉從中繼存放區擷取資料欄統計資料的選項。當資料欄數量很高時，擷取資料欄統計資料可能會很昂貴。 | FALSE | 
| hive.stats.gather.num.threads | partialscan 和 noscan分析命令用於分割資料表的執行緒數量。這僅適用於實作 的檔案格式 StatsProvidingRecordReader（例如 ORC)。 | 10 | 
| hive.strict.checks.cartesian.product | 開啟嚴格笛卡兒聯結檢查的選項。這些檢查不允許笛卡兒產品 （交叉聯結）。 | FALSE | 
| hive.strict.checks.type.safety | 開啟嚴格類型安全檢查並關閉 bigint 與 string和 比較的選項double。 | TRUE | 
| hive.support.quoted.identifiers | 預期值為 NONE或 COLUMN。 NONE 表示識別符中只有英數字元和底線字元有效。 COLUMN 表示資料欄名稱可包含任何字元。 | COLUMN | 
| hive.tez.auto.reducer.parallelism | 開啟 Tez 自動減少程式平行處理功能的選項。Hive 仍會估計資料大小並設定平行處理估計值。Tez 會取樣來源頂點的輸出大小，並視需要在執行時間調整預估值。 | TRUE | 
| hive.tez.container.size | 每個 Tez 任務程序要使用的記憶體量。 | 6144 | 
| hive.tez.cpu.vcores | 要用於每個 Tez 任務的核心數量。 | 2 | 
| hive.tez.disk.size | 每個任務容器的磁碟大小。 | 20G | 
| hive.tez.input.format | Tez AM 中分割產生的輸入格式。 | org.apache.hadoop.hive.ql.io.HiveInputFormat | 
| hive.tez.min.partition.factor | 當您開啟自動減少程式平行處理時，Tez 指定的減少程式下限。 | 0.25 | 
| hive.vectorized.execution.enabled | 開啟查詢執行的向量化模式的選項。 | TRUE | 
| hive.vectorized.execution.reduce.enabled | 開啟查詢執行縮減端之向量化模式的選項。 | TRUE | 
| javax.jdo.option.ConnectionDriverName | JDBC 中繼存放區的驅動程式類別名稱。 | org.apache.derby.jdbc.EmbeddedDriver | 
| javax.jdo.option.ConnectionPassword | 與中繼存放區資料庫相關聯的密碼。 | NULL | 
| javax.jdo.option.ConnectionURL | JDBC 中繼存放區的 JDBC 連線字串。 | jdbc:derby:;databaseName=metastore\$1db;create=true | 
| javax.jdo.option.ConnectionUserName | 與中繼存放區資料庫相關聯的使用者名稱。 | NULL | 
| mapreduce.input.fileinputformat.split.maxsize | 當您的輸入格式為 時，分割運算期間的分割大小上限org.apache.hadoop.hive.ql.io.CombineHiveInputFormat。值 0 表示沒有限制。 | 0 | 
| tez.am.dag.cleanup.on.completion | 當 DAG 完成時開啟隨機資料清除的選項。 | TRUE | 
| tez.am.emr-serverless.launch.env.[KEY] | 在 Tez AM 程序中設定KEY環境變數的選項。對於 Tez AM，此值會覆寫該hive.emr-serverless.launch.env.[KEY]值。 |  | 
| tez.am.log.level | EMR Serverless 傳遞至 Tez 應用程式主要的根記錄層級。 | INFO | 
| tez.am.sleep.time.before.exit.millis | EMR Serverless 應該在 AM 關閉請求後的這段時間之後推送 ATS 事件。 | 0 | 
| tez.am.speculation.enabled | 導致推測啟動較慢任務的選項。這有助於在部分任務因錯誤或慢速機器而執行速度較慢時減少任務延遲。僅支援 Amazon EMR 6.10.x 及更低版本。 | FALSE | 
| tez.am.task.max.failed.attempts | 在任務失敗之前，特定任務可能失敗的嘗試次數上限。此數字不會計入手動終止的嘗試次數。 | 3 | 
| tez.am.vertex.cleanup.height | 如果所有相依頂點都完成，Tez AM 會刪除頂點隨機播放資料的距離。當值為 0 時，此功能會關閉。Amazon EMR 6.8.0 版及更新版本支援此功能。 | 0 | 
| tez.client.asynchronous-stop | 讓 EMR Serverless 在 Hive 驅動程式結束之前推送 ATS 事件的選項。 | FALSE | 
| tez.grouping.max-size | 分組分割的大小上限 （以位元組為單位）。此限制可防止過大的分割。 | 1073741824 | 
| tez.grouping.min-size | 分組分割的大小下限 （以位元組為單位）。此限制可防止太多小分割。 | 16777216 | 
| tez.runtime.io.sort.mb | 當 Tez 排序輸出時，軟緩衝區的大小會排序。 | 最佳值是根據 Tez 任務記憶體計算 | 
| tez.runtime.unordered.output.buffer.size-mb | 如果 Tez 未直接寫入磁碟，要使用的緩衝區大小。 | 最佳值是根據 Tez 任務記憶體計算 | 
| tez.shuffle-vertex-manager.max-src-fraction | 在 EMR Serverless 排程目前頂點的所有任務之前 （在ScatterGather連線的情況下），必須完成的來源任務部分。在目前頂點上準備好排程的任務數量，會在 min-fraction和 之間線性擴展max-fraction。預設值為 或 tez.shuffle-vertex-manager.min-src-fraction，以較大者為準。 | 0.75 | 
| tez.shuffle-vertex-manager.min-src-fraction | 在 EMR Serverless 排程目前頂點的任務之前 （在ScatterGather連線的情況下），必須完成的來源任務部分。 | 0.25 | 
| tez.task.emr-serverless.launch.env.[KEY] | 在 Tez 任務程序中設定KEY環境變數的選項。對於 Tez 任務，此值會覆寫該hive.emr-serverless.launch.env.[KEY]值。 |  | 
| tez.task.log.level | EMR Serverless 傳遞給 Tez 任務的根記錄層級。 | INFO | 
| tez.yarn.ats.event.flush.timeout.millis | AM 在關閉之前應等待事件排清的時間上限。 | 300000 | 

## Hive 任務範例
<a name="hive-examples"></a>

下列程式碼範例示範如何使用 `StartJobRun` API 執行 Hive 查詢。

```
aws emr-serverless start-job-run \
    --application-id application-id \
    --execution-role-arn job-role-arn \
    --job-driver '{
        "hive": {
            "query": "s3://amzn-s3-demo-bucket/emr-serverless-hive/query/hive-query.ql",
            "parameters": "--hiveconf hive.log.explain.output=false"
        }
    }' \
    --configuration-overrides '{
        "applicationConfiguration": [{
            "classification": "hive-site",
            "properties": {
                "hive.exec.scratchdir": "s3://amzn-s3-demo-bucket/emr-serverless-hive/hive/scratch",
                "hive.metastore.warehouse.dir": "s3://amzn-s3-demo-bucket/emr-serverless-hive/hive/warehouse",
                "hive.driver.cores": "2",
                "hive.driver.memory": "4g",
                "hive.tez.container.size": "4096",
                "hive.tez.cpu.vcores": "1"
            }
        }]
    }'
```

您可以在 [EMR Serverless Samples](https://github.com/aws-samples/emr-serverless-samples/tree/main/examples/hive) GitHub 儲存庫中找到有關如何執行 Hive 任務的其他範例。