設定 Hive 資料表以執行 Hive 命令 - Amazon EMR

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

設定 Hive 資料表以執行 Hive 命令

Apache Hive 是一種資料倉儲應用程式,可使用類似 SQL 的語言來查詢 Amazon EMR 叢集中包含的資料。如需關於 Hive 的詳細資訊,請參閱 http://hive.apache.org/

下列程序假設您已建立一個叢集並指定了一組 Amazon EC2 金鑰對。若要了解如何開始建立叢集,請參閱《Amazon EMR 管理指南》中的 Amazon EMR 入門

配置蜂巢使用 MapReduce

在 Amazon EMR 上使用 Hive 查詢 DynamoDB 資料表時,如果 Hive 使用預設執行引擎 Tez,可能會發生錯誤。因此,當您建立具有與 DynamoDB 整合的 Hive (如本節所述) 的叢集時,我們建議您使用將 Hive 設定為使用的組態分類。 MapReduce如需詳細資訊,請參閱 設定應用程式

下列程式碼片段顯示要用來設定 MapReduce 為 Hive 執行引擎的組態分類和屬性:

[ { "Classification": "hive-site", "Properties": { "hive.execution.engine": "mr" } } ]
以互動方式執行 Hive 命令
  1. 連接至主節點。如需詳細資訊,請參閱《Amazon EMR 管理指南》中的使用 SSH 連接至主節點

  2. 目前的主節點出現命令提示時,請輸入 hive

    請查看 Hive 提示:hive>

  3. 輸入 Hive 命令,將 Hive 應用程式中的資料表映射至 DynamoDB 中的資料。此資料表的用途等同於儲存在 Amazon DynamoDB 中的資料的參考;資料並非本機儲存在 Hive 內,而任何使用此資料表的查詢在執行時均會依據 DynamoDB 內的即時資料,每次執行命令時皆會耗用資料表的讀取或寫入容量。若希望對相同的資料集執行多個 Hive 命令,請考慮先將之匯出。

    將 Hive 資料表映射至 DynamoDB 資料表的語法如下所示。

    CREATE EXTERNAL TABLE hive_tablename (hive_column1_name column1_datatype, hive_column2_name column2_datatype...) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodb_tablename", "dynamodb.column.mapping" = "hive_column1_name:dynamodb_attribute1_name,hive_column2_name:dynamodb_attribute2_name...");

    在 DynamoDB 的 Hive 內建立資料表時,請務必使用關鍵字 EXTERNAL 將其建立為外部資料表。外部資料表與內部資料表的差異在於,捨棄內部資料表時,內部資料表內的資料會隨之刪除。在連結至 Amazon DynamoDB 時,不會希望出現此種行為,因此僅支援外部資料表。

    例如,下列 Hive 命令會在 Hive 內建立一個名為 hivetable1 的資料表,其所參考的是名為 dynamodbtable1 的 DynamoDB 資料表。DynamoDB 表格動態表格 1 具有主索引鍵結構描述。 hash-and-range 雜湊金鑰元素為 name (字串類型),範圍金鑰元素為 year (數字類型),而各項均有 holidays 的屬性值 (字串集類型)。

    CREATE EXTERNAL TABLE hivetable1 (col1 string, col2 bigint, col3 array<string>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable1", "dynamodb.column.mapping" = "col1:name,col2:year,col3:holidays");

    行 1 使用了 HiveQL CREATE EXTERNAL TABLE 陳述式。對於 hivetable1,您需要在 DynamoDB 資料表內為每個屬性名稱/值對建立資料欄,並提供資料類型。這些值並不區分大小寫,且可自由選擇欄位名稱 (保留字除外)。

    行 2 使用了 STORED BY 陳述式。STORED BY 的值為負責處理 Hive 與 DynamoDB 之間連線的類別名稱,應設為 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'

    行 3 則是使用 TBLPROPERTIES 陳述式,可將 "hivetable1" 與 DynamoDB 內的正確資料表和結構描述關聯。請將 TBLPROPERTIES 參數和 dynamodb.table.name 參數的值提供給 dynamodb.column.mapping。這些值區分大小寫。

    注意

    資料表的所有 DynamoDB 屬性名稱都必須在 Hive 資料表中具有對應的資料欄。視您的 Amazon EMR 版本而定,如果 one-to-one 對應不存在,會發生下列情況:

    • 在 Amazon EMR 5.27.0 版及更新版本上,連接器具有驗證功能,可確保 Hive 表格中 DynamoDB 屬性名稱和資料行之間的 one-to-one 對應。如果 one-to-one 對應不存在,則會發生錯誤。

    • 在 Amazon EMR 5.26.0 版及較早版本上,Hive 資料表不會包含來自 DynamoDB 的名稱值對。如果未映射 DynamoDB 的主索引鍵屬性,Hive 會發生錯誤。若並未映射非主要的金鑰屬性,就不會產生錯誤,但也無法在 Hive 資料表內看見資料。若資料類型不符合,值會為 null。

接著,您就能開始在 hivetable1 上執行 Hive 操作。針對 hivetable1 執行的查詢會於內部根據您 DynamoDB 帳戶的 DynamoDB 資料表 dynamodbtable1 執行,每次執行都會耗用讀取或寫入的單位。

在針對 DynamoDB 資料表執行 Hive 查詢時,需要確保已先佈建好充足的讀取容量單位。

例如,假設您已為 DynamoDB 資料表佈建 100 單位的讀取容量。這會讓您每秒執行 100 次讀取或是 409,600 位元組。若資料表含有 20 GB 的資料 (21,474,836,480 位元組),而您的 Hive 查詢要執行一次完整的資料表掃描,就可以估算查詢所需的執行時間:

「21,474,836,480 / 409,600 = 52,429 秒 = 14.56 小時」

減少所需時間的唯一方法,便是調整來源 DynamoDB 資料表的讀取容量單位。增加更多 Amazon EMR 節點並無效果。

在 Hive 輸出中,當一或多個映射器程序結束後,即會更新完成的百分比。若為大型 DynamoDB 資料表,而採用低佈建讀取容量設定,則輸出完成的百分比可能在相當長一段時間內不會更新;在上述情況下,任務會有好幾個小時皆顯示為 0% 完成。如需作業進度詳細的狀態資訊,請移至 Amazon EMR 主控台,即可檢視個別映射器的作業狀態,以及資料讀取的統計數據。您也可在主節點上登入 Hadoop 界面並查看 Hadoop 的統計數據。其會顯示個別的映射任務狀態,以及一切資料讀取的統計數據。如需詳細資訊,請參閱下列主題:

如需有關 HiveQL 陳述式範例的詳細資訊,以了解從 DynamoDB 匯出或匯入資料和聯結資料表等任務的執行方法,請參閱 在 DynamoDB 中匯出、匯入和查詢資料的 Hive 命令範例

取消 Hive 請求

執行 Hive 查詢時,來自伺服器的初始回應會含有取消請求的命令。若要在程序的任一時間點取消請求,請在伺服器回應內使用 Kill Command (Kill 命令)

  1. 輸入 Ctrl+C 離開命令列用戶端。

  2. 出現 Shell 提示時,您必須在請求的初始伺服器回應中輸入 Kill Command (Kill 命令)

    或者,您也可以在主節點的命令列中執行下列命令,以終止 Hadoop 任務。Hadoop 任務的識別碼為 job-id,其可擷取自 Hadoop 使用者界面。

    hadoop job -kill job-id

Hive 與 DynamoDB 的資料類型

下表顯示可用的 Hive 資料類型、其對應至的預設 DynamoDB 類型,以及它們也可以映射至的替代 DynamoDB 類型。

Hive 類型 預設 DynamoDB 類型 替代 DynamoDB 類型
string

string (S)

bigint 或 double

number (N)

binary

binary (B)

boolean

boolean (BOOL)

陣列 list (L)

number set (NS)、string set (SS) 或 binary set (BS)

map<string,string> 項目

map (M)

map<string,?> map (M)
null (NULL)

如果您希望將 Hive 資料寫入為對應的替代 DynamoDB 類型,或如果您的 DynamoDB 資料包含替代 DynamoDB 類型的屬性值,則您可以使用 dynamodb.type.mapping 參數指定資料欄和 DynamoDB 類型。下列範例顯示指定替代類型映射的語法。

CREATE EXTERNAL TABLE hive_tablename (hive_column1_name column1_datatype, hive_column2_name column2_datatype...) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodb_tablename", "dynamodb.column.mapping" = "hive_column1_name:dynamodb_attribute1_name,hive_column2_name:dynamodb_attribute2_name...", "dynamodb.type.mapping" = "hive_column1_name:dynamodb_attribute1_datatype");

類型映射參數是選用的,而且只需要針對使用替代類型的資料欄指定。

例如,下列 Hive 命令會建立名為 hivetable2 的資料表,其會參考 DynamoDB 資料表 dynamodbtable2。它類似 hivetable1,只是它會將 col3 資料欄映射至字串集 (SS) 類型。

CREATE EXTERNAL TABLE hivetable2 (col1 string, col2 bigint, col3 array<string>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable2", "dynamodb.column.mapping" = "col1:name,col2:year,col3:holidays", "dynamodb.type.mapping" = "col3:SS");

在 Hive 中,hivetable1hivetable2 是相同的。不過,當這些資料表中的資料寫入至其對應的 DynamoDB 資料表時,dynamodbtable1 將包含清單,而 dynamodbtable2 將包含字串集。

如果您想要將 Hive null 值寫入為 DynamoDB null 類型的屬性,則可以使用 dynamodb.null.serialization 參數來執行此操作。下列範例顯示指定 null 序列化的語法。

CREATE EXTERNAL TABLE hive_tablename (hive_column1_name column1_datatype, hive_column2_name column2_datatype...) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodb_tablename", "dynamodb.column.mapping" = "hive_column1_name:dynamodb_attribute1_name,hive_column2_name:dynamodb_attribute2_name...", "dynamodb.null.serialization" = "true");

null 序列化參數是選用的,若未指定,則會設為 false。請注意,無論參數設定為何,Hive 中的 DynamoDB null 屬性都會讀取為 null 值。只有在 null 序列化參數指定為 true 時,具有 null 值的 Hive 集合才能寫入 DynamoDB 中。否則,會發生 Hive 錯誤。

Hive 中的 bigint 類型與 Java long 類型相同,且 Hive double 類型在精準度上也等同於 Java double 類型。換言之,如果您在 DynamoDB 中儲存的數值資料精確度高於 Hive 所提供的資料類型,則使用 Hive 匯出、匯入或參考 DynamoDB 資料皆會導致精確度下降,或 Hive 查詢失敗。

當您將 DynamoDB 的二進位類型匯出至 Amazon Simple Storage Service (Amazon S3) 或 HDFS 時,系統會將其儲存為 Base64 編碼字串。如果要將 Amazon S3 或 HDFS 的資料匯入 DynamoDB 二進位類型,則需確保該資料已編碼為 Base64 字串。

Hive 選項

您可以設定以下 Hive 選項,以管理 Amazon DynamoDB 向外的資料傳輸。這些選僅持續用於目前的 Hive 工作階段。如果將 Hive 命令提示關閉,稍後再於叢集重新開啟,這些設定均會還原為預設值。

Hive 選項 描述
dynamodb.throughput.read.percent

設定讀取操作的比率,以將 DynamoDB 佈建的輸送量比率維持在您資料表分配到的範圍內。該值介於 0.11.5 (含) 之間。

0.5 的值為預設讀取率,表示 Hive 會嘗試使用資料表內佈建的輸送量讀取資源的一半。將此值提高到 0.5 以上即會提高讀取要求率。將值降到 0.5 以下就會降低讀取要求率。此讀取率為近似值。根據不同因素,例如在 DynamoDB 資料表中是否有統一金鑰分佈等,實際讀取率可能會有所不同。

若您發現 Hive 操作常會超出佈建的輸送量,或者即時讀取流量受到多次調節,請將此值減少到低於 0.5。若您擁有充足的容量,並希望 Hive 操作的速度更快,請將該值設為 0.5 以上。若您認為有未使用的輸入/輸出操作可供使用,您也可以設到 1.5 以上以達成超額訂閱。

dynamodb.throughput.write.percent

設定寫入操作的比率,以將 DynamoDB 佈建的輸送量比率維持在您資料表分配到的範圍內。該值介於 0.11.5 (含) 之間。

0.5 的值為預設寫入率,表示 Hive 會嘗試使用資料表內佈建的輸送量寫入資源的一半。將此值提高到 0.5 以上即會提高寫入要求率。將值降到 0.5 以下就會降低寫入要求率。寫入率為近似值。根據不同因素,例如在 DynamoDB 資料表中是否有統一金鑰分佈等,實際寫入率可能會有所不同

若您發現 Hive 操作常會超出佈建的輸送量,或者即時寫入流量受到多次調節,請將此值減少到低於 0.5。若您擁有充足的容量,並希望 Hive 操作的速度更快,請將該值設為 0.5 以上。若您認為有未使用的輸入/輸出操作可供使用,或是此為初次上傳資料到資料表上而尚無任何即時流量,您也可以設到 1.5 以上,以達成超額訂閱。

dynamodb.endpoint

指定 DynamoDB 服務的端點。如需有關可用 DynamoDB 端點的詳細資訊,請參閱區域與端點

dynamodb.max.map.tasks

指定從 DynamoDB 讀取資料時映射任務的最大數量。此數值必須等於或大於 1。

dynamodb.retry.duration

指定做為逾時期間的分鐘數,以供重試 Hive 命令。該值必須為大於或等於 0 的整數。預設逾時期間為兩分鐘。

以下範例中顯示了如何使用 SET 命令設定這類選項。

SET dynamodb.throughput.read.percent=1.0; INSERT OVERWRITE TABLE s3_export SELECT * FROM hiveTableName;