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

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

流任务性能提升

数据倾斜,怎么处理

原文地址:https://www.cnblogs.com/ShyPeanut/p/13958393.html