我在Apchea Beam中编写了一个非常简单的管道,如下所述,从我的kafka集群中读取了汇合的数据,如下所示:
Pipeline pipeline = Pipeline.create(options);
Map<String, Object> propertyBuilder = new HashMap();
propertyBuilder.put("ssl.endpoint.identification.algorithm", "https");
propertyBuilder.put("sasl.mechanism","PLAIN");
propertyBuilder.put("request.timeout.ms","20000");
propertyBuilder.put("retry.backoff.ms","500");
pipeline
.apply(KafkaIO.<byte[], byte[]>readBytes()
.withBootstrapServers("pkc-epgnk.us-central1.gcp.confluent.cloud:9092")
.withTopic("gcp-ingestion-1")
.withKeyDeserializer(ByteArrayDeserializer.class)
.withValueDeserializer(ByteArrayDeserializer.class)
.updateConsumerProperties(propertyBuilder)
.withoutMetadata() // PCollection<KV<Long, String>>
) .apply(Values.<byte[]>create());
但是,当我运行上述代码以从我的kafka集群中读取数据时,我却感到惊讶
我在直接Java运行程序上运行,我使用的是Beam 2.8,
我可以读取我的卡夫卡融合集群并向其生成消息,但上述代码无法实现。
答案 0 :(得分:1)
如果遵循堆栈跟踪,则代码似乎会尝试将超时配置属性强制转换为Integer
:https://github.com/apache/beam/blob/2e759fecf63d62d110f29265f9438128e3bdc8ab/sdks/java/io/kafka/src/main/java/org/apache/beam/sdk/io/kafka/KafkaUnboundedReader.java#L112
但是它得到一个字符串。我的猜测是,这是因为您在此处将其设置为字符串:propertyBuilder.put("request.timeout.ms","20000")
。我认为正确的做法是将其设置为Integer
,例如像propertyBuilder.put("request.timeout.ms", 20000)
(超时值周围没有引号)。
其他配置属性也可能有类似的问题(例如重试退避),您需要仔细检查属性类型。