按照 kafka 的官方文档(http://kafka.apache.org/documentation.html#quickstart)试了一下,解压程序包后运行:
$bin/zookeeper-server-start.sh config/zookeeper.properties &
结果一上来就报错,无法分配内存。
从错误输出来看,这个 zookeeper-server 要求申请536870912字节(512MB)内存 =。=#。。 日了狗了我的亚马逊主机总共才1GB物理内存而且还没建 swap 分区,free 看了一下大概就剩200MB左右的可用内存。检查这个命令的两个文件,发现在 zookeeper-server-start.sh 中有个定义 export KAFKA_HEAP_OPTS="-Xmx512M -Xms512M"
。上来就要 jvm 去申请 512MB 的最小空间,把这个 Xms 改成 16M 后 zookeeper 就启动正常了。
然后做下一步启动 kafka-esrver
$bin/kafka-server-start.sh config/server.properties &
同样遇到这个问题,修改kafka-server-start.sh中的Xms配置(这个更狠,要了1GB的初始内存)
重新启动 kafka-server,这回又显示如下错误:OutOfMemoryError
这回是 jvm 已经启动,在 kafka 的程序内部分配内存时候出错了。看来除了在启动 jvm 前就申请了大内存,在 kafka 程序内部又申请了大内存。
先去检查作为启动参数的 server.properties 文件,里面关于 size 的配置都不大,不至于 OutOfMemory。
再检查 kafka 的源码,定位到 KafkaServer.scala 的589行附近。
kafka 在创建 LogManager 对象的时候,使用了这个 cleanerConfig,并且用到了几个关于 size 的配置,而且这几个配置没有出现在server.properties 文件中,估计使用了默认值。
再kafka的官方文档可以查到这个 logCleanerDedupeBufferSize 默认134217728字节,128MB了。估计就是这个造成 OutOfMemory了。
在 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内存,看来大数据的前提就是要有大内存=。=#
我也想搞个抓比赛数据,分析的程序。能不能交流一下
上来就要jvm去申请512MB的最小空间,(这个更狠,要了1GB的初始内存)
同样想因为机器内存小而关注到这个问题,看到上面两句话觉得很搞笑hhhh🤣🤣
thanks