【云计算】Failedtoallocatememorywithintheconfiguredmaxblockingtime60000ms问题解决
小标 2018-12-24 来源 : 阅读 2476 评论 0

摘要:本文主要向大家介绍了【云计算】Failedtoallocatememorywithintheconfiguredmaxblockingtime60000ms问题解决,通过具体的内容向大家展现,希望对大家学习云计算有所帮助。

本文主要向大家介绍了【云计算】Failedtoallocatememorywithintheconfiguredmaxblockingtime60000ms问题解决,通过具体的内容向大家展现,希望对大家学习云计算有所帮助。


Failed to allocate memory within the configured max blocking time 60000 ms


kafka生产者写入消息的时候出现了这个问题。


网上的一般方法是设置batch.size = 0,一般都是可以的。具体怎么设置,为什么会出现这个问题,下面我会详细分析。


首先我想了一下,最近代码做过什么变动。


我们用kafka放爬取的新闻数据,代码上线之后爬取的网站变多了,而且那些网站有一些从历史开始爬取,就会有很多数据。对应业务变化就是:业务数据量增多




网上找到的第一篇文章是这个,在里面有一句解释:


达到的消息,比发送的消息要快的多了



kafka异步模式下,会有一个缓冲区,如果这个缓冲区满了,数据就进不去了,所以就有可能会出现超时。也就是缓冲区的数据没有发送出去,又有消息来了,缓冲区放不下了这条消息就得等待,如果等待的时间超过了这个时间,就出现超时。


第二篇文章是Stack Overflow的文章,说设置batch.size=0。我用的java客户端,具体在哪里设置,设置这个有什么用?


我找到了java设置配置的代码:


 @Bean
 public Map producerConfig(){
  
  Map props = new HashMap<>();
  
  props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
  
  props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, IntegerSerializer.class);
  
  props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
  
  props.put(ProducerConfig.MAX_BLOCK_MS_CONFIG, 60000);
  
  return props;
 }


里面有个MAX_BLOCK_MS_CONFIG刚好是60000ms,此事必有蹊跷啊。最近学会了看源码,这能力很重要啊,直接点进去看


MAX_BLOCK_MS_CONFIG:


    public static final String MAX_BLOCK_MS_CONFIG = "max.block.ms";


那我搜一下batch.size,果然有,


 public static final String BATCH_SIZE_CONFIG = "batch.size";


照理来说我直接设置了就ok了。但我还是想一探究竟。


我研究了一下,kafka发送消息分为同步和异步,同步情况下我们直接发送等待响应就行了。异步模式下我们会有一个队列,为了提高吞吐量,我们会把数据积累到一定的大小才发送,这个大小就是batch.size,源码里面有batch.size的解释:


    private static final String BATCH_SIZE_DOC = "The producer will attempt to batch records together into fewer requests whenever multiple records are being sent"
                                                 + " to the same partition. This helps performance on both the client and the server. This configuration controls the "
                                                 + "default batch size in bytes. "
                                                 + "


" + "No attempt will be made to batch records larger than this size. " + "


" + "Requests sent to brokers will contain multiple batches, one for each partition with data available to be sent. " + "


" + "A small batch size will make batching less common and may reduce throughput (a batch size of zero will disable " + "batching entirely). A very large batch size may use memory a bit more wastefully as we will always allocate a " + "buffer of the specified batch size in anticipation of additional records.";


也就是,这个batch.size如果设置得比较小,会降低吞度量;如果设置得比较大,又耗费内存。我查找到源码,他默认是16k:


 .define(BATCH_SIZE_CONFIG, Type.INT, 16384, atLeast(0), Importance.MEDIUM, BATCH_SIZE_DOC)


如果batch.size=0的话,那就不会积累到一定程度才一起发送了。所以batch.size=0一般可以解决这个问题。这样有数据就直接发,队列就不会满,也就不会超时,这是第一个解决办法。


那么我们可不可以把超时时间设置得长一点,甚至直接不超时,一直等待?我们看一下这个超时时间配置的源码的解释:


    public static final String MAX_BLOCK_MS_CONFIG = "max.block.ms";
    private static final String MAX_BLOCK_MS_DOC = "The configuration controls how long KafkaProducer.send() and KafkaProducer.partitionsFor() will block."
                                                    + "These methods can be blocked either because the buffer is full or metadata unavailable."
                                                    + "Blocking in the user-supplied serializers or partitioner will not be counted against this timeout.";


理论上,我们可以延长超时时间解决这个问题。


          

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标大数据云计算大数据安全频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程