m***h 发帖数: 77 | 1 我有这么一个问题拿不定主意。
在一个team/group/organization里sell这个big data最好的方式就是在不动
production或用最小的cost的前提下提供现系统不能提供的feature。譬如,我们一个
大app,一堆API,一堆server,每个API都写很多(大部分是垃圾)到本地的log files
。可以想象一个login API,当一个user login后,一个thread会产生如下的log (实
际的log各种花样没这么简单)
[2015-10-11 02:00:00] TP-123 com.xyz.api.login INFO BEGIN
[2015-10-111 02:00:00] TP-123 com.xyz.api.login INFO user abcd is in
[2015-10-11 02:00:00] TP-123 com.xyz.api.login INFO use is from IP 1.2.3
.4
[2015-10-11 02:00:00] TP-123 com.xyz.api.login INFO user has permission
X,Y,Z
[2015-10-11 02:00:00] TP-123 com.xyz.api.login INFO END
这里TP-123 是thread name,在这里我想拿到的数据就是
user abcd ip 1.2.3.4 permission x,y,z
实际中一个tomcat上只有一个app,但有很多thread在写log到file里,而且这同一个
thread以后会处理别的API。不过在同一个log file里,我可以用thread来group这些
log,因为有明确的begin和end,我可以拿出想要的数据。
我有一个cron job, 每10分钟去各个server copy log files到Hadoop,然后一个
mapred job用filename和thread来map这些lines,再抓出每个user的数据。
现在想法是想把这套搞成实时的,一个方案是用logstash或fluentd tail这些log
files,送到kafka,然后写consumer来处理。问题是这样一来一大堆log lines被分散到
不同的Kafka partition,从Kafka consumer的角度它不能保证处理同一个server
thread 的messges/log lines(上面例子)。。。。一个方案是用server name做
message tag (fluentd),同时也做partition
key,这样能保证同一个server的log到同一个partition.
我想这个问题应该是很普遍的,想知道其他公司怎么解决的。 | m***h 发帖数: 77 | 2 我想怎么都得用server name做message Tag (这样server name就在message JSON里了)
,因为server, thread和timestamp是决定log的三个缺一不可的因素。用server Tag
做partition key可以保证同一个server的log被发到同一个kafka partition, 在同一
个partition里message是keep order的,然后再在同一个consumer group里,同一个
partition总是分到同一个consumer,就是说不会出现两个同样的consumer 处理同一个
partition,觉得应该是work的。 | f********x 发帖数: 99 | 3 说了一大堆,不知道你到底想问什么问题? collectd => Kafka => Flink or Spark
Streaming => Kafka => C* or other NoSQL可能是你需要的架构。
了)
Tag
【在 m***h 的大作中提到】 : 我想怎么都得用server name做message Tag (这样server name就在message JSON里了) : ,因为server, thread和timestamp是决定log的三个缺一不可的因素。用server Tag : 做partition key可以保证同一个server的log被发到同一个kafka partition, 在同一 : 个partition里message是keep order的,然后再在同一个consumer group里,同一个 : partition总是分到同一个consumer,就是说不会出现两个同样的consumer 处理同一个 : partition,觉得应该是work的。
| a*****n 发帖数: 63 | 4 为什么要先把log file collect一下。每个thread是不是应该实时向kafka发log event
? | d*******r 发帖数: 3299 | 5 你说这个我有体会,就是采集 log 的时候,如果不加入很重要的一些 fields, 就会
information loss。后面的分析,是后面的事情, 但是开始采集的时候,该加的 field
一定要加, 不然后面分析功能再fancy,也会缺信息.
这个主要看采集的模块,logstash(Ruby, JRuby, Go), fluentd(Ruby), 还有 Heka(Go
).
大概2年以前我用过 logstash, fluentd. logstash 乱糟糟的,filter/modifier功能
多,你按照写入的 log 加点 fields 问题不大. fluentd 我感觉用着舒服很多,
filter/modifier 少一点. 但是我是2年前用的,现在 logstash 跟着 ElasticSearch
有过一次大升级,质量应该好不少.
如果我现在做log采集,应该会试 Heka. 看着还挺不错的.
你可以回来分享下,后续的经验.
了)
Tag
【在 m***h 的大作中提到】 : 我想怎么都得用server name做message Tag (这样server name就在message JSON里了) : ,因为server, thread和timestamp是决定log的三个缺一不可的因素。用server Tag : 做partition key可以保证同一个server的log被发到同一个kafka partition, 在同一 : 个partition里message是keep order的,然后再在同一个consumer group里,同一个 : partition总是分到同一个consumer,就是说不会出现两个同样的consumer 处理同一个 : partition,觉得应该是work的。
| m***h 发帖数: 77 | 6 是的,我的问题不是关于架构,拿轮子搭积木不难。在log处理这方面,syslog,
access log之类都很简单,因为都是one liner,well defined format。application
log,或user activity log就不同,因为有用的数据往往分散在很多message里 (像我
上面的例子),不管你是用什么message broker, 在consumer这端需要从新group,经常
需要把来自同一个request乃至同一个user的message数据合在一起,这才是我需要解决
的,因为我不像想在app端大改,所以选择用server name做message tag,和kafka
partition key (我用的是fluentd),这样同一个server的message就能被同一个
consumer处理。 | c*********e 发帖数: 16335 | 7 能按照topic来group吗?
application
【在 m***h 的大作中提到】 : 是的,我的问题不是关于架构,拿轮子搭积木不难。在log处理这方面,syslog, : access log之类都很简单,因为都是one liner,well defined format。application : log,或user activity log就不同,因为有用的数据往往分散在很多message里 (像我 : 上面的例子),不管你是用什么message broker, 在consumer这端需要从新group,经常 : 需要把来自同一个request乃至同一个user的message数据合在一起,这才是我需要解决 : 的,因为我不像想在app端大改,所以选择用server name做message tag,和kafka : partition key (我用的是fluentd),这样同一个server的message就能被同一个 : consumer处理。
|
|