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文件的记录批,并继续这样做直到偏移量偏移到最新。
非常感谢任何示例或示例代码。
答案 0 :(得分:1)
无限源不能以批处理模式运行。这是设计使然,因为批处理管道期望在处理完数据后会读取并终止有限数量的数据。
但是,您可以通过限制已读取的记录数来将无限制的源转换为有限制的源。注意:无法保证将读取哪些记录。
流管道本应一直处于运行状态,以便可以读取实时数据。批处理管道用于读取积压的存储数据。
批处理管道对读取实时数据的响应不佳,它将在您启动管道然后终止时读取其中的任何数据。