问:添加到 Kinesis 上去的 EMR 连接器支持什么功能?
该连接器支持 EMR 直接从 Kinesis 串流读取和查询数据。现在,您可以使用现有的 Hadoop 生态系统工具,如 Hive、Pig、MapReduce、Hadoop Streaming 和 Cascading,来执行 Kinesis 串流的批处理。
问:添加到 Kinesis 上去的 EMR 连接器能支持我完成哪些之前无法完成的任务?
读取和处理来自 Kinesis 串流的数据要求您编写、部署和维持独立的流式处理应用程序。这些需要耗费大量的时间和精力。但是,使用此连接器,您编写一个简单的 Hive 或 Pig 脚本就可以开始读取和分析 Kinesis 串流。这意味着,您可以使用 SQL 来分析 Kinesis 串流。 当然,也可以使用其他 Hadoop 生态系统工具。您不必开发或维护一组新的处理应用程序。
问:此功能对哪些人有用?
此功能对以下各类用户有用:
对使用此广泛的 Hadoop 生态系统工具来分析 Kinesis 串流有兴趣的 Hadoop 用户。
正在寻求简单地方法来增强性能和正在运行 Kinesis 数据的流处理和 ETL(提取、转换和加载)的 Kinesis 用户。
希望使用熟悉的工具,如 SQL(通过 Hive)或脚本撰写语言,如 Pig,对 Kinesis 串流中的数据执行临时分析的商业分析师和 IT 专业人员。
问:这种集成有哪些使用案例?
以下为此集成支持的代表性使用案例:
流处理日志分析:您可以按地区、浏览器和访问域分析流处理网页日志,以便每隔几分钟生成一个 10 大类错误列表。
复杂数据处理工作流:您可以将存储在 S3、Dynamo DB 表和 HDFS 中的数据加入到 Kinesis 串流中。您可以编写加入了来自 Kinesis 的点击流数据并将广告活动信息存储在 DynamoDB 表中的查询,以识别各特定网站上显示的最有效的广告类别。
临时查询:您可以定期将来自 Kinesis 的数据加载到 HDFS 中并作为本地 Impala 表推出,用于快速交互式分析查询。
问:要使用此连接器,我需要使用什么 EMR AMI 版本?
您需要使用 EMR AMI 的版本 3.0.4 和更新的版本。
问:此连接器是独立的工具吗?
不是,它是 Amazon Hadoop 分配的内置组件,EMR AMI 的版本 3.0.4 及更新版本上提供此组件。客户只需使用版本 3.0.4 或更新版本的 AMI 快速构建一个群集就可以开始使用此功能。
问:支持 EMR 从 Kinesis 串流读取数据需要哪种数据格式?
EMR Kinesis 集成不指定数据格式。您可以读取任何格式的数据。个别 Kinesis 记录作为标准记录呈递给 Hadoop,该记录可使用任何 Hadoop MapReduce 框架进行读取。Hive、Pig 和 Cascading 等个别框架已内置在帮助序列化和还原序列化的组件中,从而使开发人员能够轻松查询多种格式的数据,而无需实施自定义代码。例如,Hive 用户可通过在定义表时指定适当的 Hive SerDe 来从 JSON 文件、XML 文件和 SEQ 文件读取数据。Pig 拥有的类似组件称为 Loadfunc/Evalfunc,而 Cascading 的类似组件称为 Tap。Hadoop 用户可以利用这种广泛的 Hadoop 适配器生态系统,无需编写格式专用代码。您还可以实施自定义还原序列化格式来读取其中任何一个工具的域专用数据。
问:在 EMR 中,如何使用 Hive 来分析 Kinesis 串流?
创建一个引用 Kinesis 串流的表。然后,您可以像分析 Hive 中的其他任何表一样分析此表。请参阅我们的教程页面了解更多详情。
问:使用 Hive 时,如何创建结合了 Kinesis 串流数据和其他数据源的查询?
首先,创建一个引用 Kinesis 串流的表。Hive 表创建好后,您可以将它与映射到其他数据源(如 Amazon S3、Amazon Dynamo DB 和 HDFS)的表结合起来。这会有效地将来自 Kinesis 串流的数据加入到其他数据源中。
问:此集成仅用于 Hive 吗?
不是,您可以使用 Hive、Pig、MapReduce、Hadoop 流以及 Cascading。
问:如何设置要在 Kinesis 串流上运行的既定任务?
EMR Kinesis 输入连接器提供各种功能,帮助您配置和管理传统调度引擎(如 Cron)中的既定周期性任务。例如,您可以开发一个每 N 分钟运行一次的 Hive 脚本。在任务的配置参数中,您可以为任务指定一个逻辑名称。逻辑名称是一个标签,会通知 EMR Kinesis 输入连接器该任务的单个实例是同一周期性调度的成员。逻辑名称允许该过程利用迭代,我们接下来将对其予以解释。
因为 MapReduce 是批处理框架,所以要使用 EMR 来分析 Kinesis 串流,连续的串流就需分割成数批。每个批次称为一个迭代。每个迭代分配一个以 0 开头的号码。每个迭代的边界由起始序列号和结尾序列号定义。然后 EMR 会按顺序处理迭代。
如果一次尝试发生故障,EMR Kinesis 输入连接器将在逻辑名称内重试该迭代(从该迭代的已知起始序列号开始)。此功能确保同一迭代的连续尝试与之前的尝试具有准确相同的 Kinesis 串流输入记录。这就确保了 Kinesis 串流的幂等(一致性)处理。
您可以在您相应的 Hadoop 工具中将逻辑名称和迭代指定为运行时参数。例如,在教程的“使用检查点运行查询”部分中,代码示例显示了一个预定的 Hive 查询,后者为查询指定逻辑名称,并且在每次运行任务后增加一个迭代。
此外,该教程中还提供了一个示例 Cron 调度脚本。
问:逻辑名称的元数据和迭代存储在何处?
允许 EMR Kinesis 输入连接器在既定的周期性工作流中使用的元数据存储在 Amazon DynamoDB 中。您必须预配置一个 Amazon Dynamo DB 表并指定其作为 Hadoop 任务的输入参数。注意:您要为该表配置合适的 IOPS 来支持此集成。请参阅入门教程,了解有关设置 Amazon Dynamo DB 表的更多信息。
问:当迭代处理失败时,会出现什么情况?
在 Kinesis 串流中,迭代标识符是用户提供的映射到指定边界(开头和结尾序列号)的值。这些边界对应的数据位于 MapReduce 任务的映射相位。此相位由框架管理,如果任务发生故障,它将自动运行(默认情况下运行三次)。如果重试失败,您仍可以选择从最后一次成功或通过的数据边界开始重试处理过程。处理期间,此行为通过提供 kinesis.checkpoint.iteration.no 参数来控制。请参考入门教程了解更多有关如何为 Hadoop 生态系统中的不同工具配置该值的信息。
问:是否能在同一迭代中运行多个查询?
可以,您可以通过在连续处理过程中设定 kinesis.checkpoint.iteration.no 参数来指定之前运行的迭代。该实施确保同一迭代的连续运行与之前的运行具有准确相同的 Kinesis 串流输入记录。
问:如果迭代中的记录在 Kinesis 串流中到期失效,会出现什么情况?
如果迭代的开始序列号和/或结尾序列号属于已在 Kinesis 串流中到期失效的记录,则 Hadoop 任务会失败。您将需要使用其他逻辑名称来处理 Kinesis 串流的开始数据。
问:能否将数据从 EMR 推送到 Kinesis 串流中?
目前,EMR Kinesis 连接器不支持将数据回写到 Kinesis 串流中。
问:Kinesis 的 EMR Hadoop 输入连接器支持连续流处理吗?
Hadoop MapReduce 框架是一个批处理系统。因此,不支持连续查询。然而,有一组新兴的 Hadoop 生态系统框架,例如 Twitter Storm 和 Spark 流,可支持开发人员构建适用于连续流处理的应用程序。Kinesis 的 Storm 连接器可在此处的 GitHub 上获取,您还可以在此处找到解释如何在 EMR 上设置 Spark 流和运行连续查询的教程。
此外,开发人员还可以利用 Kinesis 客户端库来开发实时流处理应用程序。您可以在此处的 Kinesis 文档中查找更多有关开发自定义 Kinesis 应用程序的信息。
问:是否能指定访问凭证来读取由其他 AWS 账户管理的 Kinesis 串流?
可以。您可以通过为拥有该 Kinesis 串流的账户指定适当访问凭证来从其他 AWS 账户读取流数据。默认情况下,Kinesis 连接器使用的是用户在创建群集时指定的访问凭证。您可以通过设置 kinesis.accessKey 和 kinesis.secretKey 参数来覆盖这些凭证,以便从其他 AWS 账户访问流数据。以下示例显示了在 Hive 和 Pig 中如何设置 kinesis.accessKey 和 kinesis.secretKey 参数。
Hive 代码示例:
...
STORED BY
'com.amazon.emr.kinesis.hive.KinesisStorageHandler'
TBLPROPERTIES(
"kinesis.accessKey"="AwsAccessKey",
"kinesis.secretKey"="AwsSecretKey",
);
Pig 代码示例:
…
raw_logs = LOAD 'AccessLogStream' USING com.amazon.emr.kinesis.pig.Kin
esisStreamLoader('kinesis.accessKey=AwsAccessKey', 'kinesis.secretKey=AwsSecretKey'
) AS (line:chararray);
问:能否在一个 Kinesis 串流中运行多个并行查询? 对性能是否有影响?
可以,客户通过为每个查询使用单独的逻辑名称,可以在同一流中运行多个并行查询。但是,从 Kinesis 串流内的碎片中读取数据受到每秒 2MB 的速率限制。因此,如果在同一串流内运行 N 个并行查询,则串流上的每个碎片的每个查询会获得每秒 (2/N) MB 的出站速率。这可能会降低处理速度,有些情况下,还会导致查询失败。
问:能否在 EMR 中加入并分析多个 Kinesis 串流?
可以,例如在 Hive 中,您可以创建两个映射到不同 Kinesis 串流的表并在两个表之间创建连接。
问:EMR Kinesis 连接器是否处理 Kinesis 扩展活动,如合并和拆分活动?
是的。该实施处理拆分和合并活动。Kinesis 连接器将单个 Kinesis 碎片(Kinesis 流内的扩展逻辑单元)与 Hadoop MapReduce 映射任务相联系。在迭代的逻辑周期内,流内的每个唯一碎片都将生成一个确切的映射任务。如果发生碎片拆分或合并活动,Kinesis 将配置新的唯一碎片 ID。结果,MapReduce 框架将预配置更多映射任务,以便从 Kinesis 读取内容。所有这些对用户都是透明的。
问:如果我的流中存在一些“静默”时段,会怎么样?
该实施允许您配置名为 kinesis.nodata.timeout 的参数。例如,考虑这样一个情况,其中 kinesis.nodata.timeout 设为 2 分钟,同时您希望每隔 10 分钟运行一次 Hive 查询。此外,考虑自上次迭代后(10 分钟之前),一些数据已写入串流中。然而,目前没有新的记录达到,也就是说,串流内是静默的。在这种情况下,当查询的当前迭代启动时,Kinesis 连接器将发现没有即将达到的新记录。连接器将使该串流保持轮询 2 分钟,如果该时间内记录没有达到,则停止轮询并仅处理流的当前批次已读取的记录。但是,如果新记录在 kinesis.nodata.timeout 时间间隔用完之前达到,那么,连接器将等待参数 kinesis.iteration.timeout 对应的额外时间间隔。请查阅教程了解如何定义这些参数。
问:如何调试在每次迭代中持续失败的查询?
如果处理发生故障,您在调试 Hadoop 任务时可以利用他们当前所用的工具。包括帮助识别和访问错误日志的 Amazon EMR Web 控制台。可在此处找到更多有关调试 EMR 任务的详细信息。
问:如果指定了没有访问权限的 DynamoDB 表,会出现什么情况?
任务会失败,此异常情况会显示任务的错误日志中。
问:如果任务没有失败,但是 DynamoDB 的检查点出现故障,会出现什么情况?
任务会失败,此异常情况会显示任务的错误日志中。
问:如何将从 Kinesis 串流到 EMR 的读取吞吐量最大化?
Kinesis 串流的吞吐量的增长随所用实例的大小以及 Kinesis 流中的记录大小而定。我们建议您使用 m1.xlarge 以及更大的实例,以确保将主要节点和核心节点用于此功能。