Apache Kafka 学习

1. 介绍
Kafka是由Apache软件基金会开发的一个开源流处理平台,由ScalaJava编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。 对于像Hadoop一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka的目的是通过Hadoop的并行加载机制来统一线上和离线的消息处理,也是为了通过集群来提供实时的消息。

Kafka  [1] 是一种高吞吐量 [2]  的分布式发布订阅消息系统,有如下特性:
  • 通过O(1)的磁盘数据结构提供消息的持久化,这种结构对于即使数以TB的消息存储也能够保持长时间的稳定性能。
  • 高吞吐量  [2]  :即使是非常普通的硬件Kafka也可以支持每秒数百万 [2]  的消息。
  • 支持通过Kafka服务器和消费机集群来分区消息。
  • 支持 Hadoop并行数据加载。  [3]

相关术语介绍

  • Broker
    Kafka集群包含一个或多个服务器,这种服务器被称为broker  [5] 
  • Topic
    每条发布到Kafka集群的消息都有一个类别,这个类别被称为Topic。(物理上不同Topic的消息分开存储,逻辑上一个Topic的消息虽然保存于一个或多个broker上但用户只需指定消息的Topic即可生产或消费数据而不必关心数据存于何处)
  • Partition
    Partition是物理上的概念,每个Topic包含一个或多个Partition.
  • Producer
    负责发布消息到Kafka broker
  • Consumer
    消息消费者,向Kafka broker读取消息的客户端。
  • Consumer Group
    每个Consumer属于一个特定的Consumer Group(可为每个Consumer指定group name,若不指定group name则属于默认的group)。

     经典案例:http://kafka.apache.org/powered-by
2. 基本概念和组件

  Broker:消息中间件处理结点,一个Kafka节点就是一个broker,多个broker可以组成一个Kafka集群;
  Topic:一类消息,例如page view日志、click日志等都可以以topic的形式存在, Kafka集群能够同时负责多个topic的分发;
  Partition:topic物理上的分组,一个topic可以分为多个 partition,每个partition是一个有序的队;
  Segment:每个 partition又由多个segment file组成;
  offset:每个 partition都由一系列有序的、不可变的消息组成,这些消息被连续的追加到partition中。partition中的每个消息都有一个连续的序列号叫做offset,用于partition唯一标识一条消息;
  message:这个算是kafka文件中最小的存储单位,即是 a commit log。
  topic:创建topic名称
  partition:分区编号
  offset:表示该 partition已经消费了多少message
  logsize:表示该paritition生产了多少的message
  lag:表示有多少条message未被消费
  owner:表示消费者
  create:表示该 partition创建时间
  last seen:表示消费状态刷新最新时间
  查看kafka中生产了,消费了,还剩下多少message,可以使用kafkaoffsetmonitor这个监控插件

       Kafka监控工具KafkaOffsetMonitor配置及使用:https://www.cnblogs.com/dadonggg/p/8242682.html

topics是什么?partition是什么?

    topics是kafka中数据存储的基本单位
    写数据,要指定写入哪个topic 读数据,指定从哪个topic去读
    我们可以这样简单的理解
    topic就类似于数据库中的一张表,可以创建任意多个topic 每一个topic的名字是唯一的

   例如:
   程序A产生了一类消息,然后把这类消息放在kafka group中 ,这由程序A产生的这个消息就叫一个topic
   程序B需要 订阅这个消息,才能成为这个topic的消费者

   每个topic的内部都会有一个或多个partitions(分区)
   你写入的数据,他其实是写入每一个topic里的其中一个partition,并且当前的数据是有序的写入到paritition中的。
   每一个partition内都会维护一个不断增加的ID,每当你写入一个新的数据的时候,这个ID就会增长,这个id就会被称为这个paritition的offset,每个写入partition中的message都会       对应一个offset。
   不同的partition都会对应他们自己的offset 我们可以利用offset来判断,当前paritition内部的顺序,但是我们不能比较来自不同的两个partition的顺序,这是没有意义的
    partition中的数据是有序的,不同partition间的数据丢失了数据的顺序。如果topic有多个partition,消费数据时就不能保证数据的顺序。在需要严格保证消息的消费顺序的场景下,  需要将partition数目设为1。
   每个topic将被分成多个partition(区)

   每个topic将被分成多个partition(区),此外kafka还可以配置partitions需要备份的个数(replicas)

   基于replicated方案,那么就意味着需要对多个备份进行调度;每个partition都有一个server为"leader";leader负责所有的读写操作,如果leader失效,那么将会有其他follower来接管(成为新的leader);follower只是单调的和leader跟进,同步消息即可。由此可见作为leader的server承载了全部的请求压力,因此从集群的整体考虑,有多少个partitions就意味着有多少个"leader",kafka会将"leader"均衡的分散在每个实例上,来确保整体的性能稳定,其中partition leader的位置(host:port)注册在zookeeper中当你将数据写入kafka中,改数据默认情况下会在kafka中保存2个星期。当然,我们可以去配置的。如果是默认的2个星期,超过2个星期的话,kafka里面的数据就会被无效化。这个时候,该数据对应的offset就没有其他的意义了。

   从kafka读取数据后 数据会自动删除吗?
   不会,kafka中数据的删除跟有没有消费者消费完全无关。数据的删除,只跟kafka broker上面的这两个配置有关:
   log.retention.hours=48 #数据最多保存48小时
   log.retention.bytes=1073741824 #数据最多1G

   提示:写入到kafka中的数据,是不可以被改变的。他有一个熟悉就是immutability。也就是说,你没有办法去更改已经写入到kafka中的数据。
   如果你想更新一个数据memssage,那你只能重新写入memssage到kafka中,并且这个新的message会有一个新的offset,以区别于之前写入的message。
   对于每一个写入kafka中的数据,他们会随机的写入到当前topic中的某一个partition内,有一个例外,你提供一个key给当前的数据,这个时候,你就可以用当前的key去控制当前数据应该传入到哪个partition中。

   每一个topic中都可以由多个parititions 这是由你来决定的

   转载于:https://blog.51cto.com/12445535/2411218

3. 安装

  官方下载地址:http://kafka.apache.org/downloads

  学习地址:https://blog.csdn.net/zhouyou1986/article/details/42319461

  硬件准备:一台12G内存的电脑或笔记本,多台电脑硬件
  软件准备:vmware,jdk,wget,Centos7系统镜像,kafka安装包,zookeeper安装包,SecureCRT远程连接工具等
  单机安装:

    1.创建目录:mkdir usr/kafka

    2.进入创建目录:cd /usr/kafka 

    3.下载安装包:wget http://mirror.tuna.tsinghua.edu.cn/apache/kafka/2.3.0/kafka_2.11-2.3.4.tgz

    4.解压安装包:tar -xzf  kafka_2.11-2.3.4.tgz

    5.进入kafka安装目录:cd kafka_2.11-2.3.4或cd /usr/kafka/kafka_2.11-2.3.4

    6.进入config目录:cd config

    7.修改server.properties文件:vi server.properties(按【i】键进入插入模式编辑),编辑完保存退出。

    属性配置说明参照:https://blog.csdn.net/lizhitao/article/details/25667831

    TIPS:kafka最为重要三个配置依次为:broker.id、log.dir、zookeeper.connect。broker.id设置的值要和日志文件目录下的值一致,log.dir路径需要手动创建,zookeeper连接根据实际zookeeper地址配置。

    8.启动zookeeper:进入安装好的zookeeper的bin目录,执行【./zkServer.sh start】,提示started,启动成功。

    9.启动kafka:进入kafka安装目录【cd /usr/kafka/kafka_2.11-2.3.4】,执行bin/kafka-server-start.sh -daemon ./config/server.properties,无错误提示即启动成功。

    10.创建话题:进入kafka安装目录【cd /usr/kafka/kafka_2.11-2.3.4】,执行bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test。无错误提示,执行话题列表查看命令【bin/kafka-topics.sh --list --zookeeper localhost:2181】,显示test说明成功。

    

    11.发送一些消息验证,在console模式下,启动producer(生产者):bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test

    TIPS:启动生产者出错,请至server.properties文件中修改监听配置,将localhost修改为电脑IP。命令中的localhost替换成IP;

      bin/kafka-console-producer.sh --broker-list 192.168.43.97:9092 --topic test

    12.消费者获取信息:

     1 # --from-beginning 从最开始读取
     2 # kafka-console-consumer.sh --zookeeper 192.168.43.97:2181 --from-beginning --topic test  # 老版本
     3 # kafka-console-consumer.sh --bootstrap-server 192.168.43.97:9092 --from-beginning --topic test #新版本

    

    参考博文地址:https://www.cnblogs.com/zhanglianghhh/p/9692702.html

  集群安装

    印象笔记:https://app.yinxiang.com/fx/10442f5d-2972-4e9a-b397-0510df91fb9f

4. 基本使用
  常见命令 :

    1.zookeeper启动命令:./zkServer.sh start(进入zookeeper【bin】目录后执行)

    2.kafka启动命令:bin/kafka-server-start.sh -daemon ./config/server.properties(进入kafka安装目录后执行)

    3.kafka创建话题命令:bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test(进入kafka安装目录后执行)

    4.kafka查看话题列表命令:bin/kafka-topics.sh --list --zookeeper localhost:2181(进入kafka安装目录后执行)

    5.kafka消息生成命令:bin/kafka-console-producer.sh --broker-list 192.168.43.97:9092 --topic test(进入kafka安装目录后执行)

    6.kafka消息接收命令:

      1. kafka-console-consumer.sh --zookeeper 192.168.43.97:2181 --from-beginning --topic test # 老版本

      2. kafka-console-consumer.sh --bootstrap-server 192.168.43.97:9092 --from-beginning --topic test #新版本

  其它参考:https://www.cnblogs.com/shuangm/p/6917608.html

  客户端工具:https://www.cnblogs.com/frankdeng/p/9452982.html
    

  Java使用:

5. 软件原理
6. 性能优化

  软件配置优化

  使用优化

7. 软件监控
8. 问题解决方案

  常见问题

    1.sbt安装

      创建sbt目录:mkdir /usr/sbt

      进入sbt目录:cd /usr/sbt

      下载sbt:wget https://piccolo.link/sbt-1.2.0.tgzwget https://piccolo.link/sbt-1.2.0.tgz

      解压文件:tar -xvf sbt-1.2.0.tgz

      进入sbt安装目录:cd /sbt

      执行【vi sbt】 新增sbt文件,文件内容如下,并执行【chmod u+x sbt】修改文件权限:(加粗部分根据自己安装目录自行修改)

        #!/bin/bash
        SBT_OPTS="-Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256M"
        java $SBT_OPTS -jar /usr/sbt/sbt/bin/sbt-launch.jar "$@"

       配置sbt环境变量命令:vi ~/.bashrc 增加【export PATH=/usr/sbt/sbt/:$PATH】,加粗的根据自己安装目录修改, 执行【source ~/.bashrc】使更改生效。

        

      查看sbt版本: sbt sbtVersion

      

       显示版本号安装成功!

    2.防火墙操作:

      systemctl stop firewalld.service            #停止firewall
      systemctl disable firewalld.service        #禁止firewall开机启动

      

  遇到问题

猜你喜欢

转载自www.cnblogs.com/wzl-learn/p/11095075.html