Kafka使用入门

Kafka使用入门

kafka安装

参照http://kafka.apache.org/documentation.html#quickstart中的方法下载安装。

运行中kafka的JAVA进程(jps)

23210 Kafka
22566 QuorumPeerMain

kafka console api

基本命令有如下几个:

启动、关闭zookeeper

kafka依赖于zookeeper,而zookeeper集成在kafka中的,如果系统中的zookeeper正在运行,请直接忽略本部分内容。不要随意开启或关闭正在运行的zookeeper。

> bin/zookeeper-server-start.sh config/zookeeper.properties

zookeeper默认运行于localhost:2181端口,配置项在zookeeper.properties中。

启动、关闭kafka-server

启动命令为

> bin/kafka-server-start.sh config/server.properties

默认端口为9092,配置项在server.properties中。

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 --delete --zookeeper localhsot:2181 --topic test

删除topic命令如果生效需要修改server.properties,使得

delete.topic.enable=true

consumer和producer命令

这两条是最常用的命令

> bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic test --from-beginning

最后的–from-beginning是从该topic的起始点开始消费数据,否则从最新处消费数据。

> bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test

console api 运行时的进程名

21009 ConsoleConsumer
24888 ConsoleProducer

kafka java api

使用maven构建项目最为方便,可以轻松的解决依赖项的问题。假定我们使用的依赖项如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>kafka0.0.0</groupId>
  <artifactId>kafka0.0.0</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <description>kafka0.0.0</description>
  <properties>
        <kafka.version>0.8.2.1</kafka.version>
        <slf4j.version>1.7.12</slf4j.version>
        <junit.version>4.12</junit.version>
        <json.version>20160212</json.version>
  </properties> 
  <dependencies>   
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>${json.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.kafka</groupId>
            <artifactId>kafka_2.10</artifactId>
            <version>${kafka.version}</version>
            <scope>compile</scope>
        </dependency>

        <dependency>
            <groupId>org.apache.kafka</groupId>
            <artifactId>kafka-clients</artifactId>
            <version>${kafka.version}</version>
            <scope>compile</scope>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

java producer

简单的kafka生产者java代码为:

package main.app1;

import java.util.Properties;

import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.clients.producer.ProducerConfig;

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

public class test1 
{
    private final KafkaProducer<String,String> producer;
    public final static String TOPIC = "test";

    private test1(){
        Properties props = new Properties();
        //配置kafka的端口
        props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "host1:port1,host2:port2");

        //配置value的序列化类
        props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");
        //配置key的序列化类
        props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");

        //request.required.acks
        //0, which means that the producer never waits for an acknowledgement from the broker (the same behavior as 0.7). This option provides the lowest latency but the weakest durability guarantees (some data will be lost when a server fails).
        //1, which means that the producer gets an acknowledgement after the leader replica has received the data. This option provides better durability as the client waits until the server acknowledges the request as successful (only messages that were written to the now-dead leader but not yet replicated will be lost).
        //-1, which means that the producer gets an acknowledgement after all in-sync replicas have received the data. This option provides the best durability, we guarantee that no messages will be lost as long as at least one in sync replica remains.
        props.put(ProducerConfig.ACKS_CONFIG,"-1");

        producer = new KafkaProducer<String,String>(props);
    }

    void produce() {
        int messageNo = 0;
        final int COUNT = 100;

        while (messageNo < COUNT) {
            String key = String.valueOf(messageNo);
            String data = "{\"time\":\"2015-09-01T01:35:19Z\",\"url\":\"/foo\",\"user\":\"bob\",\"latencyMs\":66}";
            producer.send(new ProducerRecord<String,String>(TOPIC, data));
            System.out.println(data);
            messageNo ++;
        }

        producer.close();
    }

    public static void main( String[] args )
    {
        new test1().produce();
    }
}

执行时如果需要在eclipse或idea中远程执行,需要在server.properties中修改配置为:

advertised.host.name=host

java consumer

package main.app1;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

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

/*
 * 详细可以参考:https://cwiki.apache.org/confluence/display/KAFKA/Consumer+Group+Example
 */
public class ConsumerDemo {
    private final ConsumerConnector consumer;
    private final String topic;
    private ExecutorService executor;

    public ConsumerDemo(String a_zookeeper, String a_groupId, String a_topic) {
        consumer = Consumer.createJavaConsumerConnector(createConsumerConfig(a_zookeeper,a_groupId));
        this.topic = a_topic;
    }

    public void shutdown() {
        if (consumer != null)
            consumer.shutdown();
        if (executor != null)
            executor.shutdown();
    }

    public void run(int numThreads) {
        Map<String, Integer> topicCountMap = new HashMap<String, Integer>();
        topicCountMap.put(topic, new Integer(numThreads));
        Map<String, List<KafkaStream<byte[], byte[]>>> consumerMap = consumer
                .createMessageStreams(topicCountMap);
        List<KafkaStream<byte[], byte[]>> streams = consumerMap.get(topic);

        // now launch all the threads
        executor = Executors.newFixedThreadPool(numThreads);

        // now create an object to consume the messages
        //
        int threadNumber = 0;
        for (final KafkaStream stream : streams) {
            executor.submit(new ConsumerMsgTask(stream, threadNumber));
            threadNumber++;
        }
    }

    private static ConsumerConfig createConsumerConfig(String a_zookeeper,
            String a_groupId) {
        Properties props = new Properties();
        props.put("zookeeper.connect", a_zookeeper);
        props.put("group.id", a_groupId);
        props.put("zookeeper.session.timeout.ms", "400");
        props.put("zookeeper.sync.time.ms", "200");
        props.put("auto.commit.interval.ms", "1000");

        return new ConsumerConfig(props);
    }

    public static void main(String[] arg) {
        String[] args = { "10.10.8.236:2181", "group-1", "pageviews", "1" };
        String zooKeeper = args[0];
        String groupId = args[1];
        String topic = args[2];
        int threads = Integer.parseInt(args[3]);

        ConsumerDemo demo = new ConsumerDemo(zooKeeper, groupId, topic);
        demo.run(threads);

        try {
            Thread.sleep(600000);
        } catch (InterruptedException ie) {

        }
        demo.shutdown();
    }
}
------------------------------------------------------------------------------
package main.app1;

import kafka.consumer.ConsumerIterator;
import kafka.consumer.KafkaStream;

public class ConsumerMsgTask implements Runnable {
    private KafkaStream m_stream;
    private int m_threadNumber;

    public ConsumerMsgTask(KafkaStream stream, int threadNumber) {
        m_threadNumber = threadNumber;
        m_stream = stream;
    }

    public void run() {
        ConsumerIterator<byte[], byte[]> it = m_stream.iterator();
        while (it.hasNext())
            System.out.println("Thread " + m_threadNumber + ": "
                    + new String(it.next().message()));
        System.out.println("Shutting down Thread: " + m_threadNumber);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值