Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python ApacheBeam数据流可以有效地将消息从PubSub分片并映射到GCS_Python_Google Cloud Dataflow_Apache Beam_Stream Processing - Fatal编程技术网

Python ApacheBeam数据流可以有效地将消息从PubSub分片并映射到GCS

Python ApacheBeam数据流可以有效地将消息从PubSub分片并映射到GCS,python,google-cloud-dataflow,apache-beam,stream-processing,Python,Google Cloud Dataflow,Apache Beam,Stream Processing,我在数据流方面遇到了一个问题,其中数据流似乎非常滞后 我每秒在pub/sub中接收数十万个事件,然后使用数据流作业来处理它 对于每一条消息,我都在处理它,并使用一个示例为它分配一个键(不到10个键)。我想我不需要最后几步 def expand(self, pcoll): return ( pcoll # Assigns window info to each Pub/Sub message based on its

我在数据流方面遇到了一个问题,其中数据流似乎非常滞后

我每秒在pub/sub中接收数十万个事件,然后使用数据流作业来处理它

对于每一条消息,我都在处理它,并使用一个示例为它分配一个键(不到10个键)。我想我不需要最后几步

def expand(self, pcoll):
        return (
                pcoll
                # Assigns window info to each Pub/Sub message based on its
                # publish timestamp.
                | "Window into Fixed Intervals"
                >> beam.WindowInto(window.FixedWindows(self.window_size))
                | "Output Event Str obj for each message" >> beam.ParDo(ProcessEvent())
                
                | "Add Dummy Key" >> beam.Map(lambda elem: (None, elem))
                | "Groupby" >> beam.GroupByKey()
                | "Abandon Dummy Key" >> beam.MapTuple(lambda _, val: val)
        )

然后我每分钟对GCSIO进行一次窗口写入,写入每个键的文件

问题是最后一次写入时,GCS会获取所有数据,并在最后一步中逐行写入。显然,这并不是最优的,因为它基本上是将所有窗口化的数据泵入一个worker来处理实际将其放入GCS的作业,这导致了作业执行的大幅放缓

with beam.io.gcp.gcsio.GcsIO().open(filename=a_file, mode="w") as a_f \
     beam.io.gcp.gcsio.GcsIO().open(filename=quote_file, mode="w") as q_f, \:
  for element in batch:
    try:
      output = element['message_body']
      if 'A' in output:
        a_f.write(output['A'])
      if 'B' in output:
        q_f.write(output['B'])
      .....

显然,这不是很好的代码,但不熟悉数据流。有什么想法吗?

在第一部分(写之前),有10个键意味着该阶段的并行性将限制为10。如果可能的话,它值得一看使用。如果使用组合器也是一种选择,那么使用if也是值得探索的

对于输出,如果可能,在输出文本文件时使用。num_shards属性需要在流模式下设置,但假设输出文件的格式为_1_of _x。。。然后,这有助于提高输出的并行性。您可以使用多输出转换来分支管道,以便将不同的记录发送到不同的文件


[根据注释编辑]如果键只是将元素发送到特定文件的一种方式,那么请查看

哦,因此消息都作为流一起发送,我只需要在管道中间使用一个特定键,根据文件输出对它们进行排序。我将查看textio/combineperkey位,因为它似乎非常接近我所需要的。谢谢在这种情况下,只要利用和