Java操作kafka

1、基本概念--消息发布与订阅

消息的发布(publish)称做producer。

消息的订阅(subscribe)称做consumer。

中间的存储阵列称做broker。

多个broker协同合作,producer、consumer和broker三者之间通过zookeeper来协调请求和转发。

producer产生和推送(push)数据到broker,consumer从broker拉取(pull)数据并进行处理。

kafka服务:

Topic:主题,Kafka处理的消息的不同分类。
Broker:消息的代理,Kafka集群中的一个kafka服务节点称为一个broker,主要存储消息数据。存在硬盘中。每个topic都是有分区的。
Partition:Topic物理上的分组,一个topic在broker中被分为1个或者多个partition,分区在创建topic的时候指定。
Message:消息,是通信的基本单位,每个消息都属于一个partition。

kafka服务相关:
Producer:消息和数据的生产者,向Kafka的一个topic发布消息。
Consumer:消息和数据的消费者,订阅topic并处理其发布的消息。
zookeeper:协调kafka的正常运行。
作用:
消息队列的应用在传统的业务中使用高吞吐、分布式、使得处理大量业务内容轻松自如。
互联网行业的日志行为实时分析,比如:实时统计用户浏览页面、搜索及其他行为,结合实时处理框架使用实现实时监控,或放到 hadoop/离线数据仓库里处理。
一种为外部的持久性日志的分布式系统提供服务。主要利用节点间备份数据,文件存储、日志压缩等功能


2、基本操作

启动服务

首先启动zookeeper服务
bin/zookeeper-server-start.sh config/zookeeper.properties

或者zkServer.sh

启动Kafka
bin/kafka-server-start.sh config/server.properties >/dev/null 2>&1 &

或者
./kafka-server-start.sh /usr/local/kafka/kafka_2.11-0.10.1.1/config/server.properties 
ps aux|grep kafka jps


创建topic
创建一个"test"的topic,一个分区一个副本
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
查看主题
bin/kafka-topics.sh --list --zookeeper localhost:2181
查看主题详情
bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic test
删除主题
bin/kafka-topics.sh --zookeeper localhost:2181 --delete --topic test


创建生产者 producer
bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test 
/usr/hdp/2.4.*/kafka/bin/kafka-console-producer.sh --broker-list node1:6667,node2:6667,node3:6667 --topic threadtest
创建消费者 consumer
bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic test --from-beginning
/usr/hdp/2.4.3.0-227/kafka/bin/kafka-console-consumer.sh --zookeeper node1:2181,node2:2181,node3:2181 --topic threadtest


生产者参数查看:bin/kafka-console-producer.sh

消费者参数查看:bin/kafka-console-consumer.sh

3、编写JAVA程序

消费者

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import kafka.consumer.ConsumerConfig;
import kafka.consumer.ConsumerIterator;
import kafka.consumer.KafkaStream;
import kafka.javaapi.consumer.ConsumerConnector;

public class my_Consumertest extends Thread{

    private final ConsumerConnector consumer;
    private final String topic;

    public static void main(String[] args) {
      my_Consumertest consumerThread = new my_Consumertest("threadtest");
      System.out.println("consumerThread :"+consumerThread); //Thread[Thread-0,5,main]
      consumerThread.start();
    }
    public my_Consumertest(String topic) {
        consumer =kafka.consumer.Consumer.createJavaConsumerConnector(createConsumerConfig());
        this.topic =topic;
    }

private static ConsumerConfig createConsumerConfig() {
    Properties props = new Properties();
    // 设置zookeeper的链接地址
    props.put("zookeeper.connect", "192.168.3.50:2181,192.168.3.51:2181,192.168.3.52:2181");
    // 设置group id
    props.put("group.id", "1");
    // kafka的group 消费记录是保存在zookeeper上的, 但这个信息在zookeeper上不是实时更新的, 需要有个间隔时间更新
    props.put("auto.commit.interval.ms", "1000");
    props.put("zookeeper.session.timeout.ms","400");
    return new ConsumerConfig(props);
}

@Override
public void run(){
     //设置Topic=>Thread Num映射关系, 构建具体的流
    Map<String,Integer> topickMap = new HashMap<String, Integer>();
    topickMap.put(topic, 1);
    System.out.println("topickMap  "+topickMap);    //{threadtest=1}
    Map<String, List<KafkaStream<byte[],byte[]>>>  streamMap=consumer.createMessageStreams(topickMap);

    KafkaStream<byte[],byte[]> stream = streamMap.get(topic).get(0);
    ConsumerIterator<byte[],byte[]> it =stream.iterator();
    System.out.println("*********Results********");
    while(it.hasNext()){
        System.err.println("get data:" +new String(it.next().message()));
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
}

生产者

import java.util.Date;
import java.util.Properties;
import java.text.SimpleDateFormat;

import kafka.javaapi.producer.Producer;
import kafka.producer.KeyedMessage;
import kafka.producer.ProducerConfig;

public class my_producer {

     public static void main(String[] args) {
         Properties props = new Properties();
         props.put("zookeeper.connect", "192.168.3.50:2181,192.168.3.51:2181,192.168.3.52:2181");
      // serializer.class为消息的序列化类
         props.put("serializer.class", "kafka.serializer.StringEncoder");
         props.put("metadata.broker.list", "192.168.3.50:6667,192.168.3.51:6667,192.168.3.52:6667");

         props.put("num.partitions", "6");
         ProducerConfig config = new ProducerConfig(props);
         Producer<String, String> producer = new Producer<String, String>(config);
         for (int i = 0; i < 10; i++)
         {
           SimpleDateFormat formatter = new SimpleDateFormat   ("yyyy年MM月dd日 HH:mm:ss SSS");
           Date curDate = new Date(System.currentTimeMillis());//获取当前时间
           String str = formatter.format(curDate);

           String msg = "produce " + i+"="+str;
           String key = i+"";
           //如果没有key默认随机随机分区
           producer.send(new KeyedMessage<String, String>("threadtest", key, msg));
         }
       }
}
可以在通过java代码实现kafka之间的通信,也可以实现java代码与控制台之间的通信

例如:接收

/usr/hdp/2.4.3.0-227/kafka/bin/kafka-console-consumer.sh --zookeeper node1:2181,node2:2181,node3:2181 --topic bds_data

发送

/usr/hdp/2.4.*/kafka/bin/kafka-console-producer.sh --broker-list node1:6667,node2:6667,node3:6667 --topic threadtest

附:Demo下载地址

http://download.csdn.net/download/qq_31780525/9931062


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值