根据业务需要可以使用Kafka提供的Java Producer API进行产生数据,并将产生的数据发送到Kafka对应Topic的对应分区中,入口类为:Producer

Kafka的Producer API主要提供下列三个方法:

  public void send(KeyedMessage<K,V> message) 发送单条数据到Kafka集群

  public void send(List<KeyedMessage<K,V>> messages) 发送多条数据(数据集)到Kafka集群

  public void close() 关闭Kafka连接资源

使用Java语言实现Kafka的Consumer详见博客: Java 实现 High Level Consumer API 以及 Java实现LowerLevelConsumerAPI

======================================================================

一、JavaKafkaProducerPartitioner:自定义的数据分区器,功能是:决定输入的key/value键值对的message发送到Topic的那个分区中,返回分区id,范围:[0,分区数量); 这里的实现比较简单,根据key中的数字决定分区的值。具体代码如下:

  1. import kafka.producer.Partitioner;
  2. import kafka.utils.VerifiableProperties;
  3.  
  4. /**
  5. * Created by gerry on 12/21.
  6. */
  7. public class JavaKafkaProducerPartitioner implements Partitioner {
  8.  
  9. /**
  10. * 无参构造函数
  11. */
  12. public JavaKafkaProducerPartitioner() {
  13. this(new VerifiableProperties());
  14. }
  15.  
  16. /**
  17. * 构造函数,必须给定
  18. *
  19. * @param properties 上下文
  20. */
  21. public JavaKafkaProducerPartitioner(VerifiableProperties properties) {
  22. // nothings
  23. }
  24.  
  25. @Override
  26. public int partition(Object key, int numPartitions) {
  27. int num = Integer.valueOf(((String) key).replaceAll("key_", "").trim());
  28. return num % numPartitions;
  29. }
  30. }

二、 JavaKafkaProducer:通过Kafka提供的API进行数据产生操作的测试类;具体代码如下:

  1. import kafka.javaapi.producer.Producer;
  2. import kafka.producer.KeyedMessage;
  3. import kafka.producer.ProducerConfig;
  4. import org.apache.log4j.Logger;
  5.  
  6. import java.util.Properties;
  7. import java.util.concurrent.ExecutorService;
  8. import java.util.concurrent.Executors;
  9. import java.util.concurrent.TimeUnit;
  10. import java.util.concurrent.atomic.AtomicBoolean;
  11. import java.util.concurrent.ThreadLocalRandom;
  12.  
  13. /**
  14. * Created by gerry on 12/21.
  15. */
  16. public class JavaKafkaProducer {
  17. private Logger logger = Logger.getLogger(JavaKafkaProducer.class);
  18. public static final String TOPIC_NAME = "test";
  19. public static final char[] charts = "qazwsxedcrfvtgbyhnujmikolp1234567890".toCharArray();
  20. public static final int chartsLength = charts.length;
  21.  
  22. public static void main(String[] args) {
  23. String brokerList = "192.168.187.149:9092";
  24. brokerList = "192.168.187.149:9092,192.168.187.149:9093,192.168.187.149:9094,192.168.187.149:9095";
  25. brokerList = "192.168.187.146:9092";
  26. Properties props = new Properties();
  27. props.put("metadata.broker.list", brokerList);
  28. /**
  29. * 0表示不等待结果返回<br/>
  30. * 1表示等待至少有一个服务器返回数据接收标识<br/>
  31. * -1表示必须接收到所有的服务器返回标识,及同步写入<br/>
  32. * */
  33. props.put("request.required.acks", "0");
  34. /**
  35. * 内部发送数据是异步还是同步
  36. * sync:同步, 默认
  37. * async:异步
  38. */
  39. props.put("producer.type", "async");
  40. /**
  41. * 设置序列化的类
  42. * 可选:kafka.serializer.StringEncoder
  43. * 默认:kafka.serializer.DefaultEncoder
  44. */
  45. props.put("serializer.class", "kafka.serializer.StringEncoder");
  46. /**
  47. * 设置分区类
  48. * 根据key进行数据分区
  49. * 默认是:kafka.producer.DefaultPartitioner ==> 安装key的hash进行分区
  50. * 可选:kafka.serializer.ByteArrayPartitioner ==> 转换为字节数组后进行hash分区
  51. */
  52. props.put("partitioner.class", "JavaKafkaProducerPartitioner");
  53.  
  54. // 重试次数
  55. props.put("message.send.max.retries", "3");
  56.  
  57. // 异步提交的时候(async),并发提交的记录数
  58. props.put("batch.num.messages", "200");
  59.  
  60. // 设置缓冲区大小,默认10KB
  61. props.put("send.buffer.bytes", "102400");
  62.  
  63. // 2. 构建Kafka Producer Configuration上下文
  64. ProducerConfig config = new ProducerConfig(props);
  65.  
  66. // 3. 构建Producer对象
  67. final Producer<String, String> producer = new Producer<String, String>(config);
  68.  
  69. // 4. 发送数据到服务器,并发线程发送
  70. final AtomicBoolean flag = new AtomicBoolean(true);
  71. int numThreads = 50;
  72. ExecutorService pool = Executors.newFixedThreadPool(numThreads);
  73. for (int i = 0; i < 5; i++) {
  74. pool.submit(new Thread(new Runnable() {
  75. @Override
  76. public void run() {
  77. while (flag.get()) {
  78. // 发送数据
  79. KeyedMessage message = generateKeyedMessage();
  80. producer.send(message);
  81. System.out.println("发送数据:" + message);
  82.  
  83. // 休眠一下
  84. try {
  85. int least = 10;
  86. int bound = 100;
  87. Thread.sleep(ThreadLocalRandom.current().nextInt(least, bound));
  88. } catch (InterruptedException e) {
  89. e.printStackTrace();
  90. }
  91. }
  92.  
  93. System.out.println(Thread.currentThread().getName() + " shutdown....");
  94. }
  95. }, "Thread-" + i));
  96.  
  97. }
  98.  
  99. // 5. 等待执行完成
  100. long sleepMillis = 600000;
  101. try {
  102. Thread.sleep(sleepMillis);
  103. } catch (InterruptedException e) {
  104. e.printStackTrace();
  105. }
  106. flag.set(false);
  107.  
  108. // 6. 关闭资源
  109.  
  110. pool.shutdown();
  111. try {
  112. pool.awaitTermination(6, TimeUnit.SECONDS);
  113. } catch (InterruptedException e) {
  114. } finally {
  115. producer.close(); // 最后之后调用
  116. }
  117. }
  118.  
  119. /**
  120. * 产生一个消息
  121. *
  122. * @return
  123. */
  124. private static KeyedMessage<String, String> generateKeyedMessage() {
  125. String key = "key_" + ThreadLocalRandom.current().nextInt(10, 99);
  126. StringBuilder sb = new StringBuilder();
  127. int num = ThreadLocalRandom.current().nextInt(1, 5);
  128. for (int i = 0; i < num; i++) {
  129. sb.append(generateStringMessage(ThreadLocalRandom.current().nextInt(3, 20))).append(" ");
  130. }
  131. String message = sb.toString().trim();
  132. return new KeyedMessage(TOPIC_NAME, key, message);
  133. }
  134.  
  135. /**
  136. * 产生一个给定长度的字符串
  137. *
  138. * @param numItems
  139. * @return
  140. */
  141. private static String generateStringMessage(int numItems) {
  142. StringBuilder sb = new StringBuilder();
  143. for (int i = 0; i < numItems; i++) {
  144. sb.append(charts[ThreadLocalRandom.current().nextInt(chartsLength)]);
  145. }
  146. return sb.toString();
  147. }
  148. }

三、Pom.xml依赖配置如下

  1. <properties>
  2. <kafka.version>0.8.2.1</kafka.version>
  3. </properties>
  4.  
  5. <dependencies>
  6. <dependency>
  7. <groupId>org.apache.kafka</groupId>
  8. <artifactId>kafka_2.10</artifactId>
  9. <version>${kafka.version}</version>
  10. </dependency>
  11. </dependencies>

[Kafka] - Kafka Java Producer代码实现的更多相关文章

  1. kafka集群和zookeeper集群的部署,kafka的java代码示例

    来自:http://doc.okbase.net/QING____/archive/19447.html 也可参考: http://blog.csdn.net/21aspnet/article/det ...

  2. kafka的Java客户端示例代码(kafka_2.12-0.10.2.1)

    使用0.9开始增加的KafkaProducer和KafkaConsumer. Pom.xml <project xmlns="http://maven.apache.org/POM/4 ...

  3. Kafka设计解析(二十一)关于Kafka幂等producer的讨论

    转载自 huxihx,原文链接 关于Kafka幂等producer的讨论 众所周知,Kafka 0.11.0.0版本正式支持精确一次处理语义(exactly once semantics,下称EOS) ...

  4. 关于Kafka幂等producer的讨论

    众所周知,Kafka 0.11.0.0版本正式支持精确一次处理语义(exactly once semantics,下称EOS).Kafka的EOS主要体现在3个方面: 幂等producer:保证发送单 ...

  5. Kafka 0.8 Producer处理逻辑

    Kafka Producer产生数据发送给Kafka Server,具体的分发逻辑及负载均衡逻辑,全部由producer维护. 1.Kafka Producer默认调用逻辑 1.1 默认Partiti ...

  6. 4 kafka集群部署及kafka生产者java客户端编程 + kafka消费者java客户端编程

    本博文的主要内容有   kafka的单机模式部署 kafka的分布式模式部署 生产者java客户端编程 消费者java客户端编程 运行kafka ,需要依赖 zookeeper,你可以使用已有的 zo ...

  7. Kafka学习(四)-------- Kafka核心之Producer

    通过https://www.cnblogs.com/tree1123/p/11243668.html 已经对consumer有了一定的了解.producer比consumer要简单一些. 一.旧版本p ...

  8. Kafka 0.8 Producer (0.9以前版本适用)

    Kafka旧版本producer由scala编写,0.9以后已经废除,但是很多公司还在使用0.9以前的版本,所以总结如下: 要注意包Producer是 kafka.javaapi.producer.P ...

  9. kafka 生产者java编码

    public class KafkaProducerDemo { public static void main(String[] args) throws InterruptedException ...

随机推荐

  1. Windows Server 2008及以上系统磁盘无法查看(About UAC and ACE)

    在windows Server2008及以上系統,如果UAC Enabled,ACE列表中不會包含Administrators成員的SID,所以即使你是administrators的成員,也無法訪問D ...

  2. Storm-源码分析-Topology Submit-Task

    mk-task, 比较简单, 因为task只是概念上的结构, 不象其他worker, executor都需要创建进程或线程 所以其核心其实就是mk-task-data, 1. 创建TopologyCo ...

  3. sqlalchemy(二)高级用法 2

    转自:https://www.cnblogs.com/coder2012/p/4746941.html 外键以及relationship 首先创建数据库,在这里一个user对应多个address,因此 ...

  4. 7.Insert Methods-官方文档摘录

    总结 列举insert插入方法 MongoDB provides the following methods for inserting documents into a collection: db ...

  5. MySQL给字段唯一索引的三种方法

    建表时添加 DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `stu_id` ) NOT NULL AUTO_INCREMENT, ` ...

  6. Python生成器是什么

    生成器是 Python 初级开发者最难理解的概念之一,虽被认为是 Python 编程中的高级技能,但在各种项目中可以随处见到生成器的身影,你得去理解它.使用它.甚至爱上它. 提到生成器,总不可避免地要 ...

  7. node.js---sails项目开发(4)---配置MongoDB数据库连接

    1.安装sails对mongo的依赖 npm install sails-mongo --save 2. 配置mongo连接 修改config/connections.js: module.expor ...

  8. 解决127.0.0.1 localhost 劫持问题

    在一个安装iis的过程中,把网站部署上去之后就发现127.0.0.1或者localhost都会跳转到一个莫名的网站,发现断网之后就是会跳转到一个Http://www.76636.com 类似这种的网站 ...

  9. Boost scoped_ptr scoped_array 以及scoped_ptr与std::auto_ptr对比

    boost::scoped_ptr和std::auto_ptr非常类似,是一个简单的智能指针,它能够保证在离开作用域后对象被自动释放.下列代码演示了该指针的基本应用: #include <str ...

  10. shell相关知识

    在bash shell中,$( )与` ` (反引号)都是用来做命令替换用(command substitution)的.所谓的命令替换与我们第五章学过的变量替换差不多,都是用来重组命令行:*完成引号 ...