Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.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
Google cloud platform 在Google数据流管道中,BigQuery读取速度较慢_Google Cloud Platform_Google Analytics_Google Bigquery_Google Cloud Dataflow_Apache Beam - Fatal编程技术网

Google cloud platform 在Google数据流管道中,BigQuery读取速度较慢

Google cloud platform 在Google数据流管道中,BigQuery读取速度较慢,google-cloud-platform,google-analytics,google-bigquery,google-cloud-dataflow,apache-beam,Google Cloud Platform,Google Analytics,Google Bigquery,Google Cloud Dataflow,Apache Beam,对于我们的近实时分析,数据将流入pubsub,Apache beam数据流管道将首先写入bigquery进行处理,然后通过再次读取bigquery进行聚合处理,然后将聚合结果存储在Hbase中以进行OLAP多维数据集计算 下面是用于从bigquery获取记录的示例ParDo函数 String eventInsertedQuery="Select count(*) as usercount from <tablename> where <condition>"; BigQu

对于我们的近实时分析,数据将流入pubsub,Apache beam数据流管道将首先写入bigquery进行处理,然后通过再次读取bigquery进行聚合处理,然后将聚合结果存储在Hbase中以进行OLAP多维数据集计算

下面是用于从bigquery获取记录的示例ParDo函数

String eventInsertedQuery="Select count(*) as usercount from <tablename> where <condition>";
BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
QueryJobConfiguration queryConfig
=QueryJobConfiguration.newBuilder(eventInsertedQuery).build();
TableResult result =  bigquery.query(queryConfig);
FieldValueList row = result.getValues().iterator().next();
LOG.info("rowCounttt {}",row.get("usercount").getStringValue());

bigquery.query大约需要4秒钟。有什么改进的建议吗?由于这是近实时分析,因此此时间段不可接受。

频繁读取BigQuery可能会在应用程序中增加不必要的延迟。如果我们认为BigQuess是一个数据,我认为4秒是一个很好的响应时间。我建议降低4秒阈值

以下是您可以选择的可能性列表:

优化查询语句,包括更改要添加的数据库架构。 使用由提供的关系数据库以获得更好的响应时间。 更改应用程序的体系结构。正如注释中所建议的,在写入BQ之前转换数据是一个很好的选择,因此可以避免两次查询数据的延迟。有几篇文章可以使用数据流执行近实时计算,例如和。
另一方面,请记住,完成查询的时间不包括在BigQuery网页中,事实上,预计可能会发生错误,并花费更多时间完成查询,请参阅同一链接中的后退要求

听起来你是在用一个定制的ParDo来做一个RPC到bigquery和拉入数据,而不是使用内置的BigQueryIO.Read,你这样做有什么原因吗?使用这种方法,将需要几秒钟的时间来制作RPC,如果您这样做,将为每个元素调用进程函数,并将使整个管道非常缓慢。可以改用BigQueryIO.Read吗?它经过优化,可以从批处理中提取行,然后在管道中并行处理。您可以读取整个表,也可以向BigQueryIO.Read提供自定义查询。然后,根据从BigQueryIO.Read输出的元素在数据流管道中执行计算和聚合。我建议创建一个管道,从其中读取两个源:PubSub和BigQueryIO.Read。然后,执行一个窗口,将无法连接未绑定/无限流数据的数据时间绑定到该数据,并执行一个CoGroupByKey,使用一个键将pubsub元素与bigquery行连接起来。加入数据并计算所需内容后,将其输出到接收器,可能使用BigQueryIO.Write。请参阅Windowing、CoGroupByKey等@AlexAmato-我认为OP正在从发布/订阅接收数据,并在步骤1中以原始格式将其写入BQ。然后在步骤2中,从BQ表读取数据,执行一些聚合并将其写入Bigtable。基于这种理解,他们可以从PubSub读取原始数据并将其写入BQ,然后在相同的数据上执行窗口和聚合并将其写入Bigtable,而无需从BQ读取。或者,根据您在BigQuery表中查找每个键的数据量而定。您可以使用每个键的数据计算一个side输入。然后,在接收PubSub事件作为输入和带有派生BigQuery数据的side输入的ParDo中,您可以从缓存在内存中的数据中高效地查找side输入数据。请参阅侧面输入:并查找pvalue.AsDict pvalue.AsSingleton pvalue.AsList上的一些示例