本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
設定 Hive 資料表以執行 Hive 命令
Apache Hive 是一種資料倉儲應用程式,您可以使用SQL類似 的語言來查詢 Amazon EMR叢集中包含的資料。如需關於 Hive 的詳細資訊,請參閱 http://hive.apache.org/
下列程序假設您已建立叢集並指定 Amazon EC2金鑰對。若要了解如何開始建立叢集,請參閱 Amazon 管理指南 EMR 中的 Amazon EMR 入門。
設定 Hive 以使用 MapReduce
當您在 Amazon 上使用 Hive EMR查詢 DynamoDB 資料表時,如果 Hive 使用預設執行引擎 Tez,則可能會發生錯誤。因此,當您使用 Hive 建立與 DynamoDB 整合的叢集時,建議您使用將 Hive 設定為使用 的組態分類 MapReduce。如需詳細資訊,請參閱設定應用程式。
下列程式碼片段顯示要用來 MapReduce 設定為 Hive 執行引擎的組態分類和屬性:
[ { "Classification": "hive-site", "Properties": { "hive.execution.engine": "mr" } } ]
以互動方式執行 Hive 命令
-
連接至主節點。如需詳細資訊,請參閱 Amazon EMR管理指南 中的使用 連線至主節點SSH。
-
目前的主節點出現命令提示時,請輸入
hive
。請查看 Hive 提示:
hive>
-
輸入 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 資料表 dynamodbtable1 具有 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 5.27.0 版及更新EMR版本上,連接器具有驗證,可確保在 Hive 資料表中的 DynamoDB 屬性名稱和資料欄之間進行 one-to-one映射。如果映射不存在, one-to-one將發生錯誤。
-
在 Amazon 5.26.0 版及更早EMR版本上,Hive 資料表不會包含來自 DynamoDB 的 name-value 對。如果未映射 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 命令)。
-
輸入
Ctrl+C
離開命令列用戶端。 -
出現 Shell 提示時,您必須在請求的初始伺服器回應中輸入 Kill Command (Kill 命令)。
或者,您可以從主節點的命令列執行下列命令,以終止 Hadoop 任務,其中
job-id
是 Hadoop 任務的識別符,可以從 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 | 布林值 (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 中,hivetable1
和 hivetable2
是相同的。不過,當這些資料表中的資料寫入至其對應的 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-encoded字串。如果您要從 Amazon S3 或 匯入資料HDFS至 DynamoDB 二進位類型,則應將其編碼為 Base64 字串。
Hive 選項
您可以設定以下 Hive 選項,以管理 Amazon DynamoDB 向外的資料傳輸。這些選僅持續用於目前的 Hive 工作階段。如果將 Hive 命令提示關閉,稍後再於叢集重新開啟,這些設定均會還原為預設值。
Hive 選項 | 描述 |
---|---|
dynamodb.throughput.read.percent |
設定讀取操作的比率,以將 DynamoDB 佈建的輸送量比率維持在您資料表分配到的範圍內。該值介於 0.5 的值為預設讀取率,表示 Hive 會嘗試使用資料表內佈建的輸送量讀取資源的一半。將此值提高到 0.5 以上即會提高讀取要求率。將值降到 0.5 以下就會降低讀取要求率。此讀取率為近似值。根據不同因素,例如在 DynamoDB 資料表中是否有統一金鑰分佈等,實際讀取率可能會有所不同。 若您發現 Hive 操作常會超出佈建的輸送量,或者即時讀取流量受到多次調節,請將此值減少到低於 |
dynamodb.throughput.write.percent |
設定寫入操作的比率,以將 DynamoDB 佈建的輸送量比率維持在您資料表分配到的範圍內。該值介於 0.5 的值為預設寫入率,表示 Hive 會嘗試使用資料表內佈建的輸送量寫入資源的一半。將此值提高到 0.5 以上即會提高寫入要求率。將值降到 0.5 以下就會降低寫入要求率。寫入率為近似值。根據不同因素,例如在 DynamoDB 資料表中是否有統一金鑰分佈等,實際寫入率可能會有所不同 若您發現 Hive 操作常會超出佈建的輸送量,或者即時寫入流量受到多次調節,請將此值減少到低於 |
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 * FROMhiveTableName
;