Differences and Considerations for Hive on Amazon EMR - Amazon EMR
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Differences and Considerations for Hive on Amazon EMR

Differences between Apache Hive on Amazon EMR and Apache Hive

本节介绍 Amazon EMR 上的 Hive 和 http://svn.apache.org/viewvc/hive/branches/ 上提供的默认 Hive 版本之间的区别。

Hive Authorization

对于 HDFS,Amazon EMR 支持 Hive 授权(但对 EMRFS 和 Amazon S3 不支持)。Amazon EMR 集群在禁用授权的状态下运行。

Hive File Merge Behavior with Amazon S3

ApacheHive在仅限地图的作业结束时将小文件融合IF hive.merge.mapfiles 为真,只有当作业的平均输出大小小于 hive.merge.smallfiles.avgsize 设置。 Amazon EMR如果最终输出路径在HDFS中,Hive的行为完全相同。如果输出路径位于 Amazon S3 中,则忽略 hive.merge.smallfiles.avgsize 参数。在那种情况下,如果 hive.merge.mapfiles 设置为 true,会始终触发合并任务。

ACID Transactions and Amazon S3

存储在 Amazon S3 中的 Hive 数据不支持 ACID (原子性、一致性、隔离、持久性) 事务。尝试在 Amazon S3 中创建事务表会导致出现异常。

Hive Live Long and Process (LLAP)

在默认 Apache Hive 2.0 版中添加的 LLAP 功能在 Amazon EMR 5.0 版上的 Hive 2.1.0 中不受支持。

Amazon EMR 版本 6.0.0 及更高版本支持 Live Long and Process (LLAP) 功能。有关更多信息,请参阅使用 Hive LLAP

Differences in Hive Between Amazon EMR Release Version 4.x and 5.x

本节介绍在将 Hive 实现从 Amazon EMR 4.x 版上的 Hive 1.0.0 版迁移到 Amazon EMR 5.x 版上的 Hive 2.x 之前要考虑的区别。

Operational Differences and Considerations

  • Support added for ACID (Atomicity, Consistency, Isolation, and Durability)transactions: This difference between Hive 1.0.0 on Amazon EMR 4.x and default Apache Hive has been eliminated.

  • Direct writes to Amazon S3 eliminated: This difference between Hive 1.0.0 on Amazon EMR and the default Apache Hive has been eliminated. Hive 2.1.0 on Amazon EMR release 5.x now creates, reads from, and writes to temporary files stored in Amazon S3. As a result, to read from and write to the same table you no longer have to create a temporary table in the cluster's local HDFS file system as a workaround. If you use versioned buckets, be sure to manage these temporary files as described below.

  • Manage temp files when using Amazon S3 versioned buckets: When you run Hive queries where the destination of generated data is Amazon S3, many temporary files and directories are created. This is new behavior as described earlier. If you use versioned S3 buckets, these temp files clutter Amazon S3 and incur cost if they're not deleted. Adjust your lifecycle rules so that data with a /_tmp prefix is deleted after a short period, such as five days. See Specifying a Lifecycle Configuration for more information.

  • Log4j updated to log4j 2: If you use log4j, you may need to change your logging configuration because of this upgrade. See Apache log4j 2 for details.

Performance differences and considerations

  • Performance differences with Tez: With Amazon EMR release 5.x , Tez is the default execution engine for Hive instead of MapReduce. Tez provides improved performance for most workflows.

  • Tables with many partitions: Queries that generate a large number of dynamic partitions may fail, and queries that select from tables with many partitions may take longer than expected to execute. For example, a select from 100,000 partitions may take 10 minutes or more.

Additional Features of Hive on Amazon EMR

Amazon EMR 通过支持 Hive 与其他 AWS 服务集成的新功能(如读取和写入 Amazon Simple Storage Service (Amazon S3) 和 DynamoDB 的功能)来扩展 Hive。

Variables in Hive

您可以使用美元符号和大括号在脚本中包括变量。

add jar ${LIB}/jsonserde.jar

如以下示例所示,您可以在命令行上使用 -d 参数将这些变量的值传递给 Hive:

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

您还可以将值传递到执行 Hive 脚本的步骤。

使用控制台将变量值传递到 Hive 步骤

  1. 通过以下网址打开 Amazon EMR 控制台:https://console.amazonaws.cn/elasticmapreduce/

  2. 选择 Create Cluster (创建集群)

  3. 步骤部分中,对于 Add Step (添加步骤),从列表中选择 Hive Program (Hive 程序),然后选择 Configure and add (配置并添加)

  4. Add Step (添加步骤) 对话框中,参考下表指定参数,然后选择添加

    字段 操作:,
    脚本 S3 位置* 指定 Amazon S3 中脚本存储位置的 URI。该值必须采用 格式。BucketName/path/ScriptName例如:。s3://elasticmapreduce/samples/hive-ads/libs/response-time-stats.q.
    输入 S3 位置 指定 Amazon S3 中输入文件存储位置的 URI (可选)。该值必须采用 格式。BucketName/path/。如果指定,将会将Hive脚本传递到Hive脚本 INPUT。例如: s3://elasticmapreduce/samples/hive-ads/tables/.
    输出 S3 位置 指定您希望在 Amazon S3 中存储该输出的 URI (可选)。该值必须采用 格式。BucketName/path。如果指定,将会将Hive脚本传递到Hive脚本 OUTPUT。例如: s3://mybucket/hive-ads/output/.
    Arguments 输入要传递到 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';

    要传递该变量的值,请在参数窗口中键入以下内容:

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

    出现故障时的操作

    这决定了集群为响应任何错误而执行的操作。此设置的可能值为:

    • Terminate cluster: If the step fails, terminate the cluster. If the cluster has termination protection enabled AND keep alive enabled, it will not terminate.

    • Cancel and wait: If the step fails, cancel the remaining steps. If the cluster has keep alive enabled, the cluster will not terminate.

    • Continue: If the step fails, continue to the next step.

  5. 根据需要选择值,然后选择创建集群

使用 AWS CLI 将变量值传递到 Hive 步骤

要使用 AWS CLI 将变量值传递到 Hive 步骤,请使用 --steps 参数并包括参数列表。

  • 注意

    包含了 Linux 行继续符 (\) 以提高可读性。可以在 Linux 命令中删除或使用它们。对于 Windows,请删除它们或将其替换为脱字号 (^)。

    aws emr create-cluster --name "Test cluster" --release-label emr-5.31.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://mybucket/hive-ads/output/,-d,SAMPLE=s3://elasticmapreduce/samples/hive-ads/]

    有关如何在 AWS CLI 中使用 Amazon EMR 命令的更多信息,请参阅 https://docs.amazonaws.cn/cli/latest/reference/emr

使用 Java 开发工具包将变量值传递到 Hive 步骤

  • 以下示例演示如何使用开发工具包将变量传递到步骤。有关详细信息,请参阅 课程步进工厂AWS SDK for Java API Reference.

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

Amazon EMR Hive Queries to Accommodate Partial DynamoDB Schemas

在查询 DynamoDB 表时,Amazon EMR Hive 允许您指定一部分列作为数据筛选条件,而不要求您的查询包含所有列,因此可提供最大的灵活性。当采用稀疏数据库架构,并希望根据一些列来筛选记录 (例如根据时间戳筛选) 时,这种部分架构查询技术可以发挥作用。

以下示例显示了如何使用 Hive 查询执行下列操作:

  • Create a DynamoDB table.

  • Select a subset of items (rows) in DynamoDB and further narrow the data to certain columns.

  • Copy the resulting data to 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 中选择任意项目组合的查询语法。

查询范例 结果描述
选择* table_name; 从指定表选择所有项目 (行) 并包括这些项目对应的所有列的数据。
选择* 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; 从指定表选择一些项目 (行) 并包括这些项目对应的一些列的数据。

Copy Data Between DynamoDB Tables in Different AWS Regions

Amazon EMR Hive 提供了可以为每个 DynamoDB 表设置的 dynamodb.region 属性。当两个表的 dynamodb.region 设置不同时,您在两个表之间执行的所有数据复制将自动在指定区域之间发生。

以下示例显示了如何通过用于设置 dynamodb.region 属性的 Hive 脚本创建 DynamoDB 表:

注意

每个表的 region 属性会覆盖全局 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");

Set DynamoDB Throughput Values Per Table

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");