既然Kafka使用Scala写的,最近也在慢慢学习Scala的语法,虽然还比较生疏,但是还是想尝试下用Scala实现Producer和Consumer,并且用HashPartitioner实现消息根据key路由到指定的partition。

Producer:

import java.util.Properties
import kafka.producer.ProducerConfig
import kafka.producer.Producer
import kafka.producer.KeyedMessage object ProducerDemo {
def main(args: Array[String]): Unit = { val brokers = "192.168.1.151:9092,192.168.1.152:9092,192.168.1.153:9092"
val topic = "ScalaTopic"; val props = new Properties()
props.put("metadata.broker.list", brokers)
props.put("serializer.class", "kafka.serializer.StringEncoder")
props.put("partitioner.class", classOf[HashPartitioner].getName)
props.put("producer.type", "sync")
props.put("batch.num.messages", "1")
props.put("queue.buffering.max.messages", "1000000")
props.put("queue.enqueue.timeout.ms", "20000000") val config = new ProducerConfig(props)
val producer = new Producer[String, String](config); val sleepFlag = false;
val message1 = new KeyedMessage[String, String](topic, "1", "test 0");
producer.send(message1);
if(sleepFlag) Thread.sleep(5000);
val message2 = new KeyedMessage[String, String](topic, "1", "test 1");
producer.send(message2);
if(sleepFlag) Thread.sleep(5000);
val message3 = new KeyedMessage[String, String](topic, "1", "test 2");
producer.send(message3);
if(sleepFlag) Thread.sleep(5000);
val message4 = new KeyedMessage[String, String](topic, "4", "test 3");
producer.send(message4);
if(sleepFlag) Thread.sleep(5000);
val message5 = new KeyedMessage[String, String](topic, "4", "test 4");
producer.send(message5);
if(sleepFlag) Thread.sleep(5000);
val message6 = new KeyedMessage[String, String](topic, "4", "test 4");
producer.send(message6);
if(sleepFlag) Thread.sleep(5000); }
}

Consumer:

import java.util.Properties
import kafka.consumer.ConsumerConfig
import kafka.consumer.Consumer
import kafka.message.MessageAndMetadata object ConsumerDemo {
def main(args: Array[String]): Unit = {
var groupid = ""
var consumerid = ""
var topic = "" args match {
case Array(arg1, arg2, arg3) => topic = arg1; groupid = arg2; consumerid = arg3
} val props = new Properties()
props.put("zookeeper.connect", "192.168.1.151:2181,192.168.1.152:2181,192.168.1.153:2181")
props.put("group.id", groupid)
props.put("client.id", "test")
props.put("consumer.id", consumerid)
props.put("auto.offset.reset", "smallest")
props.put("auto.commit.enable", "true")
props.put("auto.commit.interval.ms", "100") val consumerConfig = new ConsumerConfig(props)
val consumer = Consumer.create(consumerConfig) val topicCountMap = Map(topic -> 1)
val consumerMap = consumer.createMessageStreams(topicCountMap)
val streams = consumerMap.get(topic).get
for (stream <- streams) {
val it = stream.iterator() while (it.hasNext()) {
val messageAndMetadata = it.next() val message = s"Topic:${messageAndMetadata.topic}, GroupID:$groupid, Consumer ID:$consumerid, PartitionID:${messageAndMetadata.partition}, " +
s"Offset:${messageAndMetadata.offset}, Message Key:${new String(messageAndMetadata.key())}, Message Payload: ${new String(messageAndMetadata.message())}" System.out.println(message); } } } }

HashPartitioner:

import kafka.producer.Partitioner
import scala.math._
import kafka.utils.VerifiableProperties class HashPartitioner extends Partitioner {
def this(verifiableProperties: VerifiableProperties) { this } override def partition(key: Any, numPartitions: Int): Int = { if (key.isInstanceOf[Int]) {
abs(key.toString().toInt) % numPartitions
} key.hashCode() % numPartitions
} }

运行结果:

所有消息都被路由到了Partition1,测试成功!

Kafka 学习笔记之 Producer/Consumer (Scala)的更多相关文章

  1. kafka学习笔记(一)消息队列和kafka入门

    概述 学习和使用kafka不知不觉已经将近5年了,觉得应该总结整理一下之前的知识更好,所以决定写一系列kafka学习笔记,在总结的基础上希望自己的知识更上一层楼.写的不对的地方请大家不吝指正,感激万分 ...

  2. 大数据 -- kafka学习笔记:知识点整理(部分转载)

    一 为什么需要消息系统 1.解耦 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险.许多 ...

  3. Kafka 学习笔记之 Kafka0.11之console-producer/console-consumer

    Kafka 学习笔记之 Kafka0.11之console-producer/console-consumer: 启动Zookeeper 启动Kafka0.11 创建一个新的Topic: ./kafk ...

  4. Kafka 学习笔记之 Kafka0.11之producer/consumer(Scala)

    Kafka0.11之producer/consumer(Scala): KafkaConsumer: import java.util.Properties import org.apache.kaf ...

  5. Kafka学习笔记(5)----Kafka的Consumer

    1. Pull vs Push Producer主动的通过push将消息发布到Broker上,Consumer通过Pull的的方式从Broker消息消息. 通过Push的方式由于是一有消息就推到Bro ...

  6. Kafka学习笔记之Kafka Consumer设计解析

    0x00 摘要 本文主要介绍了Kafka High Level Consumer,Consumer Group,Consumer Rebalance,Low Level Consumer实现的语义,以 ...

  7. Kafka 学习笔记之 Consumer API

    Kafka提供了两种Consumer API High Level Consumer API Low Level Consumer API(Kafka诡异的称之为Simple Consumer API ...

  8. kafka学习笔记:知识点整理

    一.为什么需要消息系统 1.解耦: 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余: 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险. ...

  9. Kafka学习笔记2: 快速入门

    在开始Kafka环境搭建之前,首先要安装Linux系统,并在Linux系统上安装JDK1.8版本,关于linux虚拟机的安装和linux系统下jdk的安装可以参考我的博文: http://blog.c ...

随机推荐

  1. lightoj 1046 - Rider(bfs)

    A rider is a fantasy chess piece that can jump like a knight several times in a single move. A rider ...

  2. Fractions Again?! UVA - 10976

    It is easy to see that for every fraction in the form 1k(k > 0), we can always find two positive ...

  3. ☆1003 Dijstra

    循环N次 算法分为两部分: 1)找到距离最小的城市,找不到距离更小的城市时退出方法 2)更新距离 实际操作时,先初始化: 更新dis为INF,更新dis[start] = 0: 变种: 找最短路径的条 ...

  4. 你知道@RequestMapping的name属性有什么用吗?【享学Spring MVC】

    每篇一句 牛逼架构师:把复杂问题简单化,把简单问题搞没 菜逼架构师:把简单问题复杂化 前言 不知这个标题能否勾起你的好奇心和求知欲?在Spring MVC的使用中,若我说@RequestMapping ...

  5. Redis哨兵(Sentinel)模式快速入门

    更多内容,欢迎关注微信公众号:全菜工程师小辉.公众号回复关键词,领取免费学习资料. 当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用. ...

  6. 【Offer】[7] 【重建二叉树】

    题目描述 思路分析 Java代码 代码链接 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4, ...

  7. 持续集成高级篇之Jenkins windows/linux混合集群搭建(二)

    系列目录 前面我们说过,要使用ssh方式来配置windows从节点,如果采用ssh方式,则windows和linux配置从节点几乎没有区别,目前发现的惟一的区别在于windows从节点上目录要设置在c ...

  8. Linux执行后台work相关

    Linux的后台运行.关闭.查看后台任务 & ctrl+z jobs fg bg kill nohup setsid disown screen 1.& 加在命令的最后,可以把命令放到 ...

  9. 渗透之路基础 -- 服务端请求伪造SSRF

    简介:SSRF 服务器端请求伪造,有的大型网站在web应用上提供了从其他服务器获取数据的功能.使用户指定的URL web应用获取图片,下载文件,读取文件内容.通常用于控制web进而探测内网服务以及攻击 ...

  10. Winform中实现ZedGraph曲线图的图像复制到剪切板、打印预览、获取图片并保存、另存为的功能

    场景 Winforn中设置ZedGraph曲线图的属性.坐标轴属性.刻度属性: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10 ...