Amazon 上 Hive 的差異和考量 EMR - Amazon EMR

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

Amazon 上 Hive 的差異和考量 EMR

Amazon 上的 Apache Hive EMR與 Apache Hive 之間的差異

本節說明 Amazon 上的 Hive EMR與 http://svn.apache.org/viewvc/hive/branches:// Hive 預設版本之間的差異。

Hive 授權

Amazon EMR支援 的 Hive 授權HDFS,但不適用於 EMRFS和 Amazon S3。Amazon EMR叢集執行時預設會停用授權。

Amazon S3 的 Hive 檔案合併行為

如果 hive.merge.mapfiles 是 true,Apache Hive 會在僅限映射任務結束時合併小檔案,而且只會在任務的平均輸出大小小於 hive.merge.smallfiles.avgsize 設定時觸發合併。如果最終輸出路徑位於 中,Amazon EMR Hive 的行為完全相同HDFS。如果輸出路徑是在 Amazon S3 中,則會忽略 hive.merge.smallfiles.avgsize 參數。在此情況下,如果 hive.merge.mapfiles 設為 true,則合併任務一律會觸發。

ACID 交易和 Amazon S3

Amazon EMR 6.1.0 及更新版本支援 Hive ACID(原子、一致性、隔離、耐久性) 交易,因此符合資料庫的ACID屬性。使用此功能,您可以在 Hive 受管資料表中執行 INSERT、DELETE、 和 MERGE操作UPDATE,其中包含 Amazon Simple Storage Service (Amazon S3) 中的資料。

Hive Live Long 和 程序 (LLAP)

Amazon 5.0 版的 Hive 2.1.0 不支援在 2.0 EMR版預設 Apache Hive 中新增LLAP的功能

Amazon 6EMR.0.0 版及更新版本支援 Hive 的 Live Long 和 Process (LLAP) 功能。如需詳細資訊,請參閱使用 Hive LLAP

Amazon EMR版本 4.x 和 5.x 之間的 Hive 差異

本節涵蓋將 Hive 實作從 Amazon 4.x EMR版的 Hive 1.0.0 版遷移至 Amazon 5.x EMR版的 Hive 2.x 之前要考慮的差異。

運作的差異和考量

  • ACID(原子性、一致性、隔離和耐久性) 交易新增的支援:Amazon 4.x 上的 Hive EMR 1.0.0 與預設 Apache Hive 之間的此差異已消除。

  • 已消除對 Amazon S3 的直接寫入:Amazon 上的 Hive 1.0.0 EMR與預設 Apache Hive 之間的差異已消除。Amazon 5.x EMR版上的 Hive 2.1.0 現在會建立、讀取和寫入存放在 Amazon S3 中的暫存檔案。因此,若要讀取和寫入相同的資料表,您不再需要在叢集的本機HDFS檔案系統中建立暫存資料表做為解決方法。如果您使用版本控制的儲存貯體,則務必依下述管理這些暫存檔案。

  • 使用 Amazon S3 版本控制儲存貯體時管理暫時檔案:當您執行 Hive 查詢,若所產生資料的目的地是 Amazon S3,則會建立許多暫時檔案和目錄。這是稍早所述的新行為。如果您使用版本控制的 S3 儲存貯體,這些暫時檔案會使 Amazon S3 變得雜亂,且未將它們刪除便會產生成本。請調整您的生命週期規則,讓 /_tmp 字首的資料在經過一段短時間後刪除,例如 5 天。如需詳細資訊,請參閱指定生命週期組態

  • Log4j 已更新為 log4j 2:如果您使用 log4j,則可能因為此升級而需要變更記錄組態。請參閱 Apache log4j 2 了解詳細資訊。

效能的差異和考量

  • Tez 的效能差異:在 Amazon 5.x EMR版 中,Tez 是 Hive 的預設執行引擎,而不是 MapReduce。Tez 可為大多數工作流程提供更高的效能。

  • 具有許多分割區的表格:產生大量動態分割區的查詢可能會失敗,而從具有許多分割區的表格選擇的查詢所需的執行時間可能比預期更久。例如,從 100,000 個分割區選擇可能要花 10 分鐘或更久。

Amazon 上 Hive 的其他功能 EMR

Amazon 使用支援 Hive 與其他 AWS 服務整合的新功能EMR來擴展 Hive,例如能夠讀取和寫入 Amazon Simple Storage Service (Amazon S3) 和 DynamoDB 。

Hive 中的變數

您可以使用貨幣符號和大括號在指令碼中包含變數。

add jar ${LIB}/jsonserde.jar

您在命令列上使用 -d 參數將這些變數的值傳遞至 Hive,如以下範例所示:

-d LIB=s3://elasticmapreduce/samples/hive-ads/lib

您也可以將值傳遞至執行 Hive 指令碼的步驟。

使用主控台將變數值傳遞至 Hive 步驟
  1. https://console.aws.amazon.com/emr 開啟 Amazon EMR主控台。

  2. 選擇建立叢集

  3. Steps (步驟) 區段,針對 Add Step (新增步驟),從清單中選擇 Hive Program (Hive 程式)Configure and add (設定和新增)

  4. Add Step (新增步驟) 對話方塊中,使用下表做為指引指定參數,然後選擇 Add (新增)

    欄位 動作
    S3 指令碼位置* 指定URI指令碼駐留在 Amazon S3 中的 。值必須為 格式 BucketName/path/ScriptName。 例如:s3://elasticmapreduce/samples/hive-ads/libs/response-time-stats.q
    S3 輸入位置 或者,指定輸入檔案駐留在 Amazon S3 中的 URI 。值必須為 格式 BucketName/path/。 如果指定,這將作為名為 的參數傳遞至 Hive 指令碼INPUT。例如:s3://elasticmapreduce/samples/hive-ads/tables/
    S3 輸出位置 或者,指定您要在 Amazon S3 中存放輸出URI的位置。值必須為 格式 BucketName/path。 如果指定,這將作為名為 的參數傳遞至 Hive 指令碼OUTPUT。例如:s3://amzn-s3-demo-bucket/hive-ads/output/
    引數 或者,輸入要傳遞至 Hive 的引數清單 (空格分隔字串)。如果您在名為 ${SAMPLE} 的 Hive 指令碼中定義了路徑變數,例如:
    CREATE EXTERNAL TABLE logs (requestBeginTime STRING, requestEndTime STRING, hostname STRING) PARTITIONED BY (dt STRING) \ ROW FORMAT serde 'com.amazon.elasticmapreduce.JsonSerde' WITH SERDEPROPERTIES ( 'paths'='requestBeginTime, requestEndTime, hostname' ) LOCATION '${SAMPLE}/tables/impressions';

    若要傳遞變數的值,在 Arguments (引數) 視窗中輸入以下內容:

    -d SAMPLE=s3://elasticmapreduce/samples/hive-ads/.

    失敗的動作

    這會決定叢集對任何錯誤的回應。此設定可能的值包括:

    • Terminate cluster (終止叢集):如果步驟失敗,則終止叢集。如果叢集已啟用終止保護AND保持啟用狀態,則不會終止。

    • Cancel and wait (取消並等待):如果步驟失敗,則取消剩餘步驟。如果叢集已啟用持續作用,則叢集將不會終止。

    • Continue (繼續):如果步驟失敗,則繼續下一個步驟。

  5. 選取必要的值,並選擇 Create cluster (建立叢集)

使用 將變數值傳遞至 Hive 步驟 AWS CLI

若要使用 將變數值傳遞至 Hive 步驟 AWS CLI,請使用 --steps 參數並包含引數清單。

  • 注意

    包含 Linux 行接續字元 (\) 是為了提高可讀性。它們可以在 Linux 命令中移除或使用。對於 Windows,請將其移除或取代為插入符號 (^)。

    aws emr create-cluster --name "Test cluster" --release-label emr-7.3.0 \ --applications Name=Hive Name=Pig --use-default-roles --ec2-attributes KeyName=myKey --instance-type m5.xlarge --instance-count 3 \ --steps Type=Hive,Name="Hive Program",ActionOnFailure=CONTINUE,Args=[-f,s3://elasticmapreduce/samples/hive-ads/libs/response-time-stats.q,-d,INPUT=s3://elasticmapreduce/samples/hive-ads/tables,-d,OUTPUT=s3://amzn-s3-demo-bucket/hive-ads/output/,-d,SAMPLE=s3://elasticmapreduce/samples/hive-ads/]

    如需在 中使用 Amazon EMR命令的詳細資訊 AWS CLI,請參閱 https://docs.aws.amazon.com/cli/latest/reference/emr

使用 Java 將變數值傳遞至 Hive 步驟 SDK
  • 下列範例示範如何使用 將變數傳遞至步驟SDK。如需詳細資訊,請參閱 AWS SDK for Java API 參考 中的類別 StepFactory

    StepFactory stepFactory = new StepFactory(); StepConfig runHive = new StepConfig() .withName("Run Hive Script") .withActionOnFailure("TERMINATE_JOB_FLOW") .withHadoopJarStep(stepFactory.newRunHiveScriptStep(“s3://amzn-s3-demo-bucket/script.q”, Lists.newArrayList(“-d”,”LIB= s3://elasticmapreduce/samples/hive-ads/lib”));

Amazon EMR Hive 查詢以容納部分 DynamoDB 結構描述

Amazon EMR Hive 可讓您指定資料子集,以篩選資料,而不是要求查詢包含所有資料欄,藉此在查詢 DynamoDB 資料表時提供最大的彈性。當您擁有疏鬆的資料庫結構描述,而想要依據少數幾欄篩選記錄 (例如篩選時間戳記) 時,這種部分結構描述查詢的技術就會非常有效。

下列範例說明如何使用 Hive 查詢:

  • 建立 DynamoDB 資料表。

  • 選取 DynamoDB 中項目 (列) 的子集,並進一步縮小資料範圍至特定資料欄。

  • 將得到的資料複製到 Amazon S3。

DROP TABLE dynamodb; DROP TABLE s3; CREATE EXTERNAL TABLE dynamodb(hashKey STRING, recordTimeStamp BIGINT, fullColumn map<String, String>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ( "dynamodb.table.name" = "myTable", "dynamodb.throughput.read.percent" = ".1000", "dynamodb.column.mapping" = "hashKey:HashKey,recordTimeStamp:RangeKey"); CREATE EXTERNAL TABLE s3(map<String, String>) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION 's3://bucketname/path/subpath/'; INSERT OVERWRITE TABLE s3 SELECT item fullColumn FROM dynamodb WHERE recordTimeStamp < "2012-01-01";

下表顯示從 DynamoDB 選取任意項目組合的查詢語法。

查詢範例 結果描述
SELECT * FROM table_name; 從特定資料表選取所有項目 (列),並包含所有欄中適用於這些項目的資料。
SELECT * FROM table_name WHERE field_name =value; 從特定資料表選取某些項目 (列),並包含所有欄中適用於這些項目的資料。
SELECT column1_name, column2_name, column3_name FROM table_name; 從特定資料表選取所有項目 (列),並包含某些欄中適用於這些項目的資料。
SELECT column1_name, column2_name, column3_name FROM table_name WHERE field_name =value; 從特定資料表選取某些項目 (列),並包含某些欄中適用於這些項目的資料。

在不同 AWS 區域中的 DynamoDB 資料表之間複製資料

Amazon EMR Hive 提供您可以為每個 DynamoDB 資料表設定的 dynamodb.region 屬性。當兩個資料表上的 dynamodb.region 設定不同時,您在資料表之間複製的任何資料都會自動出現在指定的區域之間。

以下範例說明如何使用設定 dynamodb.region 屬性的 Hive 指令碼建立 DynamoDB 資料表:

注意

個別資料表區域的屬性會覆寫全域 Hive 屬性。

CREATE EXTERNAL TABLE dynamodb(hashKey STRING, recordTimeStamp BIGINT, map<String, String> fullColumn) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ( "dynamodb.table.name" = "myTable", "dynamodb.region" = "eu-west-1", "dynamodb.throughput.read.percent" = ".1000", "dynamodb.column.mapping" = "hashKey:HashKey,recordTimeStamp:RangeKey");

設定每個資料表的 DynamoDB 輸送量值

Amazon EMR Hive 可讓您在資料表定義中,根據每個資料表設定 DynamoDB readThroughputPercent 和 writeThroughputPercent 設定。下列 Amazon EMR Hive 指令碼說明如何設定輸送量值。如需 DynamoDB 輸送量值的詳細資訊,請參閱指定資料表的讀取和寫入需求

CREATE EXTERNAL TABLE dynamodb(hashKey STRING, recordTimeStamp BIGINT, map<String, String> fullColumn) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ( "dynamodb.table.name" = "myTable", "dynamodb.throughput.read.percent" = ".4", "dynamodb.throughput.write.percent" = "1.0", "dynamodb.column.mapping" = "hashKey:HashKey,recordTimeStamp:RangeKey");