(一个)kafka-jstorm集群实时日志分析 它 ---------kafka实时日志处理
package com.doctor.logbackextend; import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties; import kafka.consumer.Consumer;
import kafka.consumer.ConsumerConfig;
import kafka.consumer.ConsumerIterator;
import kafka.consumer.KafkaStream;
import kafka.javaapi.consumer.ConsumerConnector; import org.apache.commons.lang.RandomStringUtils;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; /**
* zookeeper 和kafka环境准备好。 本地端口号默认设置
*
* @author doctor
*
* @time 2014年10月24日 下午3:14:01
*/
public class KafkaAppenderTest {
private static final Logger LOG = LoggerFactory.getLogger(KafkaAppenderTest.class); /** 先启动此測试方法,模拟log日志输出到kafka */
@Test
public void test_log_producer() {
while(true){
LOG.info("test_log_producer : " + RandomStringUtils.random(3, "hello doctro,how are you,and you"));
}
} /** 再启动此測试方法。模拟消费者获取日志,进而分析,此方法不过打印打控制台,不是log。防止模拟log測试方法数据混淆 */
@Test
public void test_comsumer(){
Properties props = new Properties();
props.put("zookeeper.connect", "127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183");
props.put("group.id", "kafkatest-group");
// props.put("zookeeper.session.timeout.ms", "400");
// props.put("zookeeper.sync.time.ms", "200");
// props.put("auto.commit.interval.ms", "1000");
ConsumerConfig paramConsumerConfig = new ConsumerConfig(props );
ConsumerConnector consumer = Consumer.createJavaConsumerConnector(paramConsumerConfig ); Map<String, Integer> topicCountMap = new HashMap<>();
topicCountMap.put("kafka-test", new Integer(1));
Map<String, List<KafkaStream<byte[], byte[]>>> consumerStream = consumer.createMessageStreams(topicCountMap);
List<KafkaStream<byte[], byte[]>> streams = consumerStream.get("kafka-test"); for (KafkaStream<byte[], byte[]> stream : streams) {
ConsumerIterator<byte[], byte[]> it = stream.iterator();
while(it.hasNext())
System.out.println(new String("test_comsumer: " + new String(it.next().message())));
} } }
为了实时日志处理互联网系统的日志,对于电商来说具有非常重要的意义,比方,淘宝购物时候,你浏览某些商品的时候。系统后台实时日志处理分析后,系统能够向用户实时推荐给用户相关商品。来引导用户的选择等等。
为了实时日志处理。我们选择kafka集群,日志的处理分析选择jstorm集群,至于jstorm处理的结果,你能够选择保存到数据库里。入hbase、mysql。maridb等。
系统的日志接口选择了slf4j,logback组合,为了让系统的日志可以写入kafka集群,选择扩展logback Appender。在logback里配置一下。就行自己主动输出日志到kafka集群。
kafka的集群安装,在此不介绍了,为了模拟真实性,zookeeper本地集群也安装部署了。
以下是怎样扩展logback Appender
package com.doctor.logbackextend; import java.util.Properties; import kafka.javaapi.producer.Producer;
import kafka.producer.KeyedMessage;
import kafka.producer.ProducerConfig;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.AppenderBase; public class KafkaAppender extends AppenderBase<ILoggingEvent> { private String topic;
private String zookeeperHost; private String broker;
private Producer<String, String> producer;
private Formatter formatter; public String getBroker() {
return broker;
} public void setBroker(String broker) {
this.broker = broker;
}
@Override
protected void append(ILoggingEvent eventObject) {
String message = this.formatter.formate(eventObject);
this.producer.send(new KeyedMessage<String, String>(this.topic, message)); } @Override
public void start() {
if (this.formatter == null) {
this.formatter = new MessageFormatter();
} super.start();
Properties props = new Properties();
props.put("zk.connect", this.zookeeperHost);
props.put("metadata.broker.list", this.broker);
props.put("serializer.class", "kafka.serializer.StringEncoder"); ProducerConfig config = new ProducerConfig(props);
this.producer = new Producer<String, String>(config);
} @Override
public void stop() {
super.stop();
this.producer.close();
} public String getTopic() {
return topic;
} public void setTopic(String topic) {
this.topic = topic;
} public String getZookeeperHost() {
return zookeeperHost;
} public void setZookeeperHost(String zookeeperHost) {
this.zookeeperHost = zookeeperHost;
} public Producer<String, String> getProducer() {
return producer;
} public void setProducer(Producer<String, String> producer) {
this.producer = producer;
} public Formatter getFormatter() {
return formatter;
} public void setFormatter(Formatter formatter) {
this.formatter = formatter;
} /**
* 格式化日志格式
* @author doctor
*
* @time 2014年10月24日 上午10:37:17
*/
interface Formatter{
String formate(ILoggingEvent event);
} public static class MessageFormatter implements Formatter{ @Override
public String formate(ILoggingEvent event) { return event.getFormattedMessage();
} }
}
对于日志的输出格式MessageFormatter没有特殊处理,由于仅仅是模拟一下,你能够制定你的格式,入json等。
在logback.xml的配置例如以下:
<appender name="kafka" class="com.doctor.logbackextend.KafkaAppender">
<topic>kafka-test</topic>
<!-- <zookeeperHost>127.0.0.1:2181</zookeeperHost> -->
<!-- <broker>127.0.0.1:9092</broker> -->
<zookeeperHost>127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183</zookeeperHost>
<broker>127.0.0.1:9092,127.0.0.1:9093</broker>
</appender> <root level="all">
<appender-ref ref="stdout" />
<appender-ref ref="defaultAppender" />
<appender-ref ref="kafka" />
</root>
<zookeeperHost>
我本地启动了三个zookeer。依据配置。你能够知道是怎样配置的吧。
kafka集群的broker我配置了两个,都是在本地机器。
測试代码:
package com.doctor.logbackextend; import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties; import kafka.consumer.Consumer;
import kafka.consumer.ConsumerConfig;
import kafka.consumer.ConsumerIterator;
import kafka.consumer.KafkaStream;
import kafka.javaapi.consumer.ConsumerConnector; import org.apache.commons.lang.RandomStringUtils;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; /**
* zookeeper 和kafka环境准备好。本地端口号默认设置
*
* @author doctor
*
* @time 2014年10月24日 下午3:14:01
*/
public class KafkaAppenderTest {
private static final Logger LOG = LoggerFactory.getLogger(KafkaAppenderTest.class); /** 先启动此測试方法,模拟log日志输出到kafka */
@Test
public void test_log_producer() {
while(true){
LOG.info("test_log_producer : " + RandomStringUtils.random(3, "hello doctro,how are you,and you"));
}
} /** 再启动此測试方法,模拟消费者获取日志,进而分析,此方法不过打印打控制台,不是log。防止模拟log測试方法数据混淆 */
@Test
public void test_comsumer(){
Properties props = new Properties();
props.put("zookeeper.connect", "127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183");
props.put("group.id", "kafkatest-group");
// props.put("zookeeper.session.timeout.ms", "400");
// props.put("zookeeper.sync.time.ms", "200");
// props.put("auto.commit.interval.ms", "1000");
ConsumerConfig paramConsumerConfig = new ConsumerConfig(props );
ConsumerConnector consumer = Consumer.createJavaConsumerConnector(paramConsumerConfig ); Map<String, Integer> topicCountMap = new HashMap<>();
topicCountMap.put("kafka-test", new Integer(1));
Map<String, List<KafkaStream<byte[], byte[]>>> consumerStream = consumer.createMessageStreams(topicCountMap);
List<KafkaStream<byte[], byte[]>> streams = consumerStream.get("kafka-test"); for (KafkaStream<byte[], byte[]> stream : streams) {
ConsumerIterator<byte[], byte[]> it = stream.iterator();
while(it.hasNext())
System.out.println(new String("test_comsumer: " + new String(it.next().message())));
} } }
结果,明天再附上截图。
版权声明:本文博客原创文章,博客,未经同意,不得转载。
(一个)kafka-jstorm集群实时日志分析 它 ---------kafka实时日志处理的更多相关文章
- ELK+zookeeper+kafka+rsyslog集群搭建
前言 环境困境: 1.开发人员无法登陆服务器 2.各系统都有日志,日志数据分散难以查找 3.日志数据量大,查询忙,不能实时 环境要求: 1.日志需要标准化 集群流程图: 角色: 软件: 以 ...
- kafka+zookeeper集群
参考: kafka中文文档 快速搭建kafka+zookeeper高可用集群 kafka+zookeeper集群搭建 kafka+zookeeper集群部署 kafka集群部署 kafk ...
- 分布式实时日志系统(一)环境搭建之 Jstorm 集群搭建过程/Jstorm集群一键安装部署
最近公司业务数据量越来越大,以前的基于消息队列的日志系统越来越难以满足目前的业务量,表现为消息积压,日志延迟,日志存储日期过短,所以,我们开始着手要重新设计这块,业界已经有了比较成熟的流程,即基于流式 ...
- kafka高可用性集群
kafka集群并测试其高可用性 介绍 Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写.Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站 ...
- JStorm集群的安装和使用
0 JStorm概述 JStorm是一个分布式的实时计算引擎.从应用的角度,JStorm应用是一种遵守某种编程规范的分布式应用:从系统角度, JStorm是一套类似MapReduce的调度系统: 从数 ...
- JStorm集群的部署
JStorm是一个类似Hadoop MapReduce的系统,不同的是JStorm是一套基于流水线的消息处理机制,是阿里基于Storm优化的版本,和Storm一样是一个分布式实时计算的系统,从开发角度 ...
- SpringCloud升级之路2020.0.x版-20. 启动一个 Eureka Server 集群
本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford 我们的业务集群结构 ...
- Storm集群启动流程分析
Storm集群启动流程分析 程序员 1.客户端运行storm nimbus时,会调用storm的python脚本,该脚本中为每个命令编写了一个方法,每个方法都可以生成一条相应的Java命令. 命令格式 ...
- Kafka 单节点多Kafka Broker集群
Kafka 单节点多Kafka Broker集群 接前一篇文章,今天搭建一下单节点多Kafka Broker集群环境. 配置与启动服务 由于是在一个节点上启动多个 Kafka Broker实例,所以我 ...
随机推荐
- How to write simple HTTP proxy with Boost.Asio
How to write simple HTTP proxy with Boost.Asio How to write simple HTTP proxy with Boost.Asio Russia ...
- Wi-Fi万能钥匙:说是破解,其实有危险(转)
Wi-Fi 万能钥匙如此危险,怎样做才能让这种可能严重侵害公众利益的 app 在中国消失? 这个“钥匙”为什么能够破解 Wi-Fi?它真的是“破解” Wi-Fi 吗?两年前我就有这个疑问了,原谅我对一 ...
- 4.windows和Linux下创建oracleusername表空间,表,插入数据,用户管理表等操作
进入超级管理员,运行下面命令 Window下创建数据库.表空间,用户,插入数据等操作 -- 01 创建表空间 -- 注意表空间的路径 依据实际安装环境进行调整 CREATE TABLESPACE ts ...
- HBase经常使用操作之namespace
1.介绍 在HBase中,namespace命名空间指对一组表的逻辑分组,类似RDBMS中的database,方便对表在业务上划分.Apache HBase从0.98.0, 0.95.2两个版本号開始 ...
- VC6.0入门使用
软件下载地址 http://pan.baidu.com/s/1qWuqFAO 新建win console 32 project,然后新建header文件.最后新建source cpp文件.如图所看到的
- Thinkphp中field和getField
在数据库查询操作中field和getField方法是使用最频繁的.可是两者是有一定差别的.在这里记录下. field方法是用于定义要查询的字段(支持字段排除). getField方法获取数据表中的某个 ...
- PHP草根论之设计模式-訪问者模式
关于模式本身的概念,请參考网上其他文章 此处仅仅讨论在PHP实际开发过程中的应用 此模式适用范围极为受限,适用情景: 1.适用于项目维护过程,不适用于项目开发过程 2.新增需求,要求为一个/多个类添加 ...
- flex 错误信息类型及解决方法
总结一些经常出现的异常信息及处理方法(会一直持续更新): 异常1: 写actionscript3.0时遇到了错误.报错为:Error #2044: 未处理的 ioError:. text=Error ...
- plist文件读写
- (void)viewDidLoad { [super viewDidLoad]; NSDictionary *dictionary1 = [NSDictionary dictionaryWithO ...
- Java 二次MD5 32位小写加密算法与php页面加密结果相同
最近做的一个项目需要使用MD5加密算法,需要加密的参数有两个.自己先试了几次,算的结果为php页面的不一样,后来与写php页面的同事沟通后,了解到php页面的算法如下: action = " ...