Kafka简介+Kafka Tool使用简介+使用实例

一、kafka主要特点如下

  1. 同时为发布和订阅提供高吞吐量。 Kafka 的设计目标是以时间复杂度为 0(1 )的方式提 供消息持久化能力的 , 即使对 TB 级别以上数据也能保证常数时间的访 问 性能 ,即使 在非常廉价的商用机器上也能做到单机支持每秒 lOOK 条消息的传输。

  2. 消息持久化。 将消息持久化到磁盘 , 因此可用于批量消费 ,例如 ETL 以及实时应用程 序。 通过将数据持久化到硬盘以及复制可 以防止数据丢失 。

  3. 分布式。支持服务器间的消息分区及分布式消费 ,同时保证每个 Partition 内的消息顺 序传输。 其 内 部 的 Producer、 Broker 和 Consumer 都是分布式架构,这更易于 向外扩展。

  4. 消费消息采用 Pull 模式 。 消息被处理的状态是在 Consumer 端维护的,而不是由服务 器端维护, Broker 无状态 , Consumer 自己保存 offset。

  5. 支持 Online 和 Offiine 场景 ,同时支持离线数据处理和实时数据处理。

    二、kafka基本参数概念

    1. Broker:Kafka 集群中 的一 台或多 台服务器 。

    2. Topic:发布到 Kafka 的每条消息都有一个类别,这个类别就被称为 Topic (物理上 ,不同 Topic 的消息分开存储;逻辑上,虽然一个 Topic 的消息被保存在一个或多个 Broker 上 , 但用户只需指定消息的 Topic 即可生产或消费数据 , 而不必关心数据存于何处)。

    3. Partition :物理上的 Topic 分区 , 一个 Topic 可以分为 多个 Partition , 每个 Partition 都是 一个有序的队列 。 Partition 中的每条消息都会被分配-个有序的 ID ( offset )。

    4. Producer:消 息和数据的生产者,可 以理解为向 Kafka 发消息的客户端。

    5. Consumer:消息和数据的消费者 ,可以理解为从 Kafka 取消息的客户端。

    6. Consumer Group (消费者组):每个消费者都属于一个特定 的消费者组(可为每个消 费 者指定组名, 若不指定组名,则属于默认的组) 。这是 Kafka 用来实现一个 Topic 消 息 的广播(发送给所有 的消 费者〉 和单播(发送给任意一个消 费者) 的手段 。 一个 Topic 可以有多个消费者组 。 Topic 的消息会被复制(不是真的 复制, 是概念上的)到所有的 消费者组中,但每个消费者组只会把消息发送给该组中的一个消费者。如果要实现广 播 , 只要每个消费者都有一个独立的消费者组就可以了;如果要实现单播,只要所有 的消费者都在同一个消费者组中就行。使用消费者组还可以对消费者进行自由分组, 而不需要多次发送消息到不同的 Topic 。

    三、kafka可视化客户端工具(Kafka Tool)的基本使用

    1. 下载地址http://www.kafkatool.com/download.html

    2. 安装:选择对应版本,傻瓜式安装即可。

    3. 简单使用:

      1. 连接kafka:


        image.png
      2. 配置以字符串的形式显示kafka消息体:

      注意:更改完Content Types,要点击Update和Refresh按钮

      image-20200708162806709.png

image.png

Kafka Tool工具详细使用访问地址:https://www.cnblogs.com/frankdeng/p/9452982.html

四、Kafka的安装##

详细安装访问:https://www.jianshu.com/p/c74e0ec577b0
macOS 可以用homebrew快速安装,访问地址:https://www.jianshu.com/p/cddd25da8061

五、Kafka—topic的查询和创建##

原文链接:https://www.jianshu.com/p/06884c5bf3f1
查看topic列表:

[root@shtest01 ~]# /usr/lib/kafka/bin/./kafka-topics.sh --list --zookeeper localhost:2181/kafka

创建topic:

[root@shtest01 ~]# /usr/lib/kafka/bin/./kafka-topics.sh --create --topic topictest03 --replication-factor 1 --partitions 1 --zookeeper host01:2181,host02:2181,host03:2181/kafka
Created topic "topictest03".

--create:创建命令;
--topic:后面指定topic名称;
--replication-factor:后面指定副本数;
--partitions:指定分区数,根据broker的数量决定;
--zookeeper:后面指定zookeeper.connect的zk链接
查看某个topic:

[root@shtest01 ~]# /usr/lib/kafka/bin/./kafka-topics.sh --zookeeper localhost:2181/kafka --topic topictest03 --describe
Topic:topictest03       PartitionCount:1        ReplicationFactor:1     Configs:
        Topic: topictest03      Partition: 0    Leader: 1001    Replicas: 1001  Isr: 1001

五、Java 访问 Kafka 实例

Kafka 作为消息系统的一种, 当然可 以像其他消 息中 间件一样作为消息数据中转的平台。 下面以 Java 语言为例,看一下如何使用 Kafka 来发送和接收消息。
1、引入依赖

<!-- https://mvnrepository.com/artifact/org.apache.kafka/kafka-clients -->
        <dependency>
            <groupId>org.apache.kafka</groupId>
            <artifactId>kafka-clients</artifactId>
            <version>0.11.0.3</version>
        </dependency>

2、消息生产者

public class ProducerSample {

    public static void main(String[] args) {
        Map<String,Object> props = new HashMap<String,Object>();
        props.put("bootstrap.servers","localhost:9092");
        props.put("key.serializer","org.apache.kafka.common.serialization.StringSerializer");
        props.put("value.serializer","org.apache.kafka.common.serialization.StringSerializer");
        props.put("key.deserializer","org.apache.kafka.common.serialization.StringDeserializer");
        props.put("value.deserializer","org.apache.kafka.common.serialization.StringDeserializer");
        props.put("zk.connect","127.0.0.1:2181");

        String topic= "test-topic";

        Producer<String,String> producer = new KafkaProducer<String, String>(props);
        producer.send(new ProducerRecord<String, String>(topic,"idea-key2","java-message 1"));
        producer.send(new ProducerRecord<String, String>(topic,"idea-key2","java-message 2"));
        producer.send(new ProducerRecord<String, String>(topic,"idea-key2","java-message 3"));
        producer.close();
    }

}

示例 中用 KafkaProducer 类来创建一个消息生产者,该类的构造函数入参是一系列属性值。下面看一下这些属性具体都是什么含义。

bootstrap.servers 表示 Kafka 集群 。 如果集群中有多台物理服务器,则服务器地址之间用逗号分隔, 比如” 192.168.1.1 :9092,192.168.1.2:9092” 。 localhost 是笔者电脑的地址,9092 是 Kafka 服务器默认监听的端口号。

key.serializervalue.serializer 表示消息的序列化类型 。 Kafka 的消息是以键值对的形式发送到 Kafka 服务器的,在消息被发送到服务器之前,消息生产者需要把不同类型的 消息序列化为 二 进制类型,示例中是发送文本消息到服务器 , 所以使用的是StringSerializer。

key.deserializervalue.deserializer 表示消息的反序列化类型。把来自 Kafka 集群的二进制消 息反序列 化 为指定 的 类型,因为序列化用的是String类型,所以用StringDeserializer 来反序列化。
zk.connect 用于指定 Kafka 连接 ZooKeeper 的 URL ,提供了基于 ZooKeeper 的集群服务器自动感知功能, 可以动态从 ZooKeeper 中读取 Kafka 集群配置信息。

有 了 消息生产者之后 , 就可以调用 send 方法发送消息了。该方法的入参是 ProducerRecord类型对象 , ProducerRecord 类提供了多种构造函数形参,常见的有如下三种 :

ProducerRecord(topic,partition,key,value);

ProducerRecord(topic,key,value);

ProducerRecord(topic, value);

其中 topic 和 value 是必填的, partition 和 key 是可选的 。如果指定了 pa时tion,那么消息会被发送至指定的 partition ;如果没指定 partition 但指定了 Key,那么消息会按照 hash(key)发送至对应的 partition: 如果既没指定 partition 也没指定 key,那么 消息会按照 round-robin 模式发送(即以轮询的方式依次发送〉到每一个 partition。示例中将向 test-topic 主题发送三条消息。

3、消息消费者

public class ConsumerSample {

    public static void main(String[] args) {
        String topic = "test-topic";
        Properties props = new Properties();
        props.put("bootstrap.servers","localhost:9092");
        props.put("group.id","testGroup1");
        props.put("enable.auto.commit","true");
        props.put("auto.commit.interval.ms","1000");
        props.put("key.deserializer","org.apache.kafka.common.serialization.StringDeserializer");
        props.put("value.deserializer","org.apache.kafka.common.serialization.StringDeserializer");

        Consumer<String,String> consumer = new KafkaConsumer<String, String>(props);
        consumer.subscribe(Arrays.asList(topic));
        while (true){
            ConsumerRecords<String, String> records = consumer.poll(100);
            for (ConsumerRecord<String, String> record : records) {
                System.out.printf("partition = %d,offset = %d,key = %s,value = %s%n",record.partition(),record.offset(),record.key(),record.value());
            }
        }

    }

}

和消息生产者类似,这里用 KafkaConsumer 类来创建一个消息消费者,该类的构造函数入参也是一系列属性值。

bootstrap. servers 和生产者一样,表示 Kafka 集群。

group.id 表示消费者的分组 ID。

enable.auto.commit 表示 Consumer 的 offset 是否自 动提交 。

auto.commit.interval .ms 用于设置自动提交 offset 到 ZooKeeper 的时间间隔,时间单位是毫秒。

key. deserializervalue.deserializer 表示用字符串来反序列化消息数据。

消息消费者使用 subscribe 方法订阅了 Topic 为 test-topic 的消息。 Consumer 调用poll 方法来轮询 Kafka 集群的消息, 一直等到 Kafka 集群中没有消息或达到超时时间(示例中设置超时时间为 100 毫秒)为止 。 如果读取到消息,则打印出消息记录的 pa此ition, offset、key 等。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,258评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,335评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,225评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,126评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,140评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,098评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,018评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,857评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,298评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,518评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,400评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,993评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,638评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,661评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352