本例中使用到的文件连接器和JSON转换器都是kafka自带的。
1.进入到kafka安装目录下启动zookeeper及kafka:
kafka安装及启动链接:centos7下kafka2.12-2.1.0的安装及使用_QYHuiiQ的博客-优快云博客_kafka2.12安装
2.启动一个分布式的worker进程。为了实现高可用性,真实的生产环境一般需要至少2~3个worker集群。在此,我们只启动一个。
connect启动有两种方式,一种是分布式,一种是standalone模式。这次我们使用分布式模式启动:
进入kafka安装目录,输入如下命令:
如果启动过程中中 出现Broker may not be available这个问题,修改config/connect-distributed.properties文件中的bootstrap.server将localhost改为服务器ip.参考:使用java代码连接不上kafka的解决方案(生产者与消费者都没能连上)_QYHuiiQ的博客-优快云博客
3.创建一个topic:kafka-connect-topic
4.创建一个文件,往里面写一写数据(\n表示换行):
(该命令表示创建一个read.txt的文件,并向中添加内容"wyh"换行"Wednesday")
vi进去看一下刚才写的数据:
5.启动一个文件数据源:
截图右边未显示完整的部分:"topic":"kafka-connect-topic"换行。
echo表示回显内容,回车之后会把刚才输入的内容回显。
name:连接器唯一名称,不能重复。
connector.class:连接器的java类。用来连接kafka集群的类名,也就是你继承SourceConnector或SinkConnector的实现类,也就是Connector程序的入口,尽量使用类的全路径名。
file:要读取的文件,相对于当前所在目录。这里我们刚才创建的文件是在kafka的安装包路径下的,如果是在config目录下,那么file的值就是"config/read.txt"。
topic:将文件的内容写到哪个topic。
6.消费一下刚才的topic来验证文件中的信息是否被读取到topic上了:
输出的结果:
可以看到在read.txt中我们输入的文本内容每一行都被转成JSON格式,并被连接器发送到我们刚才指定的topic中。默认情况下,JSON转换器会在每个记录里附带上schema。这里的schema非常简单,只有一个payload列,它是字符串类型,payload列就是文件中每一行的内容。
以上就是通过连接器将文件中的内容读取到kafka的过程。
下面我们在实验一下把kafka中的数据导出到一个指定的文件中,在此过程中,JSON转换器会把每个JSON记录转成单行文本。
7.启动文件数据池:
右边截掉的部分:"topics":"kafka-connect-topic",特别注意:这个地方是topics,表示可以从多个topic中读取数据写入到一个文件中。
file指定了要写入的文件名,自动生成该文件,该文件路径是相对于当前所在目录(kafka的安装包下)
8.我们去看一下自动生成的指定文件:
9.自动生成了我们刚才指定的文件,然后我们看一下里面的内容:
正是我们刚才在read.txt中写的数据。
10.下面我们再测试一下连接器能否实时同步数据,我们向read.txt中追加一些内容:
执行命令:echo "mytest" >> read.txt(该命令表示向文件的最后追加内容)
11.消费topic查看数据:
可以看到topic中有了我们建立连接器之后发送的消息。
12.再查看topic输出的文件read-copy.txt中的内容:
输入命令:cat read-copy.txt(查看文件内容)
需要注意的是:
1) 从文件读取到kafka时的连接器配置中连接器类名是FileStreamSourse,而从kafka读到文件中的连接器类名是FileStreamSink.
2)从文件读的时候的file指的是要读取的文件,从kafka中读到文件时的file指的是要写入的文件。
3)从文件读的时候指定的是topic,从kafka导出数据的时候指定的是topics。因为我们可以使用数据池将多个主题写入一个文件,而一个数据源只允许被写入一个主题。
附:
删除连接器的命令:curl -X DELETE http://localhost:8083/connectors/连接器名称
综上,我们成功测试了使用连接器从文件中实时读取数据到kafka以及从kafka实时读取数据到指定文件。
参考文献:《kafka权威指南》