kafka环境安装及简单使用(单机版)
一个分布式发布-订阅消息传递系统
特点:
高吞吐量、低延迟
使用场景(举例):
日志收集:用kafka收集各种服务产生的log,通过kafka以统一的接口服务的方式开放给各种consumer,如hadoop,hbase等
下载安装:
1.下载地址 选择一个版本的kafka进行下载
2.解压
tar -zxvf kafka_2.-0.9.0.1.tgz
mv kafka_2.-0.9.0.1 /opt/
3.配置环境变量(可选步骤)
上手使用:
1.config目录配置文件(zookeeper.properties,service.properties,producer.properties,consumer.properties)
我们暂时先不管这些配置文件,遵守初始的配置
2.先启动zookeeper - kafka依赖与zookeeper 实现分布式一致性
我们下载的kafka安装包,就自带了zookeeepr,zookeeper.properties就是自带的zk的配置文件
nohup bin/zookeeper-server-start.sh config/zookeeepr.properties& nohup &是实现在后台启动
3.再启动kafka服务
bin/kafka-server-start.sh config/server.properties
4.创建一个Topic
bin/kafka-topics.sh --create --topic test1 --zookeeper localehost: --config max.message.bytes= --config flush.messages= --partitions --replication-factor
4.再启动kafka生产端
bin/kafka-console-producer.sh --broker-list localhost: --topic test1
5.在新窗口再启动kafka消费端
bin/kafka-console-consumer.sh --zookeeper localhost: --topic test1 --from-beginning
6.在生产窗口输入任意字符,观察在消费端是否能够收到相应字符
如果无法收到正确字符,或者报错,尝试从以下方面排查:
1.服务是否都按顺序正常启动
2.命令中开启的服务端口是否和相应的配置文件中的配置对应
注:生产端访问的端口不是 zookeeper的localhost:2181, 而是producer.properties中配置的broker的端口,默认为9092
注:这个broker的端口是需要在 server中有相应的配置才可以
简单介绍一下上面提到了config目录下面的配置,以及kafka集群的搭建
server.properties:一个server.properties文件代表了一个kafka服务,也就是一个Broker
所以说,如果我们想搭建一个kafka集群,需要有不同的 server.properties文件,来启动多个broker,多个borker组成kafka cluster
注:每个server.properties配置文件中的 broker.id(服务器唯一标识)不能一样
port(服务器监听端口号)不能一样
zookeeper.connect(zookeeper的连接ip及端口),需和zookeeper.properties保持一致
kafka在Java程序的简单示例:
生产:
public class JavaKafkaProducer {
private Logger logger = Logger.getLogger(JavaKafkaProducer.class);
public static final String TOPIC_NAME = "test1";
public static final char[] charts = "qazwsxedcrfvtgbyhnujmikolp1234567890".toCharArray();
public static final int chartsLength = charts.length;
public static void main(String[] args) {
String brokerList = "127.0.0.1:9092";
Properties props = new Properties();
props.put("metadata.broker.list", brokerList);
/**
* 0表示不等待结果返回<br/>
* 1表示等待至少有一个服务器返回数据接收标识<br/>
* -1表示必须接收到所有的服务器返回标识,及同步写入<br/>
* */
props.put("request.required.acks", "0");
/**
* 内部发送数据是异步还是同步
* sync:同步, 默认
* async:异步
*/
props.put("producer.type", "async");
/**
* 设置序列化的类
* 可选:kafka.serializer.StringEncoder
* 默认:kafka.serializer.DefaultEncoder
*/
props.put("serializer.class", "kafka.serializer.StringEncoder");
/**
* 设置分区类
* 根据key进行数据分区
* 默认是:kafka.producer.DefaultPartitioner ==> 安装key的hash进行分区
* 可选:kafka.serializer.ByteArrayPartitioner ==> 转换为字节数组后进行hash分区
*/
props.put("partitioner.class", "com.kafka.JavaKafkaProducerPartitioner");
// 重试次数
props.put("message.send.max.retries", "3");
// 异步提交的时候(async),并发提交的记录数
props.put("batch.num.messages", "200");
// 设置缓冲区大小,默认10KB
props.put("send.buffer.bytes", "102400");
// 2. 构建Kafka Producer Configuration上下文
ProducerConfig config = new ProducerConfig(props);
// 3. 构建Producer对象
final Producer<String, String> producer = new Producer<String, String>(config);
// 4. 发送数据到服务器,并发线程发送
final AtomicBoolean flag = new AtomicBoolean(true);
int numThreads = 50;
ExecutorService pool = Executors.newFixedThreadPool(numThreads);
for (int i = 0; i < 5; i++) {
pool.submit(new Thread(new Runnable() {
@Override
public void run() {
while (flag.get()) {
// 发送数据
KeyedMessage message = generateKeyedMessage();
producer.send(message);
System.out.println("发送数据:" + message);
// 休眠一下
try {
int least = 10;
int bound = 100;
Thread.sleep(ThreadLocalRandom.current().nextInt(least, bound));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + " shutdown....");
}
}, "Thread-" + i));
}
// 5. 等待执行完成
long sleepMillis = 600000;
try {
Thread.sleep(sleepMillis);
} catch (InterruptedException e) {
e.printStackTrace();
}
flag.set(false);
// 6. 关闭资源
pool.shutdown();
try {
pool.awaitTermination(6, TimeUnit.SECONDS);
} catch (InterruptedException e) {
} finally {
producer.close(); // 最后之后调用
}
}
/**
* 产生一个消息
*
* @return
*/
private static KeyedMessage<String, String> generateKeyedMessage() {
String key = "key_" + ThreadLocalRandom.current().nextInt(10, 99);
StringBuilder sb = new StringBuilder();
int num = ThreadLocalRandom.current().nextInt(1, 5);
for (int i = 0; i < num; i++) {
sb.append(generateStringMessage(ThreadLocalRandom.current().nextInt(3, 20))).append(" ");
}
String message = sb.toString().trim();
return new KeyedMessage(TOPIC_NAME, key, message);
}
/**
* 产生一个给定长度的字符串
*
* @param numItems
* @return
*/
private static String generateStringMessage(int numItems) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < numItems; i++) {
sb.append(charts[ThreadLocalRandom.current().nextInt(chartsLength)]);
}
return sb.toString();
}
}
消费:
public class JavaKafkaConsumerHighAPITest {
public static void main(String[] args) {
String zookeeper = "127.0.0.1";
String groupId = "test-consumer-group";
String topic = "test1";
int threads = 1;
JavaKafkaConsumerHighAPI example = new JavaKafkaConsumerHighAPI(topic, threads, zookeeper, groupId);
new Thread(example).start();
// 执行10秒后结束
int sleepMillis = 600000;
try {
Thread.sleep(sleepMillis);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 关闭
example.shutdown();
}
}
1.Broker -- 每个kafka server称为一个Broker,多个borker组成kafka cluster。
2.Topic -- Topic 就是消息类别名,一个topic中通常放置一类消息。每个topic都有一个或者多个订阅者,也就是消息的消费者consumer。
Producer将消息推送到topic,由订阅该topic的consumer从topic中拉取消息。
一个Broker上可以创建一个或者多个Topic。同一个topic可以在同一集群下的多个Broker中分布。
....
参考博文:http://www.cnblogs.com/liuming1992/tag/Kafka/
kafka环境安装及简单使用(单机版)的更多相关文章
- Django学习笔记(一):环境安装与简单实例
Django学习笔记(一):环境安装与简单实例 通过本文章实现: Django在Windows中的环境安装 Django项目的建立并编写简单的网页,显示欢迎语与当前时间 一.环境安装 结合版本兼容性等 ...
- Python之路-python环境安装和简单的语法使用
一.环境安装 Win10(安装python3.x): 1.下载安装包 https://www.python.org/downloads/ 2.安装完成后设置环境变量. 桌面-“计算机”-右 ...
- hadoop环境安装及简单Map-Reduce示例
说明:这篇博客来自我的csdn博客,http://blog.csdn.net/lxxgreat/article/details/7753511 一.参考书:<hadoop权威指南--第二版(中文 ...
- Spark——Standalone 环境安装及简单使用
Standalone 环境安装 将 spark-3.0.0-bin-hadoop3.2.tgz 文件解压缩在指定位置(/opt/module) tar -zxvf spark-3.0.0-bin-ha ...
- 01 - Jmeter4.x环境安装以及简单使用
Jmeter 介绍 Apache JMeter应用程序是开源软件,旨在为负载测试功能行为和测量性能的100%纯Java应用程序.它最初是为测试Web应用程序而设计的,但后来扩展到其他测试功能 常用压力 ...
- Kafka入门 --安装和简单实用
一.安装Zookeeper 参考: Zookeeper的下载.安装和启动 Zookeeper 集群搭建--单机伪分布式集群 二.下载Kafka 进入http://kafka.apache.org/do ...
- linux下expect环境安装以及简单脚本测试
expect是交互性很强的脚本语言,可以帮助运维人员实现批量管理成千上百台服务器操作,是一款很实用的批量部署工具!expect依赖于tcl,而linux系统里一般不自带安装tcl,所以需要手动安装 下 ...
- kafka环境安装
源码包下载: http://archive.apache.org/dist/kafka/1.0.0/ 集群环境: master 192.168.1.99 slave1 192.168.1.100 sl ...
- RF环境安装-mac-osx10.10-基础环境-安装指南
一.适用环境: mac系列,osx10.10,自带Python 二.简要步骤: 1. 安装pip,mac自带Python环境,所以我们改成安装pip 2. 安装wxPython,此处我下载的版本是wx ...
随机推荐
- IDEA版本控制忽略文件或目录
写在前面 废话不多说了, 新创建了个helloworld, 见图: 这谁受得了啊 修改配置 在上图红框内部的后面添加: *.iml;*.idea;*.gitignore;*.sh;*.classpat ...
- jeff dean的主页
https://ai.google/research/people/jeff/ 上面有他的很多论文和ppt 很不错 我于1999年中期加入Google,目前是研究小组的Google高级研究员,负责Go ...
- navicat for mysql 如何设置字段唯一
在设计表时,上面会有索引这一项 点开,在栏位处选择你需要设置的字段,然后选择unique索引类型即可 望采纳,谢谢!
- bim模型中所有IfcWallStandardCase构件
ifc中的IfcWallStandardCase构件 //执行吊装 void startHoisting() { osg::Vec3f vec3f1 = index_node1->getBoun ...
- Spring cloud微服务安全实战-7-9自定义日志采集的格式和内容
怎么来控制输出的日志的格式.并且从日志里面提取出来我想要的一些信息. 整个的message是一个大的json格式字符串. 虽然是可以通过关键字搜索到.但是日志看起来并不舒服. 在我们的控制台,日志实际 ...
- postman跳过登陆直接使用的办法
新版的postman不再是Chrome的插件,而是一个独立的app.下载安装后会提示你注册账户或者登陆.在私有环境,例如实验室,或者单机调试,或者其他VPN隔离的内部环境,无法完成登陆操作. 解决办法 ...
- copyProperties 忽略null值字段
在做项目时遇到需要copy两个对象之间的属性值,但是有源对象有null值,在使用BeanUtils来copy时null值会覆盖目标对象的同名字段属性值,然后采用以下方法找到null值字段,然后忽略: ...
- 【Python学习之六】文件操作
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 python3.6 一.文件的打开与关闭 使用open函数,可以打开一 ...
- 面试必备的10道MySQL题
MySQL 事务,是我们去面试中高级开发经常会被问到的问题,很多人虽然经常使用 MySQL,SQL 语句也写得很溜,但是面试的时候,被问到这些问题,总是不知从何说起.下面我们先来了解一下什么是 MyS ...
- mysql 按照计算值排序
SELECT title,browse_num/exposure_num as click_rate FROM `tf_news` ORDER BY browse_num/exposure_num d ...