大数据求索(9): log4j + flume + kafka + spark streaming实时日志流处理实战
一、实时流处理
1.1 实时计算
跟实时系统类似(能在严格的时间限制内响应请求的系统),例如在股票交易中,市场数据瞬息万变,决策通常需要秒级甚至毫秒级。通俗来说,就是一个任务需要在非常短的单位时间内计算出来,这个计算通常是多次的。
1.2 流式计算
通常指源源不断的数据流过系统,系统能够不停地连续计算。这里对时间上可能没什么特别限制,数据流入系统到产生结果,可能经过很长时间。比如系统中的日志数据、电商中的每日用户访问浏览数据等。
1.3 实时流式计算
将实时计算和流式数据结合起来,就是实时流式计算,也就是大数据中通常说的实时流处理。数据源源不断的产生的同时,计算时间上也有了严格的限制。比如,目前电商中的商品推荐,往往在你点了某个商品之后,推荐的商品都是变化的,也就是实时的计算出来推荐给你的。再比如你的手机号,在你话费或者流量快用完时,实时的给你推荐流量包套餐等。
二、实时流处理实战
此例子借鉴慕课网实战视频Spark Streaming实时流处理项目实战,感兴趣的可以学习一下。
2.1 源源不断的数据
此处使用log4j模拟源源不断产生的日志数据,启动一个进程,不停地打印数据即可。简单配置如下:
log4j.rootLogger=INFO,stdout,flume
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.target = System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{
yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n
然后写一个简单的日志打印小程序即可,代码如下:
public class LoggerGenerator {
private static Logger logger = Logger.getLogger(LoggerGenerator.class.getName());
public static void main(String[] args) throws InterruptedException {
int index = 0;
while (true) {
Thread.sleep(1000);
logger.info("value : " + index++);
}
}
}
2.2 实时采集数据
可以采用Flume实时采集日志数据,为了和log4j结合,log4j配置文件需要如下配置
log4j.rootLogger=INFO,stdout,flume
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.target = System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{
yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n
log4j.appender.flume = org.apache.flume.clients.log4jappender.Log4jAppender
log4j.appender.flume.Hostname = wds
log4j.appender.flume.Port = 41414
log4j.appender.flume.UnsafeMode = true
同时,flume配置如下,
agent1.sources=avro-source
agent1.channels=logger-channel
agent1.sinks=logger-sink
# define source
agent1.sources.avro-source.type=avro
agent1.sources.avro-source.bind=0.0.0.0
agent1.sources.avro-source.port=41414
# define channel
agent1.channels.logger-channel.type=memory
#define sink
agent1.sinks.logger-sink.type = logger
agent1.sources.avro-source.channels=logger-channel
agent1.sinks.logger-sink.channel=logger-channel
这里暂时采用logger sink, 目的是为了测试数据能否采集到。做项目的过程中,不要想着一步到位,最好做一步测试一步,方