Kafaka入门篇
1.Apache Kafka - 简介
Apache Kafka是一个分布式发布 - 订阅消息系统和一个强大的队列,可以处理大量的数据,并使您能够将消息从一个端点传递到另一个端点。 Kafka适合离线和在线消息消费。 Kafka消息保留在磁盘上,并在群集内复制以防止数据丢失。 Kafka构建在ZooKeeper同步服务之上。 它与Apache Storm和Spark非常好地集成,用于实时流式数据分析。Kafka专为分布式高吞吐量系统而设计。 Kafka往往工作得很好,作为一个更传统的消息代理的替代品。 与其他消息传递系统相比,Kafka具有更好的吞吐量,内置分区,复制和固有的容错能力,这使得它非常适合大规模消息处理应用程序。Kafka的具体理论知识可以查看官方文档介绍,http://kafka.apache.org/。
2.Kafka的安装
首先确保已经安装过java环境,如果没有可以去官网下载对应版本的jdk。我用的是jdk-8u161-linux-x64.tar.gz,zookeeper-3.4.10.tar.gz,kafka_2.11-1.1.0.tgz。
然后需要安装zookeeper,
tar -zxf zookeeper-3.4.10.tar.gz
cd zookeeper-3.4.10
mkdir data
vi conf/zoo.cfg
tickTime=2000
dataDir=/opt/zookeeper-3.4.10/data
clientPort=2181
initLimit=5
syncLimit=2
启用zookeeper:bin/zkServer.sh start
最后就是Kafka的安装:
cd /opt
tar -zxf kafka_2.11-1.1.0.tgz
cd kafka_2.11-1.1.0
启动: bin/kafka-server-start.sh config/server.properties,你将看到如下信息
关闭的话输入 bin/kafka-server-stop.sh config/server.properties 即可。
后台启动命令,bin/kafka-server-start.sh config/server.properties 1>/dev/null 2>&1 &
3.代码实现生产者
新建一个maven项目(当然java项目或SpringBoot项目也可以),引入所需jar包,pom.xml如下。
<?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>cn.sp</groupId>
<artifactId>kafka-demo</artifactId>
<version>1.0-SNAPSHOT</version> <dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.kafka/kafka -->
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka_2.12</artifactId>
<version>1.1.0</version>
</dependency> <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
<!--<scope>test</scope>-->
</dependency> <!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency> </dependencies> </project>
消息生产者代码:
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord; import java.util.Properties; /**
* Created by 2YSP on 2018/4/3.
*/
public class ProducerTest { public static void main(String[] args) {
if (args.length == 0) {
System.out.println("Enter topic name");
return;
} //Assign topicName to string variable
String topicName = args[0]; //create instance for properties to access producer configs
Properties props = new Properties(); //Assign localhost id 192.168.75.132
props.put("bootstrap.servers","192.168.75.132:9092"); props.put("acks","all"); //If the request fails, the producer can automatically retry,
props.put("retries",0); //Specify buffer size in config
props.put("batch.size",16384); 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<String, String>(props);
for (int i=0;i<10;i++){
producer.send(new ProducerRecord<String, String>(topicName,Integer.toString(i),Integer.toString(i))); }
System.out.println("message send successfully");
producer.close();
}
}
当然,这里也可以弄一个.properties文件,然后代码里加载配置,运行时需要添加主题参数,我用的是idea就比较简单了。
4.代码实现消费者
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer; import java.util.Arrays;
import java.util.Properties; /**
* Created by 2YSP on 2018/4/3.
*/
public class ConsumerGroup { public static void main(String[] args) {
if (args.length < 2){
System.out.println("Usage: consumer <topic> <groupname> ");
return;
} String topic = args[0];
String group = args[1]; Properties props = new Properties();
props.put("bootstrap.servers","192.168.75.132:9092");
props.put("group.id",group);
props.put("enable.auto.commit","true");
props.put("auto.commit.interval.ms","1000");
props.put("session.timeout.ms","30000");
//当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,从头开始消费
props.put("auto.offset.reset", "earliest");
props.put("key.deserializer","org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer","org.apache.kafka.common.serialization.StringDeserializer"); KafkaConsumer<String,String> consumer = new KafkaConsumer<String, String>(props); consumer.subscribe(Arrays.asList(topic));
while (true){
ConsumerRecords<String, String> records = consumer.poll(200);
for(ConsumerRecord<String, String> record:records){
System.out.printf("============offset = %d,key = %s,value=%s\n",record.offset(),record.key(),record.value());
}
//提交已经拉取出来的offset,如果是手动模式下面,必须拉取之后提交,否则以后会拉取重复消息
consumer.commitSync(); try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
先运行生产者代码,再运行消费者代码,控制台输出如下:
5.遇到的坑
本以为很简单的,结果中间遇到了很多坑,所以想记录下。
坑一:kafka_2.11-0.9.0.0.tgz这个版本的kafka一运行发送消息命令(bin/kafka-console-producer.sh --broker-list localhost:9092 --topic topic-name)就卡死了,弄了半天也找不到原因,无奈换了版本。
坑二:引入日志jar包不全,运行报错,折腾了一会儿。
坑三:一运行代码就报连接不上的错误,抛异常。
解决办法:找到config文件夹下的server.properties文件,修改advertised.listeners=PLAINTEXT://192.168.75.132:9092,其中192.168.75.132是我虚拟机的ip地址,以便外网访问。
再找到consumer.properties文件,bootstrap.servers=192.168.75.132:9092,group.id=group1,这里的group.id也可以不改就用默认的,但是代码配置里的一定要一样。
坑四:然后还是无法连接,想到防火墙问题就准备改端口,发现centos7的/etc/sysconfig文件夹下没有iptables文件。。。
解决办法:照着网上的办法弄好了,连接地址,又觉得改配置麻烦就索性关闭防火墙了。
至此,程序终于跑通了。。。
参考文档:https://www.w3cschool.cn/apache_kafka/
Kafaka入门篇的更多相关文章
- Membership三步曲之入门篇 - Membership基础示例
Membership 三步曲之入门篇 - Membership基础示例 Membership三步曲之入门篇 - Membership基础示例 Membership三步曲之进阶篇 - 深入剖析Pro ...
- spring boot(一):入门篇
构建微服务:Spring boot 入门篇 什么是spring boot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框 ...
- 1. web前端开发分享-css,js入门篇
关注前端这么多年,没有大的成就,就入门期间积累了不少技巧与心得,跟大家分享一下,不一定都适合每个人,毕竟人与人的教育背景与成长环境心理活动都有差别,但就别人的心得再结合自己的特点,然后探索适合自己的学 ...
- 一个App完成入门篇(七)- 完成发现页面
第七章是入门篇的倒数第二篇文章了,明天整个APP将进入收官. 本节教程主要要教会大家使用二维码扫描和用do_WebView组件加在html页面. 导入项目 do_WebView组件 扫描功能 自定义事 ...
- [原创]Linq to xml增删改查Linq 入门篇:分分钟带你遨游Linq to xml的世界
本文原始作者博客 http://www.cnblogs.com/toutou Linq 入门篇(一):分分钟带你遨游linq to xml的世界 本文原创来自博客园 请叫我头头哥的博客, 请尊重版权, ...
- 转:OSGi 入门篇:模块层
OSGi 入门篇:模块层 1 什么是模块化 模块层是OSGi框架中最基础的一部分,其中Java的模块化特性在这一层得到了很好的实现.但是这种实现与Java本身现有的一些模块化特性又有明显的不同. 本文 ...
- 转:OSGi 入门篇:生命周期层
OSGi 入门篇:生命周期层 前言 生命周期层在OSGi框架中属于模块层上面的一层,它的运作是建立在模块层的功能之上的.生命周期层一个主要的功能就是让你能够从外部管理应用或者建立能够自我管理的应用(或 ...
- 【three.js详解之一】入门篇
[three.js详解之一]入门篇 开场白 webGL可以让我们在canvas上实现3D效果.而three.js是一款webGL框架,由于其易用性被广泛应用.如果你要学习webGL,抛弃那些复杂的 ...
- [Maven]Apache Maven 入门篇
作者:George Ma 上 写这个 maven 的入门篇是因为之前在一个开发者会的动手实验中发现挺多人对于 maven 不是那么了解,所以就有了这个想法.这个入门篇分上下两篇.本文着重动手,用 ma ...
随机推荐
- Java生成验证码并进行验证(转)
本文转自http://blog.csdn.net/worm0527/article/details/51030864 一.实现思路 使用BufferedImage用于在内存中存储生成的验证码图片 使用 ...
- sql 语句哪里添加单引号问题
1.sql 语句哪里添加单引号问题,哪些地方必须加双引号,否则sql语句会报错? :涉及varchar的值的时候,必须有单引号包括varchar值.int等其他字段类型,则不需要加单引号包括. 如: ...
- 查看linux接口进出口流量的命令;linux 网络监控;流量监控
1.nload,左右键切换网卡 2.sudo iftop 3.sudo iptraf 按连接/端口查看流量 4.sudo nethogs: 按进程查看流量占用 5.ss: 连接查看工具 6.dstat ...
- Office WORD EXCEL批量查找和替换技巧实例
1 删除多余的空行 如果是在WORD中,则查找^p^p替换为^p. 如果是在EXCEL里,则为全部选中,然后点击编辑,定位,定位条件,空值. 将全部选中空白的行,如图所示 再次点击编辑,删除,删除 ...
- Activity调用isDestroyed()方法报出,java.lang.NoSuchMethodError
在測试App的过程中,Activity调用了isDestroyed()方法,报出了java.lang.NoSuchMethodError错误. 自己手机MI 2S,版本号4.1.1. 事实上原因就是i ...
- redux-saga 异步流
前言 React的作用View层次的前端框架,自然少不了很多中间件(Redux Middleware)做数据处理, 而redux-saga就是其中之一,目前这个中间件在网上的资料还是比较少,估计应用的 ...
- 51NOD 1821 最优集合 栈
1821 最优集合 一个集合S的优美值定义为:最大的x,满足对于任意i∈[1,x],都存在一个S的子集S',使得S'中元素之和为i. 给定n个集合,对于每一次询问,指定一个集合S1和一个集合S2, ...
- linux driver开发
1 开发linux driver时的调试思路 基本上是打印调试,原因很简单,方便.或者使用工具挂住cpu.
- Lightoj 1014 - Ifter Party
I have an Ifter party at the 5th day of Ramadan for the contestants. For this reason I have invited ...
- YTU 2597: 编程题B-选拔飞行员
2597: 编程题B-选拔飞行员 时间限制: 1 Sec 内存限制: 128 MB 提交: 131 解决: 35 题目描述 2100年空军选拔高中生飞行学员基本条件要求如下,年龄范围:16-19周 ...