Kafka简介及使用
一、Kafka概述
离线部分:
Hadoop->离线计算(hdfs / mapreduce) yarn
zookeeper->分布式协调(动物管理员)
hive->数据仓库(离线计算 / sql)easy coding
flume->数据采集
sqoop->数据迁移mysql->hdfs/hive hdfs/hive->mysql
Azkaban->任务调度工具
hbase->数据库(nosql)列式存储 读写速度
实时:
kafka
storm
官网:
http://kafka.apache.org/
ApacheKafka®是一个分布式流媒体平台
流媒体平台有三个关键功能:
发布和订阅记录流,类似于消息队列或企业消息传递系统。
以容错的持久方式存储记录流。
记录发生时处理流。
Kafka通常用于两大类应用:
构建可在系统或应用程序之间可靠获取数据的实时流数据管道
构建转换或响应数据流的实时流应用程序
二、kafka是什么?
在流计算中,kafka主要功能是用来缓存数据,storm可以通过消费kafka中的数据进行流计算。
是一套开源的消息系统,由scala写成。支持javaAPI的。
kafka最初由LinkedIn公司开发,2011年开源。
2012年从Apache毕业。
是一个分布式消息队列,kafka读消息保存采用Topic进行归类。
角色
发送消息:Producer(生产者)
接收消息:Consumer(消费者)
三、为什么要用消息队列
1)解耦
为了避免出现问题
2)拓展性
可增加处理过程
3)灵活
面对访问量剧增,不会因为超负荷请求而完全瘫痪。
4)可恢复
一部分组件失效,不会影响整个系统。可以进行恢复。
5)缓冲
控制数据流经过系统的速度。
6)顺序保证
对消息进行有序处理。
7)异步通信
akka,消息队列提供了异步处理的机制。允许用户把消息放到队列 , 不立刻处理。
四、kafka架构设计
kafka依赖zookeeper,用zk保存元数据信息。
搭建kafka集群要先搭建zookeeper集群。
zk在kafka中的作用?
保存kafka集群节点状态信息和消费者当前消费信息。
Kafka介绍
Kafka架构
五、kafka集群安装部署
1)官网下载安装包
2)上传安装包
把安装包 kafka_2.11-2.0.0.tgz 放置在/root下 3)解压安装包
cd /root
tar -zxvf kafka_2.11-2.0.0.tgz -C hd 4)重命名
cd hd
mv kafka_2.11-2.0.0/ kafka 5)修改配置文件
cd /root/hd/kafka
mkdir logs
cd config
vi server.properties
broker.id=0 #每台机器的id不同即可
delete.topic.enable=true #是否允许删除主题
log.dirs=/root/hd/kafka/logs #运行日志保存位置
zookeeper.connect=hd09-1:2181,hd09-2:2181,hd09-3:2181 6)配置环境变量
vi /etc/profile
最下面添加
#kafka_home
export KAFKA_HOME=/root/hd/kafka
export PATH=$PATH:$KAFKA_HOME/bin 生效环境变量
source /etc/profile 7)分发到其他节点
cd /root/hd
scp -r kafka/ hd09-2:$PWD
scp -r kafka/ hd09-3:$PWD 8)修改其他节点/root/hd/kafka/config/server.properties
broker.id=1 #hd09-2
broker.id=2 #hd09-3 9)启动集群
cd /root/hd/kafka
bin/kafka-server-start.sh config/server.properties &
10)关闭
cd /root/hd/kafka
bin/kafka-server-stop.sh
六、Kafka命令行操作
1)查看当前集群中已存在的主题topic
bin/kafka-topics.sh --zookeeper hd09-1:2181 --list 2)创建topic
bin/kafka-topics.sh --zookeeper hd09-1:2181 --create --replication-factor 3 --partitions 1 --topic study --zookeeper 连接zk集群
--create 创建
--replication-factor 副本
--partitions 分区
--topic 主题名 3)删除主题
bin/kafka-topics.sh --zookeeper hd09-1:2181 --delete --topic study 4)发送消息
生产者启动:
bin/kafka-console-producer.sh --broker-list hd09-1:9092 --topic study
消费者启动:
bin/kafka-console-consumer.sh --bootstrap-server hd09-1:9092 --topic study --from-beginning 5)查看主题详细信息
bin/kafka-topics.sh --zookeeper hd09-1:2181 --describe --topic study
七、Kafka简单API
1、Producer1类---kafka生产者API 接口回调
package com.css.kafka.kafka_producer; import java.util.Properties; import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerRecord; /**
* kafka生产者API
*/
public class Producer1 {
public static void main(String[] args) {
//1.配置生产者属性(指定多个参数)
Properties prop = new Properties(); //参数配置
//kafka节点的地址
prop.put("bootstrap.servers", "192.168.146.132:9092");
//发送消息是否等待应答
prop.put("acks", "all");
//配置发送消息失败重试
prop.put("retries", "0");
//配置批量处理消息大小
prop.put("batch.size", "10241");
//配置批量处理数据延迟
prop.put("linger.ms", "5");
//配置内存缓冲大小
prop.put("buffer.memory", "12341235");
//配置在发送前必须序列化
prop.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
prop.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); //2.实例化producer
KafkaProducer<String, String> producer = new KafkaProducer<String, String>(prop); //3.发送消息
for (int i = 0; i < 99; i++) {
producer.send(new ProducerRecord<String, String>("test", "helloworld" + i));
} //4.释放资源
producer.close();
}
}
2、Producer2类---kafka生产者API 接口回调
package com.css.kafka.kafka_producer; import java.util.Properties; import org.apache.kafka.clients.producer.Callback;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.clients.producer.RecordMetadata; /**
* kafka生产者API 接口回调
*/
public class Producer2 {
public static void main(String[] args) {
//1.配置生产者属性(指定多个参数)
Properties prop = new Properties(); //参数配置
//kafka节点的地址
prop.put("bootstrap.servers", "192.168.146.132:9092");
//发送消息是否等待应答
prop.put("acks", "all");
//配置发送消息失败重试
prop.put("retries", "0");
//配置批量处理消息大小
prop.put("batch.size", "10241");
//配置批量处理数据延迟
prop.put("linger.ms", "5");
//配置内存缓冲大小
prop.put("buffer.memory", "12341235");
//配置在发送前必须序列化
prop.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
prop.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
//自定义分区
prop.put("partitioner.class", "com.css.kafka.kafka_producer.Partition1"); //2.实例化producer
KafkaProducer<String, String> producer = new KafkaProducer<String, String>(prop); //3.发送消息
for (int i = 0; i < 99; i++) {
producer.send(new ProducerRecord<String, String>("yuandan", "nice" + i), new Callback() { public void onCompletion(RecordMetadata metadata, Exception exception) {
//如果metadata不为null 拿到当前的数据偏移量与分区
if(metadata != null) {
System.out.println(metadata.topic() + "----" + metadata.offset() + "----" + metadata.partition());
}
}
});
} //4.关闭资源
producer.close();
}
}
3、Partition1类---设置自定义分区
package com.css.kafka.kafka_producer; import java.util.Map; import org.apache.kafka.clients.producer.Partitioner;
import org.apache.kafka.common.Cluster; /**
* 设置自定义分区
*/
public class Partition1 implements Partitioner{ //设置
public void configure(Map<String, ?> configs) {
} //分区逻辑
public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) {
return 1;
} //释放资源
public void close() {
}
}
4、Consumer1类---消费者API
package com.css.kafka.kafka_consumer; import java.util.Arrays;
import java.util.Properties; import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer; /**
* 消费者类
*/
public class Consumer1 {
public static void main(String[] args) {
//1.配置消费者属性
Properties prop = new Properties(); //2.配置属性
//指定服务器地址
prop.put("bootstrap.servers", "192.168.146.133:9092");
//配置消费者组
prop.put("group.id", "g1");
//配置是否自动确认offset
prop.put("enable.auto.commit", "true");
//序列化
prop.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
prop.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); //2.实例消费者
final KafkaConsumer<String,String> consumer = new KafkaConsumer<String, String>(prop); //4.释放资源 线程安全
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
public void run() {
if (consumer != null) {
consumer.close();
}
}
})); //订阅消息主题
consumer.subscribe(Arrays.asList("test")); //3.拉消息 推push 拉poll
while (true) {
ConsumerRecords<String, String> records = consumer.poll(1000);
//遍历消息
for (ConsumerRecord<String, String> record : records) {
System.out.println(record.topic() + "-----" + record.value());
}
}
}
}
5、Producer3类---kafka生产者API-带拦截器
package com.css.kafka.interceptor; import java.util.ArrayList;
import java.util.Properties; import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.clients.producer.ProducerRecord; /**
* kafka生产者API 带拦截器
*/
public class Producer3 {
public static void main(String[] args) {
//1.配置生产者属性(指定多个参数)
Properties prop = new Properties(); //参数配置
//kafka节点的地址
prop.put("bootstrap.servers", "192.168.146.132:9092");
//发送消息是否等待应答
prop.put("acks", "all");
//配置发送消息失败重试
prop.put("retries", "0");
//配置批量处理消息大小
prop.put("batch.size", "10241");
//配置批量处理数据延迟
prop.put("linger.ms", "5");
//配置内存缓冲大小
prop.put("buffer.memory", "12341235");
//配置在发送前必须序列化
prop.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
prop.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); //拦截器
ArrayList<String> inList = new ArrayList<String>();
inList.add("com.css.kafka.interceptor.TimeInterceptor");
prop.put(ProducerConfig.INTERCEPTOR_CLASSES_CONFIG, inList); //2.实例化producer
KafkaProducer<String, String> producer = new KafkaProducer<String, String>(prop); //3.发送消息
for (int i = 0; i < 99; i++) {
producer.send(new ProducerRecord<String, String>("test", "helloworld" + i));
} //4.释放资源
producer.close();
}
}
6、TimeInterceptor类---拦截器类
package com.css.kafka.interceptor; import java.util.Map; import org.apache.kafka.clients.producer.ProducerInterceptor;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.clients.producer.RecordMetadata; /**
* 拦截器类
*/
public class TimeInterceptor implements ProducerInterceptor<String, String>{ //配置信息
public void configure(Map<String, ?> configs) {
} //业务逻辑
public ProducerRecord<String, String> onSend(ProducerRecord<String, String> record) {
return new ProducerRecord<String, String>(
record.topic(),
record.partition(),
record.key(),
System.currentTimeMillis() + "-" + record.value());
} //发送失败调用
public void onAcknowledgement(RecordMetadata metadata, Exception exception) {
} //关闭资源
public void close() {
}
}
7、kafka的maven依赖
<!-- https://mvnrepository.com/artifact/org.apache.kafka/kafka-clients -->
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>2.0.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.kafka/kafka-streams -->
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-streams</artifactId>
<version>2.0.0</version>
</dependency>
Kafka简介及使用的更多相关文章
- Kafka简介
Kafka简介 转载请注明出处:http://www.cnblogs.com/BYRans/ Apache Kafka发源于LinkedIn,于2011年成为Apache的孵化项目,随后于2012年成 ...
- Kafka简介及使用PHP处理Kafka消息
Kafka简介及使用PHP处理Kafka消息 Kafka 是一种高吞吐的分布式消息系统,能够替代传统的消息队列用于解耦合数据处理,缓存未处理消息等,同时具有更高的吞吐率,支持分区.多副本.冗余,因此被 ...
- Kafka记录-Kafka简介与单机部署测试
1.Kafka简介 kafka-分布式发布-订阅消息系统,开发语言-Scala,协议-仿AMQP,不支持事务,支持集群,支持负载均衡,支持zk动态扩容 2.Kafka的架构组件 1.话题(Topic) ...
- Kafka简介、安装
一.Kafka简介 Kafka是一个分布式.可分区的.可复制的消息系统.几个基本的消息系统术语:1.消费者(Consumer):从消息队列(Kafka)中请求消息的客户端应用程序.2.生产者(Prod ...
- 【Apache Kafka】一、Kafka简介及其基本原理
对于大数据,我们要考虑的问题有很多,首先海量数据如何收集(如Flume),然后对于收集到的数据如何存储(典型的分布式文件系统HDFS.分布式数据库HBase.NoSQL数据库Redis),其次存储 ...
- KafKa简介和利用docker配置kafka集群及开发环境
KafKa的基本认识,写的很好的一篇博客:https://www.cnblogs.com/sujing/p/10960832.html 问题:1.kafka是什么?Kafka是一种高吞吐量的分布式发布 ...
- Apache Kafka简介与安装(二)
Kafka在Windows环境上安装与运行 简介 Apache kafka 是一个分布式的基于push-subscribe的消息系统,它具备快速.可扩展.可持久化的特点.它现在是Apache旗下的一个 ...
- Kafka简介、基本原理、执行流程与使用场景
一.简介 Apache Kafka是分布式发布-订阅消息系统,在 kafka官网上对 kafka 的定义:一个分布式发布-订阅消息传递系统. 它最初由LinkedIn公司开发,Linkedin于201 ...
- Kafka 学习之路(一)—— Kafka简介
一.简介 Apache Kafka是一个分布式的流处理平台.它具有以下特点: 支持消息的发布和订阅,类似于RabbtMQ.ActiveMQ等消息队列: 支持数据实时处理: 能保证消息的可靠性投递: 支 ...
- Kafka 系列(一)—— Kafka 简介
一.简介 ApacheKafka 是一个分布式的流处理平台.它具有以下特点: 支持消息的发布和订阅,类似于 RabbtMQ.ActiveMQ 等消息队列: 支持数据实时处理: 能保证消息的可靠性投递: ...
随机推荐
- jquery文件导入问题
开发前台web,导入jquery文件的时候最好用 <script type="text/javascript" src="path"></sc ...
- RDD缓存学习
首先实现rdd缓存 准备了500M的数据 10份,每份 100万条,存在hdfs 中通过sc.textFile方法读取 val rdd1 = sc.textFile("hdfs://mini ...
- CR, LF, CR/LF区别与关系
前言 在文本处理中,CR(Carriage Return),LF(Line Feed),CR/LF是不同操作系统上使用的换行符,具体如下: Dos和Windows采用回车+换行CR/LF表示下一行 而 ...
- rt serial 的编写
/* * Copyright (C) 2005-2007 Jan Kiszka <jan.kiszka@web.de>. * * Xenomai is free software; you ...
- 实例具体解释Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化(二)
这是本系列的第二篇,内容是 prefetch_related() 函数的用途.实现途径.以及用法. 本系列的第一篇在这里 第三篇在这里 3. prefetch_related() 对于多对多字段(Ma ...
- yum whatprovides host 根据命令查找包
[root@Cobbler ~]# yum whatprovides host Loaded plugins: fastestmirror Loading mirror speeds from cac ...
- could not find com.android.support.appcompat-v7:23.4.0
导入别人的工程到AS中,出现错误,是由于android studio的版本比所加载的工程所使用的版本低,有些包不是最新的. 我的android studio这个包的版本是 v7:23.1.1 所以需要 ...
- 为什么选择使用Spring Cloud而放弃了Dubbo
为什么选择使用Spring Cloud而放弃了Dubbo 可能大家会问,为什么选择了使用Dubbo之后,而又选择全面使用Spring Cloud呢?其中有几个原因: 1)从两个公司的背景来谈:Dubb ...
- 从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射
从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射.Collection 接口又有 3 ...
- sours insight 使用技巧
最终在团队的气氛下还是拿回了source insight编译器: Source Insight实质上是一个支持多种开发语言(java,c ,c 等等)的编辑器,只不过由于其查找.定位.彩色显示等功能的 ...