【001】- Kafka技术内幕之概述

本篇我们将介绍kafka的一些概念及简单的使用案例。
关注微信公众号,获取更多内容
在这里插入图片描述

一. 简介
在kafka0.10之前,kafka仅仅是一个消息系统,负责消息的发送与接收,解决应用解耦、异步消息、高流量问题。但在0.10之后kafka提供了流处理和连接器的功能,它也从分布消息系统逐渐转变为流式处理平台。
在这里插入图片描述
一个流处理平台应该包含以下单个主要的特性:
(1). 发布订阅消息事件流的记录,类似于消息队列或者企业的消息系统。
(2). 存储事件流数据的节点具有故障容错的特点。
(3). 能够实时处理流式事件。
相关概念:
Kafka运行在可跨越多个数据中心的由一个或多个节点组成的服务器的集群上
Kafka存储记录的目录称为topic,topic是个逻辑概念
每个记录包含了key,value,timestamp
生产者:应用程序发布事件流到Kafka的一个或多个主题
消费者:应用程序订阅Kafka的一个或多个主题,并处理事件流
连接器:将Kafka主题和已有数据源进行连接,数据可以互相导人和导出
流处理:从Kafka主题消费输入流,经过处理后,输出到主题
broker: 一个broker就是一个节点
偏移量:每个分区是一个队列,队列是有序的,队列的下标就是偏移量
分区:Kafka的每个主题都有自己的分区日志,分区日志中存储了topic相关的信息,如下图所示,一个topic有三个分区,每个分区都是该topic的消息,正式因为有了分区才使得kafka具有高吞吐量,高并发。
副本分区:每个分区都有对应的备份,这个备份就称为副本,副本是基于分区而言的,不是针对topic或者主机而言
主副本分区:负责读写消息的分区
ISR:副本同步列表,在下图中,副本分区构成了ISR列表
为了更好的理解,我们画了下图,表示了kafka主要概念之间的关系。
在这里插入图片描述

二. 命令行实践
注:我们以下操作都是基于Ambari2.7.0&HDP3.0的。

  1. 创建主题
    我们创建一个名为beardata的主题,replication-factor备份因子为3,分区数为2,zookeeper参数指定zookeeper地址和端口
    /usr/hdp/3.0.0.0-1634/kafka/bin/kafka-topics.sh --create --zookeeper bigdata000:2181 --replication-factor 3 --partitions 2 --topic beardata
    在这里插入图片描述
  2. 查看主题
    /usr/hdp/3.0.0.0-1634/kafka/bin/kafka-topics.sh --list --zookeeper bigdata000:2181
    在这里插入图片描述
  3. 查看主题详情
    /usr/hdp/3.0.0.0-1634/kafka/bin/kafka-topics.sh --describe --topic beardata --zookeeper bigdata000:2181
    在这里插入图片描述
    topic为beardata,分区数为2,分别是partition0和partition1,副本数为3,Leader表示分区主副本,Replicas表示分区副本节点,Isr表示正在同步的副本节点,它是Replicas的子集
  4. 发送消息到主题
    broker-list表示kafka的broker,即安装kafka的主机和端口
    /usr/hdp/3.0.0.0-1634/kafka/bin/kafka-console-producer.sh --broker-list bigdata000:6667,bigdata002:6667 --topic beardata
    在这里插入图片描述
  5. 消费消息
    /usr/hdp/3.0.0.0-1634/kafka/bin/kafka-console-consumer.sh --topic beardata --bootstrap-server bigdata000:2181
    在这里插入图片描述
    当我们使用上述命令时,并没有收到消息,我们想要接收之前已经发送的消息,需要加参数 --from-beginning
    /usr/hdp/3.0.0.0-1634/kafka/bin/kafka-console-consumer.sh --topic beardata --bootstrap-server bigdata000:6667 --from-beginning
    在这里插入图片描述

三. 代码实践

  1. 生产者
    一个简单的客户端生产消息的例子
    public static void main(String args[]) throws InterruptedException {
    Properties props = new Properties();
    props.put(“bootstrap.servers”, “bigdata000:6667”);
    props.put(“acks”, “all”);
    props.put(“delivery.timeout.ms”, 30000);
    props.put(“batch.size”, 16384);
    props.put(“linger.ms”, 1);
    props.put(“buffer.memory”, 33554432);
    props.put(“key.serializer”, “org.apache.kafka.common.serialization.StringSerializer”);
    props.put(“value.serializer”, “org.apache.kafka.common.serialization.StringSerializer”);
Producer<String, String> producer = new KafkaProducer<String, String>(props);

for (int i = 1; i < 5; i++) {
    producer.send(new ProducerRecord<String, String>("beardata", i + ""));
    System.out.println("send data:" + i + "");
}
producer.close();

}
在这里插入图片描述
2. 消费者
一个简单的消费端消费消息的案例,采用高层API,由服务端控制偏移量
public static void main(String args[]) {
Properties props = new Properties();
props.put(“bootstrap.servers”, “bigdata000:6667”);
props.put(“group.id”, “test”);
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”);
KafkaConsumer<String, String> consumer = new KafkaConsumer<String, String>(props);
consumer.subscribe(Arrays.asList(“beardata”));
while (true) {
ConsumerRecords<String, String> records = consumer.poll(100);
for (ConsumerRecord<String, String> record : records)
System.out.printf(“offset = %d, key = %s, value = %s%n”, record.offset(), record.key(), record.value());
}
}
在这里插入图片描述
3. 流处理
一个简单的word-count例子,单词个数统计
public static void main(String args[]) {
Properties props = new Properties();
props.put(StreamsConfig.APPLICATION_ID_CONFIG, “word-count”);
props.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, “bigdata000:6667”);
props.put(StreamsConfig.KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass().getName());
props.put(StreamsConfig.VALUE_SERDE_CLASS_CONFIG, Serdes.String().getClass().getName());
props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, “earliest”);

    KStreamBuilder builder = new KStreamBuilder();
    KStream<String, String> source = builder.stream("beardata");
    KTable<String, Long> counts = source
            .flatMapValues(new ValueMapper<String, Iterable<String>>() {
                public Iterable<String> apply(String value) {
                    return Arrays.asList(value.toLowerCase(Locale.getDefault()).split(" "));
                }
            }).map(new KeyValueMapper<String, String, KeyValue<String, String>>() {
                public KeyValue<String, String> apply(String key, String value) {
                    return new KeyValue<String, String>(value, value);
                }
            })
            .groupByKey()
            .count("Counts");
    counts.print();
    final KafkaStreams streams = new KafkaStreams(builder, props);

    final CountDownLatch latch = new CountDownLatch(1);
    // attach shutdown handler to catch control-c
    Runtime.getRuntime().addShutdownHook(new Thread("streams-wordcount-shutdown-hook") {
        @Override
        public void run() {
            streams.close();
            latch.countDown();
        }
    });

    try {
        streams.start();
        latch.await();
    } catch (Throwable e) {
        e.printStackTrace();
    }

}

在这里插入图片描述
4. 连接器
如果熟悉flume(后续的系列文章会专门介绍flume),那么就可以把kafka connect理解成是flume,只不过是flume的channel有多种,包括kafka。kafka connect的channel就是kafka
cd /usr/hdp/3.0.0.0-1634/kafka/config
vim connect-file-source.properties,修改topic,我们在这里修改topic为beardata
vim connect-file-sink.properties,修改topic,我们在这里修改topic为beardata
vim connect-standalone.properties,修改bootstrap-server,默认为localhost:9092,在这里我们修改为bigdata000:6667
启动Source Connector和Sink Connector
./bin/connect-standalone.sh config/connect-standalone.properties config/connect-file-source.properties config/connect-file-sink.properties
打开控制台消费指令
/usr/hdp/3.0.0.0-1634/kafka/bin/kafka-console-consumer.sh --bootstrap-server bigdata000:6667 --topic beardata
向connect-file-source.properties中配置的文件中写入数据
在这里插入图片描述
查看控制台消息消费
在这里插入图片描述
查看控制台输出情况
在这里插入图片描述
查看connect-file-sink.properties中配置文件的内容
在这里插入图片描述

以上就是对kafka的概念介绍以及简单的案例演示,下一篇我们将介绍kafka Producer。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值