Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.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 ReadFromPubSub->;云存储->;BigQuery:订阅的大小从未减少,似乎只有0.002%到达BigQuery_Python_Google Bigquery_Google Cloud Dataflow_Apache Beam - Fatal编程技术网

Python ReadFromPubSub->;云存储->;BigQuery:订阅的大小从未减少,似乎只有0.002%到达BigQuery

Python ReadFromPubSub->;云存储->;BigQuery:订阅的大小从未减少,似乎只有0.002%到达BigQuery,python,google-bigquery,google-cloud-dataflow,apache-beam,Python,Google Bigquery,Google Cloud Dataflow,Apache Beam,管道正在使用ReadFromPubSub源来读取指向云存储blob的链接,读取每个文件中存储的事件,然后将它们插入BigQuery: 将beam.Pipeline(选项=Pipeline_选项)作为管道: dlq=死信队列(已知参数输出) 管道=( 管道 |“读取PubSub消息” >>beam.io.ReadFromPubSub( 主题, id\u label=“messageId”, ) |“读取记录”>>ReadCloudStorageEvents(死信队列=dlq) |“解析事件”>>P

管道正在使用
ReadFromPubSub
源来读取指向云存储blob的链接,读取每个文件中存储的事件,然后将它们插入BigQuery:

将beam.Pipeline(选项=Pipeline_选项)作为管道:
dlq=死信队列(已知参数输出)
管道=(
管道
|“读取PubSub消息”
>>beam.io.ReadFromPubSub(
主题,
id\u label=“messageId”,
)
|“读取记录”>>ReadCloudStorageEvents(死信队列=dlq)
|“解析事件”>>ParseEventRecords(死信队列=dlq)
|“窗口事件”>>WindowOnTimeAndSize(60,10)
|“上传到BigQuery”>>BigQueryLink(项目,死信队列=dlq)
)
问题是,即使这些项目从PubSub以很好的速度被消费,文件也以同样好的速度从云存储中读取,但它们根本没有以接近BigQuery流限制的速度插入BigQuery

数据新鲜度和系统延迟持续攀升:

这样做的一个副作用是不会删除队列项目

bigQueryLink
本质上是这样的:

class BigQueryLink(beam.ptTransform):
定义初始化(self,项目:str,死信队列:beam.pttransform):
self.deadletter\u队列=deadletter\u队列
self.project=project
def扩展(自我,pcoll):
def yield_from(事件:Iterable[Dict])->Iterable[Dict]:
对于事件中的事件:
屈服事件
pcoll=(
pcoll
|“展平事件”>>beam.FlatMap(屈服点)
|f“将事件推送到BigQuery”
>>beam.io.WriteToBigQuery(
table=lambda事件:f“{self.project}:events_v2.{event['type']}”,
schema=lambda table:load_schema(table.split(“.”[-1]),
create_disposition=beam.io.BigQueryDisposition.create_如果需要,
write_disposition=beam.io.BigQueryDisposition.write_APPEND,
插入\u retry\u strategy=RetryStrategy.retry\u ON\u TRANSIENT\u ERROR,
验证=真,
附加参数={
“群集”:{“字段”:[“accountId”]},
“timePartitioning”:{“type”:“DAY”,“field”:“receivedAt”},
},
)
)
# # https://stackoverflow.com/questions/59102519/monitoring-writetobigquery
pcoll[
beam.io.gcp.bigquery.BigQueryWriteFn.FAILED_行
]|“映射到错误”>>beam.Map(
lambda x:错误(
message=f“BigQuery异常”,
记录={“目的地”:x[0],“索引”:x[1]},
数据=无,
stacktrace=无,
)
|self.deadletter\u队列
)
使用200.000个元素进行测试,引用总共约10000000个事件的文件,结果只有约0.002%的事件进入BigQuery。我们没有接近配额的地方,我没有看到任何错误或任何东西(有时当字段与模式不匹配时,我会看到一些错误,但我什么也看不到)

任何关于确定这一问题所在的见解都将受到极大欢迎。是否有地方可以查看项目是否在BigQuery end中未通过某些验证,因此未在订阅或订阅中删除

似乎是瓶颈的步骤是
\u StreamToBigQuery/CommitInsertIds/ReshufflePerKey/Map(具体化\u时间戳)
,如下图所示。接近1000 MB的内存进入该步骤,只有5 MB的内存退出(如果我正确阅读了图表):

更新:
WindowOnTimeAndSize

class WindowOnTimeAndSize(beam.PTransform):
    """A composite transform that groups Pub/Sub messages based on publish
    time and outputs a list of dictionaries, where each contains one message
    and its publish timestamp.
    """

    def __init__(self, window_size_seconds, after_count):
        # Convert minutes into seconds.
        self.window_size = int(window_size_seconds)
        self.after_count = after_count

    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(
                beam.window.FixedWindows(self.window_size),
                trigger=Repeatedly(
                    AfterAny(
                        AfterCount(self.after_count),
                        AfterProcessingTime(self.window_size),
                    )
                ),
                accumulation_mode=AccumulationMode.DISCARDING,
            )
        )

您最好的资源可能是Dataflow Monitoring控制台,特别是当您可以单击各个步骤来确定是哪个步骤导致了延迟时。不要忘记,可以通过单击小v形符号来展开复合变换,从而深入到有问题的部分。

WriteToBigQuery的一些更改使变换非常缓慢。在Beam 2.24.0(几周后推出)中,转换应该能够达到更高的性能(我已经测试了每个CPU 500-600个EPS)


抱歉给你添麻烦了。您可以今天使用head上的代码,也可以等待几周,以获得Beam 2.24.0。

是的,对不起,我应该提到瓶颈现在出现的位置是在我几乎无法控制的
Beam.io.WriteToBigQuery中。因此,我假设这与我是否使用了窗口技术有关,这就是问题所在。我用信息和一个似乎是瓶颈的屏幕截图更新了原始帖子。这似乎是这次GBK的改组。在
WindowOnTimeAndSize
中使用的窗口是什么?Hi@robertwb,我已经用它更新了原始帖子,但是我在60秒内打开窗口,但是如果吞吐量非常高,我想在每10个事件上重复使用
任何
。主要是因为最初的60秒真的没有什么不同。也许值得重新考虑你的解决方案并简化它。实际上,您不需要为此发布/订阅或数据流。当您不需要时,您正在创建额外的跃点,例如读取GCS中文件的内容,然后插入到BigQuery。相反,您可以使用云函数监听文件到达时触发的bucket。当这种情况发生时,云函数将文件直接加载到BigQuery中。这能满足你的要求吗?很好。之所以如此,是因为在创建时获取事件对于我们的目的来说是不够的。我们需要不时地重播数据(迁移、新字段非常有趣)