kafka代码实现过程,第一先拉区依赖
1.依赖
<properties>
<maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>3.0.1</version>
</dependency>
</dependencies>
代码实现
public class Kafkaproducer {
public static void main(String[] args) {
//创建properties属性
Properties properties = new Properties();
//指定集群姓名
properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,"hadoop01:9092,hadoop02:9092");
//指定key序列化方式
properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
//指定value的序列化方式
properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,StringSerializer.class.getName());
//创建kafka生产者对象
KafkaProducer<String,String> kafkaProducer = new KafkaProducer<String, String>(properties);
//发送所需数据
for (int i = 0; i <5 ; i++) {
kafkaProducer.send(new ProducerRecord<String, String>("first","zhangnan"+i));
}
kafkaProducer.close();
}
}
他有个get方法主要是使它能同步
public class KafkaproducerCallSnc {
public static void main(String[] args) throws ExecutionException, InterruptedException {
//创建properties属性
Properties properties = new Properties();
//指定集群姓名
properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,"hadoop01:9092,hadoop02:9092");
//指定key序列化方式
properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
//指定value的序列化方式
properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,StringSerializer.class.getName());
//创建kafka生产者对象
KafkaProducer<String,String> kafkaProducer = new KafkaProducer<String, String>(properties);
//发送所需数据
for (int i = 0; i <5 ; i++) {
kafkaProducer.send(new ProducerRecord<String, String>("first" ,"zhaoliu" + i), new Callback() {
@Override
public void onCompletion(RecordMetadata recordMetadata, Exception e) {
if (e==null){
System.out.println(" 主题 "+recordMetadata.topic()+" 分区 "+recordMetadata.partition()+" 偏移量 "+recordMetadata.offset()+" 时间 "+recordMetadata.timestamp() );
}else {
System.out.println(e);
}
}
}).get();//get方法表示同步 等数据同步完成后直接加入
}
//关闭资源
kafkaProducer.close();
}
}
其中可以指定自定义发送的分区 通过实现Partitioner接口来自定义Partition就像这样
public class MyPartition implements Partitioner {
@Override
public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) {
String s = value.toString();
int partition;
if (s.contains("wangwu")){
partition=0;
}else {
partition=1;
}
return partition;
}
@Override
public void close() {
}
@Override
public void configure(Map<String, ?> configs) {
}
}
在使用类中定义一下partition分区
public class KafkaproducerCallBack {
public static void main(String[] args) throws InterruptedException {
//创建properties属性
Properties properties = new Properties();
//指定集群姓名
properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,"hadoop01:9092,hadoop02:9092");
//指定key序列化方式
properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
//指定value的序列化方式
properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,StringSerializer.class.getName());
//指定自定义分区
properties.put(ProducerConfig.PARTITIONER_CLASS_CONFIG, "com.zantong.producer.MyPartition");
//创建kafka生产者对象
KafkaProducer<String,String> kafkaProducer = new KafkaProducer<String, String>(properties);
//发送所需数据
for (int i = 0; i <10 ; i++) {
kafkaProducer.send(new ProducerRecord<String, String>("first", "zhaoliu" + i), new Callback() {
@Override
public void onCompletion(RecordMetadata recordMetadata, Exception e) {
if (e==null){
System.out.println(" 主题 "+recordMetadata.topic()+" 分区 "+recordMetadata.partition()+" 偏移量 "+recordMetadata.offset()+" 时间 "+recordMetadata.timestamp() );
}else {
System.out.println(e);
}
}
});
// Thread.sleep(1000);
}
//关闭资源
kafkaProducer.close();
}
}
刚开始的小demo就这样了把 剩下的之后再发