zoukankan      html  css  js  c++  java
  • kafka详解

    一.kafka概念

    • kafka是 分布式,支持分区的,多副本的基于zookeeper协调的分布式消息系统

    • DMQ(Distributed Message Queue)

      DMQ是一个消息中间件,传递消息

    • 发布-订阅模式(生产者-消费者)

    二.常见术语

    • Broker:
      Kafka节点,一个Kafka节点就是一个broker,多个broker可以组成一个Kafka集群

      无状态的,不管offset

    • Topic:
      一类消息,消息存放的目录即主题

    • Partition:
      topic物理上的分组,一个topic可以分为多个partition,每个partition是一个有序的队列

      partition中每个message能被多个组消费,但在一个组中只能被一个consumer消费(所以不需要锁机制)

    • Segment:
      partition物理上由多个segment组成,每个Segment存着message信息

    • Producer :
      生产message发送到topic;

      producer 采用 push 模式将消息发布到 broker,每条消息都被 append 到 patition 中,属于顺序写磁盘;

    • Consumer :
      订阅topic消费message, consumer作为一个线程来消费

      顺序读取,记录消费的物理偏移量(offset)的位置

    • Consumer Group:
      一个Consumer Group包含多个consumer

    • replica:

      partition的副本,保障partition高可用

    • leader:

      replica中的一个角色,producer和consumer只跟leader交互

    • follower:

      replica中的一个角色,从leader中复制数据

    • controller:

      kafka集群中其中一个服务器,用来进行leader election

    三.设计思想

    Kakfa Broker集群受Zookeeper管理;

    一个consumer group消费一个topic时一定会消费完全部的partition,;

    一个组中consumer thread数量和partition数量相同时效率最高;数量不相同时则会出现一消费多或者空闲的情况;

    线上的分布式多个service服务,每个service里面的kafka consumer数量都小于对应的topic的partition数量,但是所有服务的consumer数量只和等于partition的数量;

    一般这种情况都是两个不同的业务逻辑,才会启动两个consumer group来处理一个topic

    四.面试题

    1.为什么要使用 kafka,为什么要使用消息队列

    缓冲和削峰:上游数据时有突发流量,下游可能扛不住,或者下游没有足够多的机器来保证冗余,kafka在中间可以起到一个缓冲的作用,把消息暂存在kafka中,下游服务就可以按照自己的节奏进行慢慢处理。

    解耦和扩展性:项目开始的时候,并不能确定具体需求。消息队列可以作为一个接口层,解耦重要的业务流程。只需要遵守约定,针对数据编程即可获取扩展能力。

    冗余:可以采用一对多的方式,一个生产者发布消息,可以被多个订阅topic的服务消费到,供多个毫无关联的业务使用。

    健壮性:消息队列可以堆积请求,所以消费端业务即使短时间死掉,也不会影响主要业务的正常进行。

    2.kafka中的 zookeeper 的作用

    kafka依赖zk,kafka的集群管理,负载均衡由zk实现

    3.kafka follower如何与leader同步数据

    kafka使用ISR(In-Sync Replicas 副本同步队列)的方式很好的均衡了确保数据不丢失以及吞吐率。Follower可以批量的从Leader复制数据,而且Leader充分利用磁盘顺序读以及send file(zero copy)机制,这样极大的提高复制性能,内部批量写磁盘,大幅减少了Follower与Leader的消息量差。

    4.kafka中consumer group 是什么

    同样是逻辑上的概念,是Kafka实现单播和广播两种消息模型的手段。同一个topic的数据,会广播给不同的group;同一个group中的worker,只有一个worker能拿到这个数据;

    5.Kafka中是怎么体现消息顺序性的?

    kafka每个partition中的消息在写入时都是有序的,消费时,每个partition只能被每一个group中的一个消费者消费,保证了消费时也是有序的。

    整个topic不保证有序。如果为了保证topic整个有序,那么将partition调整为1.

    五.其他链接

    Kafka常见面试题

    https://blog.csdn.net/qq_28900249/article/details/90346599?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.channel_param

    六.其他临时

    ######################################

    java.lang.IllegalArgumentException: System memory 468189184 must be at least 4.718592E8

    https://blog.csdn.net/liuxiangke0210/article/details/53909739

    IDEA运行异常java.lang.NoClassDefFoundError: org/apache/spark/api/java/function/Function

    https://www.cnblogs.com/parent-absent-son/p/10064856.html

    ######################################

    ERROR org.apache.spark.SparkContext - Error initializing SparkContext.
    java.lang.IllegalArgumentException: System memory 129761280 must be at least 471859200. Please increase heap size using the --driver-memory option or spark.driver.memory in Spark configuration.

    Spark程序运行报错:JVM申请的memory不足解决办法

    https://blog.csdn.net/wypersist/article/details/80140334

    #######################################

    ######################

    [INFO] java.lang.reflect.InvocationTargetException
    [INFO] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    [INFO] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    [INFO] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    [INFO] at java.lang.reflect.Method.invoke(Method.java:497)
    [INFO] at org_scala_tools_maven_executions.MainHelper.runMain(MainHelper.java:161)
    [INFO] at org_scala_tools_maven_executions.MainWithArgsInFile.main(MainWithArgsInFile.java:26)
    [ERROR] Caused by: java.lang.OutOfMemoryError: Java heap space
    [INFO] at java.util.jar.Manifest$FastInputStream.(Manifest.java:332)
    [INFO] at java.util.jar.Manifest$FastInputStream.(Manifest.java:327)
    [INFO] at java.util.jar.Manifest.read(Manifest.java:195)
    [INFO] at java.util.jar.Manifest.(Manifest.java:69)
    [INFO] at java.util.jar.JarFile.getManifestFromReference(JarFile.java:199)
    [INFO] at java.util.jar.JarFile.getManifest(JarFile.java:180)
    [INFO] at sun.misc.URLClassPath$JarLoader$2.getManifest(URLClassPath.java:944)
    [INFO] at java.net.URLClassLoader.defineClass(URLClassLoader.java:450)
    [INFO] at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
    [INFO] at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
    [INFO] at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
    [INFO] at java.security.AccessController.doPrivileged(Native Method)
    [INFO] at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
    [INFO] at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    [INFO] at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    [INFO] at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    [INFO] at scala.tools.nsc.util.package$.stackTraceString(package.scala:75)
    [INFO] at scala.tools.nsc.Global.throwableAsString(Global.scala:316)
    [INFO] at scala.tools.nsc.Global.reportThrowable(Global.scala:315)
    [INFO] at scala.tools.nsc.Driver.process(Driver.scala:54)
    [INFO] at scala.tools.nsc.Driver.main(Driver.scala:64)
    [INFO] at scala.tools.nsc.Main.main(Main.scala)
    [INFO] ... 6 more

    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD FAILURE
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time: 04:51 min
    [INFO] Finished at: 2020-11-05T09:44:19+08:00
    [INFO] Final Memory: 62M/149M
    [INFO] ------------------------------------------------------------------------
    [ERROR] Failed to execute goal org.scala-tools:maven-scala-plugin:2.15.2:compile (default) on project NewsFeed: wrap: org.apache.commons.exec.Execute
    Exception: Process exited with an error: -10000(Exit value: -10000) -> [Help 1][ERROR]
    [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
    [ERROR] Re-run Maven using the -X switch to enable full debug logging.
    [ERROR][ERROR] For more information about the errors and possible solutions, please read the following articles:
    [ERROR][Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
    [ERROR][ERROR] After correcting the problems, you can resume the build with the command

    ####################

    流任务性能提升

    数据倾斜,怎么处理

  • 相关阅读:
    课程5:Spring框架2016版视频--视频列表目录
    TAQSkinScrollBar 类美化滚动条再讨论
    C#区分多态和重载-delphi也类似
    Delphi之静态方法,虚方法virtual,动态dynamic,抽象abstract,消息
    课程4:黑马程序员_spring2.5视频教程--视频列表
    在 Delphi 中判断一个字符是中文的方法
    salesforce 零基础学习(四十八)自定义列表分页之Pagination基类封装 ※※※
    salesforce 零基础学习(四十七) 数据加密简单介绍
    salesforce 零基础学习(四十六)动态美观显示列表中记录的审批状态
    salesforce 零基础学习(四十五)Approval Lock & UnLock相关注意事项
  • 原文地址:https://www.cnblogs.com/ShyPeanut/p/13958393.html
Copyright © 2011-2022 走看看