EMR - 从日志创建用户日志

时间:2013-10-04 03:16:41

标签: hadoop-streaming elastic-map-reduce

新手警报:

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

我们正在研究EMR流媒体并为地图步骤制作了一个小红宝石脚本。现在我们有一个很大的键/值列表(userid,logdata)。

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

谢谢, 本诺

3 个答案:

答案 0 :(得分:0)

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

如果您确实需要每个用户一个文件,则每次调用时,reducer都应生成一个新文件。我很确定有很多可用于ruby的s3客户端库。

答案 1 :(得分:0)

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

刚碰到这个:Getting Started with Splunk as an Engineer

答案 2 :(得分: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)作为键/值对发出。 / p>

我对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 1File 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并不会特别快(尽管可能仍然比其他选择更快)。

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