一个分布式发布-订阅消息传递系统

特点:

高吞吐量、低延迟

使用场景(举例):

日志收集:用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();
}
}

kafka各组件说明:

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环境安装及简单使用(单机版)的更多相关文章

  1. Django学习笔记(一):环境安装与简单实例

    Django学习笔记(一):环境安装与简单实例 通过本文章实现: Django在Windows中的环境安装 Django项目的建立并编写简单的网页,显示欢迎语与当前时间 一.环境安装 结合版本兼容性等 ...

  2. Python之路-python环境安装和简单的语法使用

    一.环境安装 Win10(安装python3.x): 1.下载安装包     https://www.python.org/downloads/   2.安装完成后设置环境变量. 桌面-“计算机”-右 ...

  3. hadoop环境安装及简单Map-Reduce示例

    说明:这篇博客来自我的csdn博客,http://blog.csdn.net/lxxgreat/article/details/7753511 一.参考书:<hadoop权威指南--第二版(中文 ...

  4. Spark——Standalone 环境安装及简单使用

    Standalone 环境安装 将 spark-3.0.0-bin-hadoop3.2.tgz 文件解压缩在指定位置(/opt/module) tar -zxvf spark-3.0.0-bin-ha ...

  5. 01 - Jmeter4.x环境安装以及简单使用

    Jmeter 介绍 Apache JMeter应用程序是开源软件,旨在为负载测试功能行为和测量性能的100%纯Java应用程序.它最初是为测试Web应用程序而设计的,但后来扩展到其他测试功能 常用压力 ...

  6. Kafka入门 --安装和简单实用

    一.安装Zookeeper 参考: Zookeeper的下载.安装和启动 Zookeeper 集群搭建--单机伪分布式集群 二.下载Kafka 进入http://kafka.apache.org/do ...

  7. linux下expect环境安装以及简单脚本测试

    expect是交互性很强的脚本语言,可以帮助运维人员实现批量管理成千上百台服务器操作,是一款很实用的批量部署工具!expect依赖于tcl,而linux系统里一般不自带安装tcl,所以需要手动安装 下 ...

  8. kafka环境安装

    源码包下载: http://archive.apache.org/dist/kafka/1.0.0/ 集群环境: master 192.168.1.99 slave1 192.168.1.100 sl ...

  9. RF环境安装-mac-osx10.10-基础环境-安装指南

    一.适用环境: mac系列,osx10.10,自带Python 二.简要步骤: 1. 安装pip,mac自带Python环境,所以我们改成安装pip 2. 安装wxPython,此处我下载的版本是wx ...

随机推荐

  1. EF6中的SQL监控

    在MVC或WEBAPI中的监控 System.Action<string> action = (string message) => { Debug.WriteLine(messag ...

  2. Python使用偏函数与类实现装饰器

    # -*- coding: utf-8 -*- # author:baoshan # python对某个对象是否能通过装饰器形式使用只有一个要求:decorator必须是一个可被调用的对象. # 我们 ...

  3. 系统运维工程师装逼完全指南(转载Mark)

    1.全球化的认证有助于提升逼格,什么OCM.CCIE.RHCA.CISSP等等能考都考,再不济,也要有一张系统架构设计师或者网络规划设计师的信产部认证.每过一个认证,逼格提升一档. 2.TCP/IP协 ...

  4. IO多路复用(select、poll、epoll)介绍及select、epoll的实现

    IO多路复用(select.poll.epoll)介绍及select.epoll的实现 IO多路复用中包括 select.pool.epoll,这些都属于同步,还不属于异步 一.IO多路复用介绍 1. ...

  5. 学习数据结构Day2

    之前学习过了数组的静态实现方法,同时将数组的所有有可能实现的方法都统一实现了一遍,之后支持了泛型的相关 概念,接下来就是如何对数组进行扩容的操作也就是实现动态数组. private void resi ...

  6. Java基础笔试练习(十二)

    1.(C#.JAVA)扩展方法能访问被扩展对象的public成员 A.能 B.不能 答案: A 解析: 翻译一下,子类方法是否能够访问父类中的public成员. 2.如果子类要调用父类的构造函数,则通 ...

  7. 16 IO流(十三)——Object流 序列化与反序列化

    Object流.序列化与反序列化 Object流是将 可序列化的对象 进行序列化与反序列化的流. 可序列化的对象:使用关键字Serializable修饰,表示这个对象可以进行序列化与反序列化. 序列化 ...

  8. ubuntu 使用新添加的用户登录只有$解决方法

    在ubuntu中,使用useradd新建的用户,默认使用的shell是dash,导致界面不美观,操作也不舒服. 情况如下: 只有美元符,不显示用户,很多乱码,且文件没有颜色. 解决方法,将该用户使用的 ...

  9. docker(一): 安装

    开始 docker是一个可以帮助开发者使用容器(containers)开发.部署和运行应用程序的平台.llinux下使用容器部署系统称为containerization. container 是映像( ...

  10. 【转】基于FPGA的Sobel边缘检测的实现

    前面我们实现了使用PC端上位机串口发送图像数据到VGA显示,通过MATLAB处理的图像数据直接是灰度图像,后面我们在此基础上修改,从而实现,基于FPGA的动态图片的Sobel边缘检测.中值滤波.Can ...