Apache Kafka 是最大、最成功的开源项目之一,可以说是无人不知无人不晓,在前面的文章《Apache Kafka分布式流处理平台及大厂面试宝典》我们也充分认识了Kafka,Apache Kafka 是LinkedIn 开发并开源的,LinkedIn 核心理念之一数据驱动主要有两点领悟,其一是强调动态数据有效性要远远大于静态数据,何为动态数据和静态数据,可以简单理解静态数据则为我们目前基于各种各样的数据库或文件系统等存储系统,而动态数据是基于事件驱动的理念如现在主流Apache Kafka和Apache Pulsar。其二是要利用所有数据化信息而不仅仅是交易核心数据,非交易核心数据量比交易核心数据量往往要大100倍都不止。作为当时开发出Apache Kafka实时消息流技术的几个团队成员出来创业,其中Jay Kreps带头创立了新公司Confluent,还有饶军也是Confluent联合创始人之一,而Confluent的产品基本都是围绕着Kafka来做的。基于动态数据理念是Apache Kafka 到Confluent企业化之路的主引线。
Confluent公司官网地址 https://www.confluent.io/
Confluent 开创了一个新的数据基础设施,专注于他们动态数据 —— 本质上是数据流(流动中的数据),适合实时数据,公司的使命是“让数据动起来”。Confluent 以 Kafka 为核心,是将其商业化最成功的领先独立公司之一。对数据的集成和连接进行实时操作,如果要真正利用Kafka,使用Confluent是目前最佳事先方案。 官网主要产品如下
而核心的商业化产品为Confluent Platform(可以在本地进行部署)和Confluent Cloud(托管在云中,并在混合云基础设施的环境中工作)。
Confluent Platform又分为三块
提供了KafkaSteams和KsqlDB企业级Kafka应用特性
存储方式采用云原生的架构,和Apache Pulsar一样采用存储和计算分离的架构,可以很方便实现分布式扩容,存储资源不够单独扩容存储,计算资源不够单独扩容计算。
Kafka Connect是Apache Kafka的一个组件,用于执行Kafka和其他系统之间的流集成,比如作为用来将Kafka与数据库、key-value存储系统、搜索系统、文件系统等外部系统连接起来的基础框架。通过使用Kafka Connect框架以及现有的连接器可以实现从源数据读入消息到Kafka,再从Kafka读出消息到目的地的功能。Kafka Connect可以很容易地将数据从多个数据源流到Kafka,并将数据从Kafka流到多个目标。Kafka Connect有上百种不同的连接器。Confluent 在 Kafka connect基础上实现了上百种不同的connector连接器免费让大家使用,而且Confluent
在GitHub
上提供了源码,可以根据自身业务需求进行修改。其中最流行的有:
可以自己运行Kafka Connect,或者利用Confluent Cloud中提供的众多托管连接器来提供一个完全基于云的集成解决方案。除了托管连接器外,Confluent还提供了完全托管的Apache Kafka、Schema Registry和ksqlDB。
Kafka Connect运行在自己的进程中,独立于Kafka broker。它是分布式的、可伸缩的、容错的,就像Kafka本身一样。使用Kafka Connect不需要编程,因为它只由JSON配置驱动。这使得它可以被广泛的用户使用。除了接收和输出数据,Kafka Connect还可以在数据通过时执行轻量级的转换。
Kafka Connect把数据从另一个系统流到Kafka,或者把数据从Kafka流到其他地方,下面是一些使用Kafka Connect的常见方式:
任何Kafka Connect管道的关键组件都是连接器。Kafka Connect由社区、供应商编写,或者偶尔由用户定制编写,它将Kafka Connect与特定的技术集成在一起。例如:
Connector和任务是逻辑工作单元,并作为流程运行。这个进程在Kafka Connect中被称为worker。Kafka Connect worker可以在两种部署方式中运行:独立的或分布式的。
Kafka Connect只有一个必要的先决条件来启动;也就是一组Kafka broker。这些Kafka代理可以是早期的代理版本,也可以是最新的版本。虽然Schema Registry不是Kafka Connect的必需服务,但它可以让你轻松地使用Avro, Protobuf和JSON Schema作为通用的数据格式来读取和写入Kafka记录。这使编写自定义代码的需求最小化,并以灵活的格式标准化数据。
Kafka Connect被设计成可扩展的,所以开发者可以创建自定义的连接器、转换或转换器,用户可以安装和运行它们。在一个Connect部署中安装许多插件是很常见的,但需要确保每个插件只安装一个版本。
Kafka Connect插件可以是:文件系统上的一个目录,包含所有需要的JAR文件和插件的第三方依赖项。这是最常见和首选的。一个包含插件及其第三方依赖的所有类文件的JAR。一个插件永远不应该包含任何由Kafka Connect运行时提供的库。
Kafka Connect使用一个定义为逗号分隔的插件目录路径列表来查找插件。worker路径配置属性配置如下:plugin.path=/usr/local/share/kafka/plugins。安装插件时,将插件目录或JAR(或一个解析到这些目录之一的符号链接)放置在插件路径中已经列出的目录中。或者可以通过添加包含插件的目录的绝对路径来更新插件路径。使用上面的插件路径的例子,可以在每台运行Connect的机器上创建一个/usr/local/share/kafka/plugins目录,然后把插件目录(或者超级jar)放在那里。
config.storage.topic
和status.storage.topic
中。因此,可以在任何时候启动、停止或重新启动任务,以提供弹性的、可伸缩的数据管道。在Kafka安装目录下也已自带Connect脚本和简单模板配置文件,而Confluent Platform中也会包含了更多worker示例配置属性文件(如etc/schema-registry/connect-avro-distributed.properties、etc/schema-registry/connect-avro-standalone.properties)。
官方使用说明
group.id
(默认connect-cluster
) - Connect cluster group使用唯一的名称;注意这不能和consumer group ID(消费者组)冲突。config.storage.topic
(默认connect-configs
) - topic用于存储connector和任务配置;注意,这应该是一个单个的partition,多副本的topic。你需要手动创建这个topic,以确保是单个partition(自动创建的可能会有多个partition)。offset.storage.topic
(默认 connect-offsets
) - topic用于存储offsets;这个topic应该配置多个partition和副本。status.storage.topic
(默认 connect-status
) - topic 用于存储状态;这个topic 可以有多个partitions和副本建议允许Kafka Connect自动创建内部管理的Topics。如果需要手动创建示例如下
# config.storage.topic=connect-configs
bin/kafka-topics --create --bootstrap-server localhost:9092 --topic connect-configs --replication-factor 3 --partitions 1 --config cleanup.policy=compact
# offset.storage.topic=connect-offsets
bin/kafka-topics --create --bootstrap-server localhost:9092 --topic connect-offsets --replication-factor 3 --partitions 50 --config cleanup.policy=compact
# status.storage.topic=connect-status
bin/kafka-topics --create --bootstrap-server localhost:9092 --topic connect-status --replication-factor 3 --partitions 10 --config cleanup.policy=compact
Confluent已提供很多Kafka Connect的实现的Connector连接器,可以先到这里搜索插件下载Confluent Hub插件下载地址 https://www.confluent.io/hub/
这里不做演示,独立模式通常用于开发和测试,或者轻量级、单代理环境(例如,发送web服务器日志到Kafka)。单机模式启动worker的示例命令:
bin/connect-standalone worker.properties connector1.properties [connector2.properties connector3.properties ...]
Kafka Connect是作为一个服务运行的,支持REST API来管理连接器。默认情况下,该服务运行在端口8083上。当在分布式模式下执行时,REST API将成为集群的主要接口;你可以向任何集群发出请求REST API会自动转发请求。目前REST API只支持application/json作为请求和响应实体内容类型。请求通过HTTP Accept头指定预期的响应内容类型和或者提交请求content - type报头指定请求实体的内容类型
Accept: application/json
Content-Type: application/json
GET /
- 顶级(根)请求,获取服务REST请求的Connect worker的版本,源代码的git提交ID,以及该worker连接的Kafka集群ID
GET /connectors
- 返回活跃的connector列表
POST /connectors
- 创建一个新的connector;请求的主体是一个包含字符串name字段和对象config字段(connector的配置参数)的JSON对象。
GET /connectors/{name}
- 获取指定connector的信息
GET /connectors/{name}/config
- 获取指定connector的配置参数
PUT /connectors/{name}/config
- 更新指定connector的配置参数
GET /connectors/{name}/status
- 获取connector的当前状态,包括它是否正在运行,失败,暂停等。
GET /connectors/{name}/tasks
- 获取当前正在运行的connector的任务列表。
GET /connectors/{name}/tasks/{taskid}/status
- 获取任务的当前状态,包括是否是运行中的,失败的,暂停的等,
PUT /connectors/{name}/pause
- 暂停连接器和它的任务,停止消息处理,直到connector恢复。
PUT /connectors/{name}/resume
- 恢复暂停的connector(如果connector没有暂停,则什么都不做)
POST /connectors/{name}/restart
- 重启connector(connector已故障)
POST /connectors/{name}/tasks/{taskId}/restart
- 重启单个任务 (通常这个任务已失败)
DELETE /connectors/{name}
- 删除connector, 停止所有的任务并删除其配置
GET /connector-plugins
- 返回已在Kafka Connect集群安装的connector plugin
列表。请注意,API仅验证处理请求的worker的connector。这以为着你可能看不不一致的结果,特别是在滚动升级的时候(添加新的connector jar)
PUT /connector-plugins/{connector-type}/config/validate
- 对提供的配置值进行验证,执行对每个配置验证,返回验证的建议值和错误信息。
# FileStreamSource是Kafka本身就提供Connector实现,直接配置使用即可
# 将confluentinc-kafka-connect-hdfs-10.1.6.zip解压到指定插件目录,我这里在Kafka安装目录下的config/connect-distributed.properties配置项
plugin.path=/opt/kafka/connectors
vim /home/commons/kafka_2.13-3.1.0/config/connect-distributed.properties
# Broker Server的访问ip和端口号
bootstrap.servers=server1:9092,server2:9092,server3:9092
# 指定集群id
group.id=connect-cluster
# 指定rest服务的端口号
rest.port=8083
# 指定Connect插件包的存放路径
plugin.path=/opt/kafka/connectors
# 配置转换器
key.converter=org.apache.kafka.connect.storage.StringConverter
value.converter=org.apache.kafka.connect.storage.StringConverter
key.converter.schemas.enable=false
value.converter.schemas.enable=false
internal.key.converter=org.apache.kafka.connect.json.JsonConverter
internal.value.converter=org.apache.kafka.connect.json.JsonConverter
internal.key.converter.schemas.enable=false
internal.value.converter.schemas.enable=false
# 在Kafka根目录下启动worker
./bin/connect-distributed.sh -daemon config/connect-distributed.properties
创建FileStreamSource的json文件filesource.json
{
"name":"local-file-source",
"config":{
"topic":"distributetest",
"connector.class":"FileStreamSource",
"key.converter":"org.apache.kafka.connect.storage.StringConverter",
"value.converter":"org.apache.kafka.connect.storage.StringConverter",
"converter.internal.key.converter":"org.apache.kafka.connect.storage.StringConverter",
"converter.internal.value.converter":"org.apache.kafka.connect.storage.StringConverter",
"file":"/home/commons/kafka_2.13-3.1.0/distribute-source.txt"
}
}
创建HdfsSinkConnector的json文件hdfssink.json
{
"name": "hdfs-sink",
"config": {
"connector.class": "io.confluent.connect.hdfs.HdfsSinkConnector",
"tasks.max": "1",
"topics": "distributetest",
"topics.dir": "/user/hive/warehouse/topictest/",
"hdfs.url": "hdfs://192.168.3.14:8020",
"flush.size": "2"
}
}
curl -X GET http://localhost:8083/connector-plugins
# 创建filesource和hdfssink
curl -X POST -H 'Content-Type: application/json' -i 'http://localhost:8083/connectors' [email protected] -w '\n'
curl -X POST -H 'Content-Type: application/json' -i 'http://localhost:8083/connectors' [email protected] -w '\n'
# 写入数据,消费kafka主题也订阅到相应的数据
echo "{"name":"zhangsan"}" >> distribute-source.txt
echo "{"name":"zhangsan1"}" >> distribute-source.txt
echo "{"name":"zhangsan2"}" >> distribute-source.txt
curl -X GET -H 'Content-Type: application/json' -i 'http://localhost:8083/connectors/hdfs-sink/status' -w '\n'
查看HDFS中也已经有相应的数据,如果需要更详细的数据可以从官方查找使用,后续我们再详细介绍更多实际使用场景
**本人博客网站 **IT小神 www.itxiaoshen.com