小内存运行kafka

按照 kafka 的官方文档(http://kafka.apache.org/documentation.html#quickstart)试了一下,解压程序包后运行:

$bin/zookeeper-server-start.sh config/zookeeper.properties &

结果一上来就报错,无法分配内存。

屏幕快照 2016-03-15 下午2.58.25

从错误输出来看,这个 zookeeper-server 要求申请536870912字节(512MB)内存 =。=#。。 日了狗了我的亚马逊主机总共才1GB物理内存而且还没建 swap 分区,free 看了一下大概就剩200MB左右的可用内存。检查这个命令的两个文件,发现在 zookeeper-server-start.sh 中有个定义 export KAFKA_HEAP_OPTS="-Xmx512M -Xms512M"。上来就要 jvm 去申请 512MB 的最小空间,把这个 Xms 改成 16M 后 zookeeper 就启动正常了。

屏幕快照 2016-03-15 下午2.35.44

然后做下一步启动 kafka-esrver

$bin/kafka-server-start.sh config/server.properties &

同样遇到这个问题,修改kafka-server-start.sh中的Xms配置(这个更狠,要了1GB的初始内存)

屏幕快照 2016-03-15 下午2.36.03

重新启动 kafka-server,这回又显示如下错误:OutOfMemoryError

屏幕快照 2016-03-15 下午2.20.31

这回是 jvm 已经启动,在 kafka 的程序内部分配内存时候出错了。看来除了在启动 jvm 前就申请了大内存,在 kafka 程序内部又申请了大内存。

先去检查作为启动参数的 server.properties 文件,里面关于 size 的配置都不大,不至于 OutOfMemory。

再检查 kafka 的源码,定位到 KafkaServer.scala 的589行附近。

屏幕快照 2016-03-15 下午3.22.53

kafka 在创建 LogManager 对象的时候,使用了这个 cleanerConfig,并且用到了几个关于 size 的配置,而且这几个配置没有出现在server.properties 文件中,估计使用了默认值。

再kafka的官方文档可以查到这个 logCleanerDedupeBufferSize 默认134217728字节,128MB了。估计就是这个造成 OutOfMemory了。

屏幕快照 2016-03-15 下午3.30.58

在 server.properties 文件中添加一行:log.cleaner.dedupe.buffer.size=10485760 设置成10MB。然后重新启动 kafka-server。成功!嘿嘿。

跟着官方文档试了一遍,感觉 Kafka 没有 RabbitMq 好上手。=。=#

现在想在 mybet 项目中用上消息队列,将 betspider 与 mybet 两个数据库分离,betspider 只负责爬数据,写自己的库的同时把比赛、赔率数据放到消息队列中,mybet 作为 consumer 自己去取。然后还要有一个 consumer 负责取完赛数据,根据比赛结果在mybet 的订单表中结算订单,个人感觉更倾向于使用 RabbitMq。呃,复杂度越来越大。。。

 

PS:后来还是老老实实给我的亚马逊主机加了2GB的 swap 分区。。。因为发现 spark 也是一上来就要1G内存,看来大数据的前提就是要有大内存=。=#

3 thoughts on “小内存运行kafka”

    1. 上来就要jvm去申请512MB的最小空间,(这个更狠,要了1GB的初始内存)

      同样想因为机器内存小而关注到这个问题,看到上面两句话觉得很搞笑hhhh🤣🤣

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top