(1)*** 所以,在写入时,还是需要动态指定下partition的分区号,有可能出现直接使用缓存里的分区号,造成消息分布不均匀,I think-2016-12-19
详见点击打开链接
可以看出,Kafka几乎就是随机找一个分区发送无key的消息,然后把这个分区号加入到缓存中以备后面直接使用——当然了,Kafka本身也会清空该缓存(默认每10分钟或每次请求topic元数据时)
if(key == null) { // 如果没有指定key
val id = sendPartitionPerTopicCache.get(topic) // 先看看Kafka有没有缓存的现成的分区Id
id match {
case Some(partitionId) =>
partitionId // 如果有的话直接使用这个分区Id就好了
case None => // 如果没有的话,
val availablePartitions = topicPartitionList.filter(_.leaderBrokerIdOpt.isDefined) //找出所有可用分区的leader所在的broker
if (availablePartitions.isEmpty)
throw new LeaderNotAvailableException("No leader for any partition in topic " + topic)
val index = Utils.abs(Random.nextInt) % availablePartitions.size // 从中随机挑一个
val partitionId = availablePartitions(index).partitionId
sendPartitionPerTopicCache.put(topic, partitionId) // 更新缓存以备下一次直接使用
partitionId
}
}
---Windows 上安装kafka遇到的问题:
1-安装好zookeeper,启动kafka的时候,报错如下:
D:\Program Files\kafka-0.10.1.1-src>.\bin\windows\kafka-server-start.bat .\config\server.properties
'wmic' 不是内部或外部命令,也不是可运行的程序或批处理文件。
(每次更改环境变量,一定重新打开cmd窗口,重新编译)
解决:
1-环境变量中加入(wmic的路径):C:\Windows\System32\wbem
2-修改kafka的解压路径,不要上级目录中带空格啊!!!(敲黑板,这是重点)
然后,以上解决后,或许又会报错:
此时不应有 \Java\jdk1.8.0_101\lib\dt.jar
excuse me??参考各种,解决如下:
环境变量中的CLASSPATH,删除%JAVA_HOME%\lib\dt.jar;(暂未知这是个啥)
然后,又出现
此时不应有 \Java\jdk1.8.0_101\lib\tools.jar.。
解决:
环境变量中的CLASSPATH,删除%JAVA_HOME%\lib\tools.jar.;
因为我还装过scala,所以又报错如下:
此时不应有 \scala\bin
解决:
环境变量中的CLASSPATH,删除%SCALA_HOME%\bin;%SCALA_HOME%\lib\dt.jar;%SCALA_HOME%\lib\tools.jar.;
然鹅并没有完:
问题:
命令语法不正确。
错误: 找不到或无法加载主类 kafka.Kafka
我要骂人了。。。
原因最终竟然是,应该下载二进制包啊!
kafka包下载地址:http://kafka.apache.org/downloads.html
注意,应该下载的是Binary downloads!!!(还未知道两者的具体区分20170111)
反正一切就酱紫解决了,上面遇到的问题可能还是会有,
补充: