Amazon s3 Kafka Connect S3接收器-如何使用来自消息本身的时间戳[时间戳提取器]

Amazon s3 Kafka Connect S3接收器-如何使用来自消息本身的时间戳[时间戳提取器],amazon-s3,apache-kafka,apache-kafka-connect,confluent-platform,Amazon S3,Apache Kafka,Apache Kafka Connect,Confluent Platform,我一直在努力解决使用卡夫卡连接和S3接收器的问题 首先是结构: { Partition: number Offset: number Key: string Message: json string Timestamp: timestamp } { "reference": "", "clientId": "", "gid": "", "timestamp": "2019-03-19T15:27:55.526Z", } 通常在向卡夫卡发帖时,时间

我一直在努力解决使用卡夫卡连接和S3接收器的问题

首先是结构:

{
   Partition: number
   Offset: number
   Key: string
   Message: json string
   Timestamp: timestamp
}
{
  "reference": "",
  "clientId": "",
  "gid": "",
  "timestamp": "2019-03-19T15:27:55.526Z",
}
通常在向卡夫卡发帖时,时间戳应由制作人设置。不幸的是,在某些情况下,这种情况似乎没有发生。这意味着时间戳有时可能是
null

要提取此时间戳,连接器设置为以下值:
“timestamp.extractor”:“Record”

现在可以肯定的是,
消息
字段本身也总是包含时间戳

消息

{
   timestamp: "2019-04-02T06:27:02.667Z"
   metadata: {
     creationTimestamp: "1554186422667"
   }
}
然而问题是,现在,我想将该字段用于
timestamp.extractor

我认为这就足够了,但这似乎不起作用:

"timestamp.extractor":"RecordField",
"timestamp.field":"message.timestamp",
这也会导致空指针

关于如何使用kafka消息负载本身的时间戳,而不是为kafka v0.10设置的默认时间戳字段,有什么想法吗+

编辑: 完整配置:

{ "name": "<name>",
  "config": {
    "connector.class":"io.confluent.connect.s3.S3SinkConnector",
    "tasks.max":"4",
    "topics":"<topic>",
    "flush.size":"100",
    "s3.bucket.name":"<bucket name>",
    "s3.region": "<region>",
    "s3.part.size":"<partition size>",
    "rotate.schedule.interval.ms":"86400000",
    "key.converter": "org.apache.kafka.connect.storage.StringConverter",
    "value.converter": "org.apache.kafka.connect.json.JsonConverter",
    "key.converter.schemas.enable": "false",
    "value.converter.schemas.enable": "false",
    "storage.class":"io.confluent.connect.s3.storage.S3Storage",
    "format.class":"io.confluent.connect.s3.format.json.JsonFormat",
    "locale":"ENGLISH",
    "timezone":"UTC",
    "schema.generator.class":"io.confluent.connect.storage.hive.schema.TimeBasedSchemaGenerator",
    "partitioner.class":"io.confluent.connect.storage.partitioner.TimeBasedPartitioner",
    "partition.duration.ms": "3600000",
    "path.format": "'year'=YYYY/'month'=MM/'day'=dd",
    "timestamp.extractor":"RecordField",
    "timestamp.field":"message.timestamp",
    "max.poll.interval.ms": "600000",
    "request.timeout.ms": "610000",
    "heartbeat.interval.ms": "6000",
    "session.timeout.ms": "20000",
    "s3.acl.canned":"bucket-owner-full-control"
  }
}
编辑3:

{
"transforms": "convert_op_creationDateTime",
"transforms.convert_op_creationDateTime.type": "org.apache.kafka.connect.transforms.TimestampConverter$Value",
"transforms.convert_op_creationDateTime.target.type": "Timestamp",
"transforms.convert_op_creationDateTime.field": "timestamp",
"transforms.convert_op_creationDateTime.format": "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"
}

所以我试着在物体上做了一个变换,但似乎我又被困在这个东西上了。这种模式似乎是无效的。环顾互联网,这似乎确实是一个有效的SimpleDataPattern。它似乎在抱怨
'T'
。还更新了消息架构。

根据您共享的架构,您应该设置:

    "timestamp.extractor":"RecordField",
    "timestamp.field":"timestamp",

i、 e.没有
消息
时间戳字段名称的前缀。

如果数据是字符串,则Connect将尝试解析为毫秒-

在任何情况下,
message.timestamp
都假定数据看起来像
{“message”:{“timestamp”:…}
,所以只要
timestamp
就可以了。而且,不管怎样,使用嵌套字段是不可能的,所以您可能希望澄清您使用的是哪个版本的Connect

我不完全确定在使用JSON转换器时如何将
instanceof Date
的evalutate设置为true,即使您设置了
schema.enable=true
,那么在代码中,您也可以看到只有数字和字符串的模式类型的条件,但仍然假设它是毫秒


您可以尝试使用转换转换日期字符串

澄清一下:您使用卡夫卡连接作为接收器?使用单消息转换将卡夫卡消息的时间戳提取到要写入接收器的消息字段中?你能分享你完整的卡夫卡连接配置吗?更新了消息!好了,这现在更有意义了:)你能分享你的消息的模式吗?你是说这个属性吗<代码>消息:json字符串?您能显示完整的stacktrace吗?但似乎无法完全工作。还是有空指针在上面。尽管消息实际上有可用的时间戳(根据kafka工具),但它可能与UTC有关吗?需要改造吗?我好像撞到墙了。我用更多的信息更新了这个问题。我注意到我也可以访问一个普通的时间戳,afaik非常适合“字符串”格式的时间戳。使用提取器字段或与此相关的内容是否有帮助?不确定为什么需要提取任何内容。我自己没有使用TimestampConverter,因为我处理的数据几乎总是以毫秒为单位的unix历元时间。不过,如果您想看一看的话,它的单元测试就在这里