使用Google Dataflow在批量处理模式下使用KafkaIO

时间:2019-03-26 06:30:51

标签: java google-cloud-platform apache-kafka google-cloud-dataflow apache-beam

Google Dataflow作业将Apache Beam的 KafkaIO 库与 AvroIO 一起使用,并且Windowed将输出写入Google Cloud Storage存储桶中的“ .avro”文件。但是,默认情况下,流处理作为生产数据上的处理作业类型。

是否可以使用批处理处理在Dataflow中使用KafkaIO使用来自Kafka主题的数据。此数据流作业不需要近乎实时的处理(流式传输)。是否有一种方法也可以将传入的记录插入到BigQuery表中,而无需使用流式插入费用来启用批处理类型。

运行频率较低的批处理可以工作,从而减少内存,vCPU和计算成本。

按照:https://beam.apache.org/releases/javadoc/2.5.0/org/apache/beam/sdk/io/kafka/KafkaIO.html

KafkaIO源将无限制的Kafka记录集合作为PCollection>返回。

这是否意味着Kafka不受限制地无法在批处理模式下运行?

测试.withMaxNumRecords(1000000)条件以批处理模式运行作业。但是,要在实时传入数据中运行作业,我需要删除此条件。

我曾尝试使用开窗并将流模式选项标志设置为false,但没有成功,如下面的代码所示。


// not streaming mode
options.setStreaming(false);

...
PCollection<String> collection = p.apply(KafkaIO.<String, String>read()
               .withBootstrapServers("IPADDRESS:9092")
               .withTopic(topic)                                
               .withKeyDeserializer(StringDeserializer.class)
               .withValueDeserializer(StringDeserializer.class)                
               .updateConsumerProperties(props)
               .withConsumerFactoryFn(new ConsumerFactory())                            
//             .withMaxNumRecords(1000000)
               .withoutMetadata() 
       ).apply(Values.<String>create())
       .apply(Window.into(FixedWindows.of(Duration.standardDays(1))));


...
//convert to Avro GenericRecord

.apply("AvroToGCS", AvroIO.writeGenericRecords(AVRO_SCHEMA)
.withWindowedWrites()
.withNumShards(1)
.to("gs://BUCKET/FOLDER/")
.withSuffix(".avro"));

该代码导致具有4个vCPU和1个工作程序的 Streaming 作业类型持续9分钟,处理了180万条记录。在那之后,我不得不停止工作(流失)以防止成本。

在传入数据中对数据流执行批处理,是否有可能收集将其写为avro文件的记录批,并继续这样做直到偏移量偏移到最新

非常感谢任何示例或示例代码。

1 个答案:

答案 0 :(得分:1)

无限源不能以批处理模式运行。这是设计使然,因为批处理管道期望在处理完数据后会读取并终止有限数量的数据。

但是,您可以通过限制已读取的记录数来将无限制的源转换为有限制的源。注意:无法保证将读取哪些记录。

流管道本应一直处于运行状态,以便可以读取实时数据。批处理管道用于读取积压的存储数据。

批处理管道对读取实时数据的响应不佳,它将在您启动管道然后终止时读取其中的任何数据。