我们有大量的应用程序分布在多个数据中心的多台机器上。
在一天中,我们将接收信号(内部或外部),这些信号会在每个应用程序中引发一连串的事件。
因此,每个信号都会产生大量的事件日志数据。日志线本身并没有特殊的结构,它们在应用程序之间也有很大的不同。不过,它们确实遵循基本惯例:
<timestamp> <calling function/method> <payload>
我们在日志行中有id号,可以帮助将事件与信号联系在一起—然而,这些并不是万无一失的,我们有时需要使用其他方法来尝试将事件组合在一起。
我一直在读twitter的storm系统,我很有兴趣尝试用它来实时分析大量的日志数据,并将其拼凑起来。
我想做如下事情:
根据数据的趋势实时生成报告和流图。
查询一个信号,然后在所有应用程序中调出与该信号相关的整个事件链,包括链中步骤之间的延迟(这很重要)。
查看相关事件,并深入了解某个应用程序在某个事件发生时正在执行的其他操作。
获取数据?
日志数据存储在本地日志文件中(这不太可能改变),因此我们需要一种方法将数据存储到storm本身中。日志文件也可以被压缩。我考虑过使用Flume,或logstash-人们对这些有什么想法?或者有没有其他方法可以很好的应对风暴?
存储事件?
我还需要一种方法来存储实时报告和图表的数据,以及事件数据本身。
这是我发现有点棘手的第二部分—什么类型的存储后端适合存储事件,以及它们之间的链接?某种图形数据库是合适的,一种新型的无模式nosql数据库,还是更传统一些的数据库?
Storm合适吗?
最后,storm适合这个角色,还是其他更适合的角色?
如果我真的去风暴,我可以采取什么样的方法来解决这个问题?我希望其他人也有类似问题的经验。
干杯,维克多
2条答案
按热度按时间yuvru6vn1#
这听起来很像我的案子´我现在正在工作所以我´我将给出一些可能的办法。
要获取数据,可以查看apachekafka。此消息传递系统可以将您的日志从应用程序中取出并放入中间存储。从那里,不同的系统可以作为消费者与风暴是其中一个整合以及使用一个特殊的风暴Kafka喷口。
在我们的例子中,我们有一些实时数据直接从kafka代理消耗到监控/ Jmeter 板和其他需要通过storm处理的数据流中。后者根据数据的性质存储在分布式数据库(mongodb、cassandra或couchbase)中,然后加载到 Jmeter 板和其他系统中。
对于批处理作业,还可以将kafka中的数据加载到hadoop中,所有这些都可以彼此独立地完成,将相同的数据从kafka拉到多个系统中。
kafka还通过mirror maker支持多个数据中心。
xpcnnkqh2#
根据数据的趋势实时生成报告和流图
这个听起来很合身。
查询一个信号,然后在所有应用程序中调出与该信号相关的整个事件链,包括链中步骤之间的延迟(这很重要)。
如果您的查询仅限于最近的数据(=不是很多数据)&您可以允许数据丢失,我可以想象只使用storm就可以做到这一点。如果没有,我可能会将storm与数据库结合起来,并主要使用storm进行预处理&将数据存储到数据库中。在这种情况下,使用数据库处理查询可能更好。
查看相关事件,并深入了解某个应用程序在某个事件发生时正在执行的其他操作。
当您知道要执行什么查询,并且不需要为查询访问大量数据时,storm是非常棒的。例如,提供一个显示相关事件的feed非常适合。使用数据库提供执行特殊查询(向下钻取)的方法可能更容易。另外,如果您希望允许用户查询大量数据(例如,一周的数据而不是一小时的数据等),那么您可能需要一个数据库。
至于输入数据,我将使用日志集中产品。您可以创建一个与产品提供的任何接口交互的喷口。或者,如果您使用的日志框架允许通过套接字、jms等(如log4j)发送日志,那么您可以从该套接字/jms队列等中获得一个spout读取。
至于db的选择,这实际上取决于你想做什么。如果您不知道将记录什么类型的活动,并且希望关联事件,那么我将赌图形数据库,因为遍历事件很容易。