本文是基于hadoop 2.7.1,以及kafka 0.11.0.0。kafka-connect是以单节点模式运行,即standalone。
一. kafka和kafka connect简介
kafka:Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。比较直观的解释就是其有一个生产者(producer)和一个消费者(consumer)。可以将kafka想象成一个数据容器,生产者负责发送数据到这个容器中,而消费者从容器中取出数据,在将数据做处理,如存储到hdfs。
kafka connect:Kafka Connect是一种用于在Kafka和其他系统之间可扩展的、可靠的流式传输数据的工具。它使得能够快速定义将大量数据集合移入和移出Kafka的连接器变得简单。即适合批量数据导入导出操作。
二. 如何用kafka connect将数据写入到hdfs中
首先启动kafka-connect:
bin/connect-standalone.sh config/connect-standalone.properties config/connector1.properties
这个命令后面两个参数,
第一个是指定启动的模式,有分布式和单节点两种,这里是单节点。kafka自带,放于config目录下。
第二个参数指向描述connector的属性的文件,可以有多个,这里只有一个connector用来写入到hdfs。需要自己创建。
接下来看看connector1.properties的内容,
name="test" #该connector的名字
#将自己按connect接口规范编写的代码打包后放在kafka/libs目录下,再根据项目结构引用对应connector
connector.class=hdfs.HdfsSinkConnector
#Task是导入导出的具体实现,这里是指定多少个task来并行运行导入导出作业,由多线程实现。由于hdfs中一个文件每次只能又一个文件操作,所以这里只能是1
tasks.max=1
#指定从哪个topic读取数据,这些其实是用来在connector或者task的代码中读取的。
topics=test
#指定key以那种方式转换,需和Producer发送方指定的序列化方式一致
key.converter=org.apache.kafka.connect.converters.ByteArrayConverter
value.converter=org.apache.kafka.connect.json.JsonConverter #同上
hdfs.url=hdfs://127.0.0.1:9000 #hdfs的url路径,在Connector中会被读取
hdfs.path=/test/file #hdfs文件路径,同样Connector中被读取
key.converter.schemas.enable=true #稍后介绍,可以true也可以false,影响传输格式
value.converter.schemas.enable=true #稍后介绍,可以true也可以false
三. 主要代码
connect主要是导入导出两个概念,导入是source,导出时Sink。这里只使用Sink,不过Source和Sink的实现其实基本相同。
实现Sink其实不难,实现对应的接口,