[Kafka] - Kafka Java Producer代码实现
根据业务需要可以使用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中的数字决定分区的值。具体代码如下:
- import kafka.producer.Partitioner;
- import kafka.utils.VerifiableProperties;
- /**
- * Created by gerry on 12/21.
- */
- public class JavaKafkaProducerPartitioner implements Partitioner {
- /**
- * 无参构造函数
- */
- public JavaKafkaProducerPartitioner() {
- this(new VerifiableProperties());
- }
- /**
- * 构造函数,必须给定
- *
- * @param properties 上下文
- */
- public JavaKafkaProducerPartitioner(VerifiableProperties properties) {
- // nothings
- }
- @Override
- public int partition(Object key, int numPartitions) {
- int num = Integer.valueOf(((String) key).replaceAll("key_", "").trim());
- return num % numPartitions;
- }
- }
二、 JavaKafkaProducer:通过Kafka提供的API进行数据产生操作的测试类;具体代码如下:
- import kafka.javaapi.producer.Producer;
- import kafka.producer.KeyedMessage;
- import kafka.producer.ProducerConfig;
- import org.apache.log4j.Logger;
- import java.util.Properties;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- import java.util.concurrent.TimeUnit;
- import java.util.concurrent.atomic.AtomicBoolean;
- import java.util.concurrent.ThreadLocalRandom;
- /**
- * Created by gerry on 12/21.
- */
- public class JavaKafkaProducer {
- private Logger logger = Logger.getLogger(JavaKafkaProducer.class);
- public static final String TOPIC_NAME = "test";
- public static final char[] charts = "qazwsxedcrfvtgbyhnujmikolp1234567890".toCharArray();
- public static final int chartsLength = charts.length;
- public static void main(String[] args) {
- String brokerList = "192.168.187.149:9092";
- brokerList = "192.168.187.149:9092,192.168.187.149:9093,192.168.187.149:9094,192.168.187.149:9095";
- brokerList = "192.168.187.146:9092";
- Properties props = new Properties();
- props.put("metadata.broker.list", brokerList);
- /**
- * 0表示不等待结果返回<br/>
- * 1表示等待至少有一个服务器返回数据接收标识<br/>
- * -1表示必须接收到所有的服务器返回标识,及同步写入<br/>
- * */
- props.put("request.required.acks", "0");
- /**
- * 内部发送数据是异步还是同步
- * sync:同步, 默认
- * async:异步
- */
- props.put("producer.type", "async");
- /**
- * 设置序列化的类
- * 可选:kafka.serializer.StringEncoder
- * 默认:kafka.serializer.DefaultEncoder
- */
- props.put("serializer.class", "kafka.serializer.StringEncoder");
- /**
- * 设置分区类
- * 根据key进行数据分区
- * 默认是:kafka.producer.DefaultPartitioner ==> 安装key的hash进行分区
- * 可选:kafka.serializer.ByteArrayPartitioner ==> 转换为字节数组后进行hash分区
- */
- props.put("partitioner.class", "JavaKafkaProducerPartitioner");
- // 重试次数
- props.put("message.send.max.retries", "3");
- // 异步提交的时候(async),并发提交的记录数
- props.put("batch.num.messages", "200");
- // 设置缓冲区大小,默认10KB
- props.put("send.buffer.bytes", "102400");
- // 2. 构建Kafka Producer Configuration上下文
- ProducerConfig config = new ProducerConfig(props);
- // 3. 构建Producer对象
- final Producer<String, String> producer = new Producer<String, String>(config);
- // 4. 发送数据到服务器,并发线程发送
- final AtomicBoolean flag = new AtomicBoolean(true);
- int numThreads = 50;
- ExecutorService pool = Executors.newFixedThreadPool(numThreads);
- for (int i = 0; i < 5; i++) {
- pool.submit(new Thread(new Runnable() {
- @Override
- public void run() {
- while (flag.get()) {
- // 发送数据
- KeyedMessage message = generateKeyedMessage();
- producer.send(message);
- System.out.println("发送数据:" + message);
- // 休眠一下
- try {
- int least = 10;
- int bound = 100;
- Thread.sleep(ThreadLocalRandom.current().nextInt(least, bound));
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- System.out.println(Thread.currentThread().getName() + " shutdown....");
- }
- }, "Thread-" + i));
- }
- // 5. 等待执行完成
- long sleepMillis = 600000;
- try {
- Thread.sleep(sleepMillis);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- flag.set(false);
- // 6. 关闭资源
- pool.shutdown();
- try {
- pool.awaitTermination(6, TimeUnit.SECONDS);
- } catch (InterruptedException e) {
- } finally {
- producer.close(); // 最后之后调用
- }
- }
- /**
- * 产生一个消息
- *
- * @return
- */
- private static KeyedMessage<String, String> generateKeyedMessage() {
- String key = "key_" + ThreadLocalRandom.current().nextInt(10, 99);
- StringBuilder sb = new StringBuilder();
- int num = ThreadLocalRandom.current().nextInt(1, 5);
- for (int i = 0; i < num; i++) {
- sb.append(generateStringMessage(ThreadLocalRandom.current().nextInt(3, 20))).append(" ");
- }
- String message = sb.toString().trim();
- return new KeyedMessage(TOPIC_NAME, key, message);
- }
- /**
- * 产生一个给定长度的字符串
- *
- * @param numItems
- * @return
- */
- private static String generateStringMessage(int numItems) {
- StringBuilder sb = new StringBuilder();
- for (int i = 0; i < numItems; i++) {
- sb.append(charts[ThreadLocalRandom.current().nextInt(chartsLength)]);
- }
- return sb.toString();
- }
- }
三、Pom.xml依赖配置如下
- <properties>
- <kafka.version>0.8.2.1</kafka.version>
- </properties>
- <dependencies>
- <dependency>
- <groupId>org.apache.kafka</groupId>
- <artifactId>kafka_2.10</artifactId>
- <version>${kafka.version}</version>
- </dependency>
- </dependencies>
[Kafka] - Kafka Java Producer代码实现的更多相关文章
- kafka集群和zookeeper集群的部署,kafka的java代码示例
来自:http://doc.okbase.net/QING____/archive/19447.html 也可参考: http://blog.csdn.net/21aspnet/article/det ...
- kafka的Java客户端示例代码(kafka_2.12-0.10.2.1)
使用0.9开始增加的KafkaProducer和KafkaConsumer. Pom.xml <project xmlns="http://maven.apache.org/POM/4 ...
- Kafka设计解析(二十一)关于Kafka幂等producer的讨论
转载自 huxihx,原文链接 关于Kafka幂等producer的讨论 众所周知,Kafka 0.11.0.0版本正式支持精确一次处理语义(exactly once semantics,下称EOS) ...
- 关于Kafka幂等producer的讨论
众所周知,Kafka 0.11.0.0版本正式支持精确一次处理语义(exactly once semantics,下称EOS).Kafka的EOS主要体现在3个方面: 幂等producer:保证发送单 ...
- Kafka 0.8 Producer处理逻辑
Kafka Producer产生数据发送给Kafka Server,具体的分发逻辑及负载均衡逻辑,全部由producer维护. 1.Kafka Producer默认调用逻辑 1.1 默认Partiti ...
- 4 kafka集群部署及kafka生产者java客户端编程 + kafka消费者java客户端编程
本博文的主要内容有 kafka的单机模式部署 kafka的分布式模式部署 生产者java客户端编程 消费者java客户端编程 运行kafka ,需要依赖 zookeeper,你可以使用已有的 zo ...
- Kafka学习(四)-------- Kafka核心之Producer
通过https://www.cnblogs.com/tree1123/p/11243668.html 已经对consumer有了一定的了解.producer比consumer要简单一些. 一.旧版本p ...
- Kafka 0.8 Producer (0.9以前版本适用)
Kafka旧版本producer由scala编写,0.9以后已经废除,但是很多公司还在使用0.9以前的版本,所以总结如下: 要注意包Producer是 kafka.javaapi.producer.P ...
- kafka 生产者java编码
public class KafkaProducerDemo { public static void main(String[] args) throws InterruptedException ...
随机推荐
- Windows Server 2008及以上系统磁盘无法查看(About UAC and ACE)
在windows Server2008及以上系統,如果UAC Enabled,ACE列表中不會包含Administrators成員的SID,所以即使你是administrators的成員,也無法訪問D ...
- Storm-源码分析-Topology Submit-Task
mk-task, 比较简单, 因为task只是概念上的结构, 不象其他worker, executor都需要创建进程或线程 所以其核心其实就是mk-task-data, 1. 创建TopologyCo ...
- sqlalchemy(二)高级用法 2
转自:https://www.cnblogs.com/coder2012/p/4746941.html 外键以及relationship 首先创建数据库,在这里一个user对应多个address,因此 ...
- 7.Insert Methods-官方文档摘录
总结 列举insert插入方法 MongoDB provides the following methods for inserting documents into a collection: db ...
- MySQL给字段唯一索引的三种方法
建表时添加 DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `stu_id` ) NOT NULL AUTO_INCREMENT, ` ...
- Python生成器是什么
生成器是 Python 初级开发者最难理解的概念之一,虽被认为是 Python 编程中的高级技能,但在各种项目中可以随处见到生成器的身影,你得去理解它.使用它.甚至爱上它. 提到生成器,总不可避免地要 ...
- node.js---sails项目开发(4)---配置MongoDB数据库连接
1.安装sails对mongo的依赖 npm install sails-mongo --save 2. 配置mongo连接 修改config/connections.js: module.expor ...
- 解决127.0.0.1 localhost 劫持问题
在一个安装iis的过程中,把网站部署上去之后就发现127.0.0.1或者localhost都会跳转到一个莫名的网站,发现断网之后就是会跳转到一个Http://www.76636.com 类似这种的网站 ...
- Boost scoped_ptr scoped_array 以及scoped_ptr与std::auto_ptr对比
boost::scoped_ptr和std::auto_ptr非常类似,是一个简单的智能指针,它能够保证在离开作用域后对象被自动释放.下列代码演示了该指针的基本应用: #include <str ...
- shell相关知识
在bash shell中,$( )与` ` (反引号)都是用来做命令替换用(command substitution)的.所谓的命令替换与我们第五章学过的变量替换差不多,都是用来重组命令行:*完成引号 ...