一 客户端

在上一篇博客创建的简单生产者的基础上,进行两个修改操作:

1.新建SimplePartitioner.java,修改返回分区为1。

SimplePartitioner.java代码如下

  1. package cn.test.mykafka;
  2.  
  3. import java.util.Map;
  4.  
  5. import org.apache.kafka.clients.producer.Partitioner;
  6. import org.apache.kafka.common.Cluster;
  7.  
  8. /**
  9. * 简单分区函数
  10. *
  11. */
  12.  
  13. public class SimplePartitioner implements Partitioner {
  14.  
  15. @Override
  16. public void configure(Map<String, ?> configs) {
  17. // TODO Auto-generated method stub
  18.  
  19. }
  20.  
  21. @Override
  22. public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) {
  23. // TODO Auto-generated method stub
  24. return 1; //设置返回分区1
  25. }
  26.  
  27. @Override
  28. public void close() {
  29. // TODO Auto-generated method stub
  30.  
  31. }
  32.  
  33. }

2.复制SimpleProducer.java为PartitionerProducer.java,修改3处:

增加一个partitioner.class配置;主题改为test-topic2;消息改为hello world to partition 1 from win7 client。

  1. package cn.test.mykafka;
  2.  
  3. import java.util.Properties;
  4.  
  5. import org.apache.kafka.clients.producer.KafkaProducer;
  6. import org.apache.kafka.clients.producer.Producer;
  7. import org.apache.kafka.clients.producer.ProducerRecord;
  8.  
  9. /**
  10. * 使用自定义分区的生产者
  11. *
  12. */
  13.  
  14. public class PartitionerProducer {
  15.  
  16. public static void main(String[] args) {
  17.  
  18. //创建配置信息
  19. Properties props = new Properties();
  20. props.put("bootstrap.servers", "192.168.42.133:9092"); //指定broker的节点和端口
  21. props.put("acks", "all");
  22. props.put("retries", 0);
  23. props.put("batch.size", 16384);
  24. props.put("linger.ms", 1);
  25. props.put("buffer.memory", 33554432);
  26. props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
  27. props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
  28. props.put("partitioner.class","cn.test.mykafka.SimplePartitioner"); //自定义分区
  29.  
  30. //创建一个生产者
  31. Producer<String, String> producer = new KafkaProducer<>(props);
  32.  
  33. //发送消息
  34. ProducerRecord<String, String> msg = new ProducerRecord<String, String>("test-topic2","hello world to partition 1 from win7 client");
  35. producer.send(msg);
  36. //for (int i = 0; i < 10; i++)
  37. // producer.send(new ProducerRecord<String, String>("test-topic", Integer.toString(i), Integer.toString(i))); //topic,key,value
  38.  
  39. System.out.println("over");
  40. producer.close();
  41. }
  42. }

PartitionerProducer.java

二 服务器端

1.搭建单节点单broker的kafka。具体步骤看这里

2.启动服务器

启动zookeeper

  1. [root@hadoop kafka]# zookeeper-server-start.sh config/zookeeper.properties
  2. [root@hadoop kafka]# jps #打开另一个终端查看是否启动成功
  3. 3892 Jps
  4. 3566 QuorumPeerMain

启动kafka

  1. [root@hadoop kafka]# kafka-server-start.sh config/server.properties

3.创建topic

  1. #创建2个分区,1个副本的主题
  2. [root@hadoop kafka]# kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 2 --topic test-topic2
  3. Created topic "test-topic2".

4.启动消费者

  1. [root@hadoop kafka]# kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test-topic2 --from-beginning

三 测试发送消息

1.在eclipse运行代码,发送消息。

2.查看消费者是否接收到消息。

如上消费者接收到消息,说明消息发送成功。

3.查看消息是否发送到分区1。

  1. [root@hadoop ~]# cd /tmp/kafka-logs/
  2. [root@hadoop kafka-logs]# ls #显示主题test-topic2的2个分区
  3. ... test-topic2-0 test-topic2-1 ...
  4. [root@hadoop kafka-logs]# cat test-topic2-0/00000000000000000000.log #查看分区0,显示为空
  5. [root@hadoop kafka-logs]# cat test-topic2-1/00000000000000000000.log #查看分区1,显示消息
  6. c)g??????????????bVhello world to partition 1 from win7 client[root@hadoop kafka-logs]#

如上显示消息成功写入分区1,说明自定义分区函数生效。

kafka6 编写使用自定义分区的生产者的更多相关文章

  1. kafka 自定义分区器

    package cn.xiaojf.kafka.producer; import org.apache.kafka.clients.producer.Partitioner; import org.a ...

  2. Kafka的接口回调 +自定义分区、拦截器

    一.接口回调+自定义分区 1.接口回调:在使用消费者的send方法时添加Callback回调 producer.send(new ProducerRecord<String, String> ...

  3. [MapReduce_8] MapReduce 中的自定义分区实现

    0. 说明 设置分区数量 && 编写自定义分区代码 1. 设置分区数量 分区(Partition) 分区决定了指定的 Key 进入到哪个 Reduce 中 分区目的:把相同的 Key ...

  4. MapReduce之自定义分区器Partitioner

    @ 目录 问题引出 默认Partitioner分区 自定义Partitioner步骤 Partition分区案例实操 分区总结 问题引出 要求将统计结果按照条件输出到不同文件中(分区). 比如:将统计 ...

  5. Spark自定义分区(Partitioner)

    我们都知道Spark内部提供了HashPartitioner和RangePartitioner两种分区策略,这两种分区策略在很多情况下都适合我们的场景.但是有些情况下,Spark内部不能符合咱们的需求 ...

  6. centos minimal 安装无法自定义分区

    安装了太多版本的linux,最后还是决定安装CentOS的minimal版本: 安装的时候发现,没办法自定义分区,经查确实在命令行界面下安装是没有自定义分区的. 但是不管怎么安装都是没有图形介面,最后 ...

  7. 大数据入门第二十二天——spark(三)自定义分区、排序与查找

    一.自定义分区 1.概述 默认的是Hash的分区策略,这点和Hadoop是类似的,具体的分区介绍,参见:https://blog.csdn.net/high2011/article/details/6 ...

  8. Hadoop mapreduce自定义分区HashPartitioner

    本文发表于本人博客. 在上一篇文章我写了个简单的WordCount程序,也大致了解了下关于mapreduce运行原来,其中说到还可以自定义分区.排序.分组这些,那今天我就接上一次的代码继续完善实现自定 ...

  9. 在hadoop作业中自定义分区和归约

    当遇到有特殊的业务需求时,需要对hadoop的作业进行分区处理 那么我们可以通过自定义的分区类来实现 还是通过单词计数的例子,JMapper和JReducer的代码不变,只是在JSubmit中改变了设 ...

随机推荐

  1. easyui tree 默认选中第一个元素

    系统采用ajax异步调用后端接口做数据呈现,有个场景就是加载的树形菜单默认选中第一行,网上有人分享的解决方案能实现效果(http://aokunsang.iteye.com/blog/1489204) ...

  2. [IR] Concept Search and PLSA

    [Topic Model]主题模型之概率潜在语义分析(Probabilistic Latent Semantic Analysis) 感觉LDA在实践中的优势其实不大,学好pLSA才是重点 阅读笔记 ...

  3. ios开发之--关于UIView的autoresizingMask属性的研究

    在 UIView 中有一个autoresizingMask的属性,它对应的是一个枚举的值(如下),属性的意思就是自动调整子控件与父控件中间的位置,宽高. enum { UIViewAutoresizi ...

  4. 【GIS】无人机影像数据关系换算(转)

    ----------------------------------------------------------------------------------------------- H=f× ...

  5. Git 学习笔记--拉取远程分支到本地

    1.查看远程分支,和上面的第一步相同2. 从远程获取最新版本到本地 git fetch origin master:temp git fetch origin master:temp 这句命令的意思是 ...

  6. Scala中的协变,逆变,上界,下界等

    Scala中的协变,逆变,上界,下界等 目录 [−] Java中的协变和逆变 Scala的协变 Scala的逆变 下界lower bounds 上界upper bounds 综合协变,逆变,上界,下界 ...

  7. [ASP.NET MVC]视图是如何呈现的

    为了搞清楚ASP.NET MVC的请求过程,我们计划从结果追踪到源头.使用VS2012创建一个空白的ASP.NET MVC项目 然后创建一个HelloController 创建一个HelloView. ...

  8. freemarker特殊字符转义

    一个坑了很久的问题,今天上午终于在同事帮助下搞定了,,利用ibatis框架,从sqlserver数据库中读取数据,放到java对象中,其中有一项description中有特殊字符,没留意,在ftl文件 ...

  9. day_4.28 py

    2018-4-28 15:13:39 ''' 在方法名字加入两个 __则为私有方法 类似于private 方法 ''' class Dog: #私有方法 def __send_msg(self): p ...

  10. Python数据结构——二叉树

    数的特征和定义: 树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构,很象自然界中的树那样.树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都 ...