1.使用的kafka 版本: 0.10.2.1
<?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>com.xxx.api</groupId> <artifactId>xxx</artifactId> <version>1.0.0</version> <name>开放服务调用框架</name> <developers> <developer> <id>412552703</id> <name>Ryan</name> <email>liuwei412552703@163.com</email> </developer> </developers> <repositories> <repository> <id>aliyun</id> <name>ali nexus</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> <repository> <id>mvnrepository</id> <name>mvn repository</name> <url>http://mvnrepository.com/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> <repository> <id>springframework repository release</id> <url>http://maven.springframework.org/release/</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> <repository> <id>Spring Plugins</id> <name>Spring Plugins</name> <url>http://repo.spring.io/plugins-release/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> <repository> <id>Spring Libs</id> <name>Spring Libs</name> <url>http://repo.spring.io/libs-milestone/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> <repository> <id>JBoss Releases</id> <name>JBoss Releases</name> <url>https://repository.jboss.org/nexus/content/repositories/releases/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> <repository> <id>apache-repo</id> <name>Apache Repository</name> <url>https://repository.apache.org/content/repositories/releases</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> <repository> <id>cloudera-repo</id> <name>Cloudera Repository</name> <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> <repository> <id>mapr-repo</id> <name>MapR Repository</name> <url>http://repository.mapr.com/maven</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> <repository> <id>spring-releases</id> <name>Spring Release Repository</name> <url>http://repo.spring.io/libs-release</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> <repository> <id>Hortonworks</id> <name>Hortonworks</name> <url>http://repo.hortonworks.com/content/repositories/releases/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> <repository> <id>Cloudera</id> <name>Cloudera</name> <url>https://repository.cloudera.com/content/repositories/releases/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> <repository> <id>WSO2</id> <name>WSO2</name> <url>http://dist.wso2.org/maven2/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> <repository> <id>Java.net Releases</id> <name>Java.net Releases</name> <url>https://maven.java.net/content/repositories/releases/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> <repository> <id>Alfresco Public</id> <name>Alfresco Public</name> <url>https://artifacts.alfresco.com/nexus/content/repositories/public/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> <repository> <id>Boundless</id> <name>Boundless</name> <url>http://repo.boundlessgeo.com/main/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> <repository> <id>OpenNMS</id> <name>OpenNMSe></name> <url>http://repo.opennms.org/maven2/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> <repository> <id>Redhat GA</id> <name>Redhat GA</name> <url>https://maven.repository.redhat.com/ga/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> <repository> <id>JBoss 3rd-party</id> <name>JBoss 3rd-party</name> <url>https://repository.jboss.org/nexus/content/repositories/ea/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> <repository> <id>NetBeans</id> <name>NetBeans</name> <url>http://bits.netbeans.org/maven2/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> <properties> <kafka.version>0.10.2.1</kafka.version> <project.build.outputEncoding>UTF-8</project.build.outputEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.project.outputEncoding>UTF-8</project.project.outputEncoding> </properties> <dependencies> <!-- ======================================= Kafka Client Jar Package ================================================ --> <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>${kafka.version}</version> </dependency> <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-streams</artifactId> <version>${kafka.version}</version> </dependency> </dependencies> <build> <finalName>${project.artifactId}-${project.version}</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.7</source> <target>1.7</target> <encoding>utf-8</encoding> </configuration> </plugin> </plugins> </build> </project>
如上POM.xml中,删减了部分其他jar ,缺少的jar 读者可自行补充。
2. Producer 端代码编写
import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.Producer; import org.apache.kafka.clients.producer.ProducerRecord; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Properties; /** * <pre> * User: Ryan * Date: 2017/6/28 * Email: liuwei412552703@163.com * Version V1.0 * Discription: */ public class KafkaStreamProducer { private static final Logger LOG = LoggerFactory.getLogger(KafkaStreamProducer.class); public static void main(String[] args) throws InterruptedException { Properties props = new Properties(); props.put("bootstrap.servers", "192.168.1.225:9092"); props.put("acks", "all"); props.put("retries", 1); props.put("batch.size", 16384); props.put("linger.ms", 1); props.put("buffer.memory", 33554432); props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); Producer<String, String> producer = new KafkaProducer<>(props); for (int i = 0; i < 1000000; i++) { String message = "这是 一条 测试 消息 , 编号:"; producer.send(new ProducerRecord<String, String>("ryan_test", Integer.toString(i), message)); LOG.info("测试发送消息: {}", message); Thread.sleep(1000); } producer.close(); } }
3. Consumer 端代码编写
import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.kafka.common.serialization.Serdes; import org.apache.kafka.streams.KafkaStreams; import org.apache.kafka.streams.KeyValue; import org.apache.kafka.streams.StreamsConfig; import org.apache.kafka.streams.kstream.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Arrays; import java.util.Locale; import java.util.Properties; /** * <pre> * User: Ryan * Date: 2017/6/28 * Email: liuwei412552703@163.com * Version V1.0 * Discription: Kafka Stream */ public class KafkaStreamWordCount { private static final Logger LOG = LoggerFactory.getLogger(KafkaStreamWordCount.class); private static final String topic = "ryan_test"; public static void main(String[] args) throws InterruptedException { Properties props = new Properties(); props.put(StreamsConfig.APPLICATION_ID_CONFIG, "streams-wordcount"); props.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "192.168.1.225:9092"); props.put(StreamsConfig.KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass().getName()); props.put(StreamsConfig.VALUE_SERDE_CLASS_CONFIG, Serdes.String().getClass().getName()); props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); props.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, 5); KStreamBuilder builder = new KStreamBuilder(); KStream<String, String> source = builder.stream(topic); KTable<String, Long> counts = source.flatMapValues(new ValueMapper<String, Iterable<String>>() { @Override public Iterable<String> apply(String value) { return Arrays.asList(value.toLowerCase(Locale.getDefault()).split(" ")); } }).map(new KeyValueMapper<String, String, KeyValue<String, String>>() { @Override public KeyValue<String, String> apply(String key, String value) { LOG.info("{} : {}", key, value); return new KeyValue<>(value, value); } }).groupByKey().count("Counts"); counts.to(Serdes.String(), Serdes.Long(), topic); counts.writeAsText("E:/ttt", Serdes.String(), Serdes.Long()); KafkaStreams streams = new KafkaStreams(builder, props); streams.start(); Thread.sleep(50000000L); streams.close(); } }
在这里,我将结果做了保存 E:/ttt 文件中。当然,你也可以调用 counts.print() 直接打印到控制台来查看。
最终的效果如下:
上图为producer 端截图。
上图为kafka stream 消费 kafka 消息,并执行任务计算。