Kafka:
Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景:比如基于hadoop的批处理系统、低延迟的实时系统、storm/Spark流式处理引擎,web/nginx日志、访问日志,消息服务等等,用scala语言编写,Linkedin于2010年贡献给了Apache基金会并成为顶级开源 项目。
1.1 Kafka的特性:
- 高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒,每个topic可以分多个partition, consumer group 对partition进行consume操作。
- 可扩展性:kafka集群支持热扩展
- 持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失
- 容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败)
- 高并发:支持数千个客户端同时读写
- 1.2 Kafka的使用场景:
- 日志收集:一个公司可以用Kafka可以收集各种服务的log,通过kafka以统一接口服务的方式开放给各种consumer,例如hadoop、Hbase、Solr等。
- 消息系统:解耦和生产者和消费者、缓存消息等。
- 用户活动跟踪:Kafka经常被用来记录web用户或者app用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到kafka的topic中,然后订阅者通过订阅这些topic来做实时的监控分析,或者装载到hadoop、数据仓库中做离线分析和挖掘。
- 运营指标:Kafka也经常用来记录运营监控数据。包括收集各种分布式应用的数据,生产各种操作的集中反馈,比如报警和报告。
- 流式处理:比如spark streaming和storm
- 事件源
在使用kafka之前首先启动zookeeper和配置kafka的broker (相当于经纪人)和ip地址
1
bin/zookeeper-server-start.sh config/zookeeper.properties
发现这是一个前台的 我们在启动配置的server2 (这是server.server.properties复制出来配置的)
bin/kafka-server-start.sh config/server2.properties
然后我们就可以看到我们启动的broker的id了
启动完成后我们就可以做一个启动卡,用来连接发消息,创建一个topic
3.
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
主题创建已成功
4.我们在到zookeeper里面看一下我们创建的topic
bin/kafka-topics.sh --list --zookeeper localhost:2181
5.下面我们在启动一个生产者 producer “直播间” 我们现在这里面说两句话
bin/kafka-console-producer.sh --broker-list 192.168.184.124:9092 --topic test
6.在启动一个消费者consumer (观看者) 这样我们就能看到直播间说的话了
bin/kafka-console-consumer.sh --bootstrap-server 192.168.184.124:9092 --topic test --from-beginning
7.在启动一个消费者 同上面一个比较 去掉beginning 是看不到之前的未读信息的
bin/kafka-console-consumer.sh --bootstrap-server 192.168.184.124:9092 --topic test
API使用:使用api发送消息 先导入kafka-clients
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>2.1.0</version>
</dependency>
object MyKafkaProducer extends App {
val props = new Properties()
props.put("bootstrap.servers","192.168.184.124:9092")
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
val producer = new KafkaProducer[String,String](props);
var i = 0L;
while (true){
println(i)
val pr = new ProducerRecord[String,String]("test",i.toString);
producer.send(pr);
Thread.sleep(300)
i+=1;
}
然后我们就可以看到数据了
API收取信息
object KafkaConsumer extends App {
val props = new util.HashMap[String,Object]();
props.put("bootstrap.servers","192.168.184.124:9092");
props.put("group.id", "test");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
val consumer = new KafkaConsumer[String,String](props);
consumer.subscribe(util.Arrays.asList("test"))
while(true){
val rs:ConsumerRecords[String,String] = consumer.poll(Duration.ofMillis(1000))
val it = rs.iterator()
while(it.hasNext){
println(it.next())
}
}
一边kafkaProducer生产,另一边kafkaConsumer就可以收到信息了