java分布式流式处理组件Producer分区的作用是什么


这篇文章主要讲解了“java分布式流式处理组件Producer分区的作用是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java分布式流式处理组件Producer分区的作用是什么”吧!合理的使用存储资源:把海量的数据按照分区切割成一小块的数据存储在多台Broker上。此时能够保证每台服务器存储资源能够被充分利用到。而且小块数据在寻址时间上更有优势~如果将全部的数据存储在一台机器上,那么要对当前数据做副本的时候,由于服务器资源配置不同,就有可能会出现副本数据存放失败,从而增加数据丢失的可能性。同时,如果单个文件过大,副本放置时间、内容检索时间都会极大的延长,从而导致Kafka性能降低。负载均衡: 数据生产或消费期间,生产者已分区的单位发送数据,消费者分区的单位进行消费。 期间,各分区生产和消费数据互不影响,这样能够达到合理控制分区任务的程度,提高任务的并行度。从而达到负载均衡的效果。刚才我们提到:生产者已分区为单位向Broker发送数据。那么问题来了:生产者是怎么知道该向哪个分区发送数据呢?这就是我们接下来要研究的分区策略。下面的代码可以说是整个分区器的核心部分,可以通过以下的步骤进行说明:如果在生产消息的时候,已经指定了需要发送的分区位置,那么就会直接使用已经指定的份具体的位置,这样子还节省了也不计算的时间如果在生产者配置Properties中指定了分区策略类,那么消息生产就会通过已经指定的分区策略类进行分区计算否则就会以serializedKey作为参数,通过hash取模的方式计算。如果serializedKey == null,那么就会采用粘性分区的逻辑。 这在Kaf免费云主机域名ka中属于默认分区器。如果以上情况都没有包含,那么他就会直接返回-1。相当于ack=0的情况。在Kafka中分区策略我们是可以自定义的。当然Kafka也为我们内置了三种分区策略类。 接下来我们挑个重点来介绍,来给我们自定义分区器做一个铺垫~我们已经看到,DefaultPartitionerUniformStickyPartitioner已经被标注为过期类,当然也并不妨碍我们来了解一下。在当前版本中,如果没有对partitioner.class进行配置,此时的分区策略就会采用当前类作为默认分区策略类。而以下是DefaultPartitioner策略类的核心实现方式,并且标记部分的代码实现其实就是UniformStickyPartitioner的计算逻辑还有一段代码让我们来一起看看这段代码不管有多复杂,调用方法有多少,但最终我们是能够发现:它的本质其实是在对序列化Key做哈希计算,然后通过hash值和分区数做取模运算,然后得到结果分区位置这是一种比较重要的计算方式,但却不是唯一的方式—这是分割线—接下来继续,我们看看如果无法对序列化Key计算,会是怎么样的计算逻辑?我们先开始来看一下,是在哪个地方得到的serializedKey,并且什么情况下serializedKey会是NULL看看下面的这个代码眼熟不?从上面的代码来看,基本上能够实锤了:当在生成ProducerRecord对象的时候,如果没有对消息设置key参数,此时序列化之后的key就是个null那么当序列化之后的Key为NULL之后,此时分区计算逻辑就会改变。此时相当于我们已经进入到UniformStickyPartitioner的计算逻辑, 当然了在我们使用的3.3版本中当前类也已经被标注为过期根据前面的说法,粘性分区主要解决了消息无Key的分区计算逻辑,那么粘性分区并不是说每次都使用同一个分区它是通过一个大的Batch为单位,尽量将batch内的消息固定在同一个分区内,这样在很大程度上能够保证:防止消息无规律的分散在不同的分区内,降低分区倾斜同时不需要每次进行分区计算,也降低了Producer的延迟而实现方式是采用ConcurrentMap来进行缓存,感兴趣的大家可以看看StickyPartitionCache的源码而当Batch内消息满足发送条件被发送出去之后,才会开始再次计算下一个分区,为此在KafkaProducer中还专门调用了新的方法这是在当前版本中唯一没有被标注的类,未来说不定会成为默认分区策略类,我们不看,就瞄一眼这个类的解释,嗯。。你们看那个合适吧~其实这个逻辑非常简单:通过AtomicInteger.getAndIncrement()的方式将每次写入平均分配到不同的分区中不同与其他分区策略类,它不关心Key是否为NULL我们先来做个小实验吧: 将分区策略类修改为RoundRobinPartitioner,也方便后续自定义分区器的配置操作就这样就能实现,看结果验证~中间穿插了一点小知识,那么接下来就会进入到我们最后一个环节:尝试自定义分区器前面我们也提到过,相信大家没有忘记partitioner.class这个配置那么接下来就进入到重头戏:自定义分区器实战编码环节。我们就先做的简单一点,主要是想让大家明白自定义分区器的实现:如果没有给定指定key,那么就默认全部去0号分区否则就通过key做取模计算当自定义分区器实现完成之后,接下来我们就需要通过发送者进行验证。当然了,主要还是通过partitioner.class进行修改通过执行之后,我们来看看它的运行效果是否满足我们的预期另一种运行结果与默认分区器有Key的情况类似,这里就不再重复贴图感谢各位的阅读,以上就是“java分布式流式处理组件Producer分区的作用是什么”的内容了,经过本文的学习后,相信大家对java分布式流式处理组件Producer分区的作用是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是百云主机,小编将为大家推送更多相关知识点的文章,欢迎关注!

相关推荐: PHP API框架中PSR规范有哪些

这篇文章主要介绍“PHP API框架中PSR规范有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“PHP API框架中PSR规范有哪些”文章能帮助大家解决问题。 什么是PSR?介绍PSR之前需要介绍一下制定此规范的组…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 05/18 19:31
Next 05/18 19:31

相关推荐