我对kafka有一个奇怪的问题 - > elasticsearch连接器。我第一次开始这一切都很棒,我收到了elasticsearch中的新数据并通过kibana仪表板检查了它,但是当我使用相同的生产者应用程序向kafka生成新数据并尝试再次启动连接器时,我没有'获取elasticsearch中的任何新数据。 现在我遇到了这样的错误:
[2018-02-04 21:38:04,987] ERROR WorkerSinkTask{id=log-platform-elastic-0} Commit of offsets threw an unexpected exception for sequence number 14: null (org.apache.kafka.connect.runtime.WorkerSinkTask:233)
org.apache.kafka.connect.errors.ConnectException: Flush timeout expired with unflushed records: 15805
我正在使用next命令来运行连接器:
/usr/bin/connect-standalone /etc/schema-registry/connect-avro-standalone.properties log-platform-elastic.properties
connect-avro-standalone.properties :
bootstrap.servers=kafka-0.kafka-hs:9093,kafka-1.kafka-hs:9093,kafka-2.kafka-hs:9093
key.converter=io.confluent.connect.avro.AvroConverter
key.converter.schema.registry.url=http://localhost:8081
value.converter=io.confluent.connect.avro.AvroConverter
value.converter.schema.registry.url=http://localhost:8081
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
offset.storage.file.filename=/tmp/connect.offsets
# producer.interceptor.classes=io.confluent.monitoring.clients.interceptor.MonitoringProducerInterceptor
# consumer.interceptor.classes=io.confluent.monitoring.clients.interceptor.MonitoringConsumerInterceptor
#rest.host.name=
rest.port=8084
#rest.advertised.host.name=
#rest.advertised.port=
plugin.path=/usr/share/java
和 log-platform-elastic.properties :
name=log-platform-elastic
key.converter=org.apache.kafka.connect.storage.StringConverter
connector.class=io.confluent.connect.elasticsearch.ElasticsearchSinkConnector
tasks.max=1
topics=member_sync_log, order_history_sync_log # ... and many others
key.ignore=true
connection.url=http://elasticsearch:9200
type.name=log
我检查了与kafka经纪人,elasticsearch和schema-registry(架构注册表和连接器目前在同一主机上)的连接,一切都很好。 Kafka经纪人在9093端口上运行,我可以使用kafka-avro-console-consumer从主题中读取数据。 我会很感激你的帮助!
答案 0 :(得分:0)
只需将 flush.timeout.ms 更新为大于10000(默认值为10秒)
根据文档:
flush.timeout.ms 超时时间(以毫秒为单位) 刷新,以及在等待缓冲区空间可用时 完成的请求作为记录添加。如果超过此超时时间 该任务将失败。
类型:long默认值:10000重要性:低
答案 1 :(得分:0)
我们可以优化Elastic搜索配置来解决问题。请参考以下链接获取配置参数
https://docs.confluent.io/current/connect/kafka-connect-elasticsearch/configuration_options.html
下面是关键参数,可以控制消息速率流以最终帮助解决问题:
flush.timeout.ms:增加刷新时间可能有助于呼吸
用于定期刷新的超时(以毫秒为单位),以及何时 等待缓冲区空间由已完成的请求提供给 记录已添加。如果超过此超时,任务将失败。
最大缓冲记录数:尝试减少缓冲记录限制
每个任务在阻塞之前将缓冲的最大记录数 接受更多记录。此配置可用于限制 每个任务的内存使用量
batch.size:尝试减小批量大小
写入时要成批处理的记录数 Elasticsearch
tasks.max:并行线程(消费者实例)的数量减少或增加。如果无法处理减少任务的带宽可能会有所帮助,它将控制弹性搜索。
通过调整上述参数可以解决我的问题