Amazon EMR
管理指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

步骤 4:通过以步骤形式运行 Hive 脚本来处理数据

由于您的集群已启动并正在运行,您现在可以提交 Hive 脚本。在本教程中,使用 Amazon EMR 控制台以步骤形式提交 Hive 脚本。在 Amazon EMR 中,步骤 是包含一个或多个作业的工作单元。正如您在 步骤 2:启动示例 Amazon EMR 集群 中所了解,您可以向长时间运行的集群提交步骤,这是我们在此步骤中完成的任务。您还可以在创建集群时指定步骤,也可以连接到主节点,在本地文件系统中创建脚本并使用命令行运行创建的脚本,例如,hive -f Hive_CloudFront.q

了解数据和脚本

您在本教程中使用的示例数据和脚本已在您可访问的 Amazon S3 位置中可用。

示例数据是一系列 Amazon CloudFront 访问日志文件。有关 CloudFront 和日志文件格式的更多信息,请参阅 Amazon CloudFront 开发人员指南。数据存储在位于 s3://region.elasticmapreduce.samples/cloudfront/data 的 Amazon S3 中,其中,region 是您的区域,例如,us-west-2。如果您在提交步骤时输入位置,请忽略 cloudfront/data 部分,因为脚本会加上它。

CloudFront 日志文件中的每个条目都采用以下格式提供有关单个用户请求的详细信息:

2014-07-05 20:00:00 LHR3 4260 10.0.0.15 GET eabcd12345678.cloudfront.net /test-image-1.jpeg 200 - Mozilla/5.0%20(MacOS;%20U;%20Windows%20NT%205.1;%20en-US;%20rv:1.9.0.9)%20Gecko/2009040821%20IE/3.0.9

此示例脚本计算指定时间范围内每个操作系统的请求总数。脚本使用 HiveQL (一种类似 SQL 的脚本语言) 实现数据仓库和分析。脚本存储在位于 s3://region.elasticmapreduce.samples/cloudfront/code/Hive_CloudFront.q 的 Amazon S3 中,其中,region 是您的区域。

此示例 Hive 脚本执行以下操作:

  • 创建名为 cloudfront_logs 的 Hive 表架构。有关 Hive 表的更多信息,请参阅 Hive Wiki 上的 Hive 教程

  • 使用内置正则表达式序列化程序/反序列化程序 (RegEx SerDe) 解析输入数据并应用表架构。有关更多信息,请参阅 Hive WiKi 上的 SerDe

  • 针对 cloudfront_logs 表运行 HiveQL 查询并将查询结果写入您指定的 Amazon S3 输出位置。

下面显示的是 Hive_CloudFront.q 脚本的内容。${INPUT}${OUTPUT} 变量将由您在以步骤形式提交脚本时指定的 Amazon S3 位置替换。当您像此脚本一样引用 Amazon S3 中的数据时,Amazon EMR 将使用 EMR 文件系统 (EMRFS) 读取输入数据并写入输出数据。

-- Summary: This sample shows you how to analyze CloudFront logs stored in S3 using Hive -- Create table using sample data in S3. Note: you can replace this S3 path with your own. CREATE EXTERNAL TABLE IF NOT EXISTS cloudfront_logs ( DateObject Date, Time STRING, Location STRING, Bytes INT, RequestIP STRING, Method STRING, Host STRING, Uri STRING, Status INT, Referrer STRING, OS String, Browser String, BrowserVersion String ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' WITH SERDEPROPERTIES ( "input.regex" = "^(?!#)([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+[^\(]+[\(]([^\;]+).*\%20([^\/]+)[\/](.*)$" ) LOCATION '${INPUT}/cloudfront/data'; -- Total requests per operating system for a given time frame INSERT OVERWRITE DIRECTORY '${OUTPUT}/os_requests/' SELECT os, COUNT(*) count FROM cloudfront_logs WHERE dateobject BETWEEN '2014-07-05' AND '2014-08-05' GROUP BY os;

以步骤的形式提交 Hive 脚本

通过控制台使用 Add Step (添加步骤) 选项向集群提交 Hive 脚本。Hive 脚本和示例数据已上传至 Amazon S3,您指定输出位置为您之前在创建 Amazon S3 存储桶中创建的文件夹。

通过以步骤形式提交 Hive 脚本来运行此脚本

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

  2. Cluster List (集群列表) 中,选择您的集群的名称。确保集群处于 Waiting (正在等待) 状态。

  3. 选择 Steps (步骤),然后选择 Add step (添加步骤)

  4. 根据以下准则配置步骤:

    • 对于 Step type (步骤类型),选择 Hive program (Hive 程序)

    • 对于 Name (名称),您可以保留默认名称或键入新名称。如果您在集群中有很多步骤,此名称将帮助您跟踪这些步骤。

    • 对于 Script S3 location (脚本 S3 位置),键入 s3://region.elasticmapreduce.samples/cloudfront/code/Hive_CloudFront.q。将 region 替换为您的区域标识符。例如,如果您在俄勒冈区域工作,则使用 s3://us-west-2.elasticmapreduce.samples/cloudfront/code/Hive_CloudFront.q。有关区域和对应区域标识符的列表,请参阅 AWS General Reference 中的 Amazon EMR 的 AWS 区域和终端节点

    • 对于 Input S3 location (输入 S3 位置),键入 s3://region.elasticmapreduce.samples

      region 替换为您的区域标识符。

    • 对于 Output S3 location (输出 S3 位置),键入或浏览到您在创建 Amazon S3 存储桶中创建的 output 存储桶。

    • 对于 Action on failure (出现故障时的操作),接受默认选项 Continue (继续)。这指定如果步骤失败,则集群将继续运行并处理后续步骤。Cancel and wait (取消并等待) 选项指定失败的步骤应取消,后续步骤不应运行,但集群应继续运行。Terminate cluster (终止集群) 选项指定集群应在步骤失败时终止。

  5. 选择 Add。步骤会出现在控制台中,其状态为 “Pending”

  6. 步骤的状态会随着步骤的运行从 “Pending” 变为 “Running”,再变为 “Completed”。要更新状态,请选择 Filter (筛选条件) 右侧的刷新图标。运行该脚本大约需要一分钟时间。

查看结果

步骤成功完成之后,Hive 查询输出将以文本文件的形式保存在您在提交步骤时指定的 Amazon S3 输出文件夹中。

查看 Hive 脚本的输出

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

  2. 选择 Bucket name (存储桶名称),然后选择之前设置的文件夹。例如,先后选择 mybucketMyHiveQueryResults

  3. 查询将结果写入输出文件夹中名为 os_requests 的文件夹。选择该文件夹。该文件夹中应有一个名为 000000_0 的文件。这是一个包含您的 Hive 查询结果的文本文件。

  4. 选择该文件,然后选择 Download (下载) 以将其保存在本地。

  5. 使用您喜欢的文本编辑器打开该文件。输出文件显示按操作系统排序的访问请求总数。以下示例显示在 WordPad 中输出:

    WordPad 中的示例 Hive 查询结果。