您的位置:首页 > 其它

Kafka使用入门

2016-04-12 10:50 351 查看

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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: