1

EMR 新手警报:

我们有包含我们网站使用数据的大型日志。客户通过其客户 ID 进行身份验证和识别。每当我们尝试解决客户问题时,我们都会对所有日志进行 grep(使用 customer_id 作为搜索条件)并将结果通过管道传输到文件中。然后我们使用结果文件来解决问题。我们正在考虑使用 EMR 来创建每个客户的日志文件,这样我们就不必按需创建每个客户的日志文件。EMR 会每小时为每位客户做这件事。

我们正在查看 EMR 流,并为 map 步骤生成了一个小的 ruby​​ 脚本。现在我们有一个大的键/值列表(用户 ID、日志数据)。

然而,我们坚持使用减少步骤。理想情况下,我想生成一个包含特定客户的所有日志数据的文件,并将其放入 S3 存储桶中。谁能指出我们将如何做到这一点?EMR 甚至是我们想要使用的技术吗?

谢谢,本诺

4

3 回答 3

0

看看Splunk。这是一个企业级工具,旨在发现大量文本数据中的模式和关系。我们使用它来监控大型网站的 Web 和应用程序日志。只需让 Splunk 索引所有内容并使用搜索引擎钻取数据——无需预处理。

刚刚遇到这个:Splunk 工程师入门

于 2013-10-04T04:13:29.133 回答
0

一种可能性是使用身份归约器,预先通过属性规定归约任务的数量。您将获得固定数量的文件,其中包含一组用户的所有记录。要找到正确的文件来搜索特定用户,请对用户 ID 进行散列以确定正确的文件并在其中进行搜索。

如果你真的想要每个用户一个文件,你的 reducer 应该在每次调用它时生成一个新文件。我很确定有很多可用于 ruby​​ 的 s3 客户端库。

于 2013-10-04T03:45:00.713 回答
0

不用看你的代码,是的,这在 MapReduce 中通常很容易做到;这里最好的情况是,如果您有很多用户(谁不想要这样?),并且每个用户的交互次数有限。

抽象地说,您的输入数据可能看起来像这样:

File 1:
1, 200, "/resource", "{metadata: [1,2,3]}"

File 2:
2, 200, "/resource", "{metadata: [4,5,6]}"
1, 200, "/resource", "{metadata: [7,8,9]}"

这只是用户、HTTP 状态、路径/资源和一些元数据的日志。您最好的选择是真正只专注于您的映射器清理数据,将其转换为您可以使用的格式,并将用户 ID 和其他所有内容(很可能再次包括用户 ID)作为键/值对发出。

我对 Hadoop Streaming 不是很熟悉,但根据文档:By default, the prefix of a line up to the first tab character is the key,所以这可能看起来像:

1\t1, 200, "/resource", "{metadata: [7,8,9]}"

请注意,这1是重复的,因为您可能希望在输出中使用它,而不仅仅是作为 shuffle 的一部分。这就是处理从单个映射器处理转变为File 1更像File 2

1:
1, 200, "/resource", "{metadata: [1,2,3]}"
1, 200, "/resource", "{metadata: [7,8,9]}"

2:
2, 200, "/resource", "{metadata: [4,5,6]}"

如您所见,我们基本上已经完成了每个用户的 grep!这只是进行最终转换的问题,其中可能包括排序(因为这本质上是时间序列数据)。这就是为什么我之前说过如果你有很多用户和有限的用户交互,这对你来说会更好。对每个用户的大量 MB 进行排序(或通过网络发送!)不会特别快(尽管可能仍然比其他方法更快)。

总而言之,它取决于规模和用例,但通常,是的,这是一个非常适合映射/缩减的问题。

于 2013-10-04T04:39:03.227 回答