我有一个编写量很大的Springboot应用程序,它与Bigquery集成用于重载,面向10分钟插入一些entries.Here是我的配置。
存储的条目数:100万/min
吊舱数: 100
插入类型:流数据(使用JsonStreamWrite)
部署云: Azure
插入平均时间: 650毫秒
最长时间: 22分钟(一次插入)
每Pod线程数:15个线程
每个吊舱都有一个BigQuery连接,并尝试在BigQuery中插入。现在,当10%的插入在几分钟内花费时间时,我们面临很多超时和性能问题。是否有一种有效的方法可以在BigQuery中用如此大的负载写入数据。
我们使用以下Google客户端库
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-storage</artifactId>
</dependency>
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-bigquerystorage</artifactId>
</dependency>
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-bigquery</artifactId>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependencies>
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>libraries-bom</artifactId>
<version>25.4.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
private void updateRequestMetadataOperations(JSONArray requestMetaDataArr){
JSONArray firstObjArr = new JSONArray();
JSONObject firstTableJsonObj = new JSONObject();
firstTableJsonObj.put("firstColumn",firstColumnVal);
firstTableJsonObj.put("secondColumn",secondColumnVal);
firstTableJsonObj.put("thirdColumn",thirdColumnVal);
firstTableJsonObj.put("fourthColumn",fourthColumnVal);
firstTableJsonObj.put("fifthColumn",fifthColumnVal);
firstTableJsonObj.put("sixthColumn",sixthColumnVal);
.
.
.
firstTableJsonObj.put("twentyColumn",twentyColumnVal);
firstObjArr.put(firstTableJsonObj);
}
public void insertIntoBigQuery(String tableName, JSONArray jsonArr) throws Exception{
if(jsonArr.length()==0){
return;
}
JsonStreamWriter jsonStreamWriter = JsonStreamWriterUtil.getWriteStreamMap(tableName);
if(jsonStreamWriter!=null) {
jsonStreamWriter.append(jsonArr);
}
}
public JsonStreamWriter createWriteStream(String table) throws IOException, Descriptors.DescriptorValidationException, InterruptedException {
BigQueryWriteClient bqClient = BigQueryWriteClient.create();
WriteStream stream = WriteStream.newBuilder().setType(WriteStream.Type.COMMITTED).build();
TableName tableName = TableName.of("ProjectId", "DataSet", table);
CreateWriteStreamRequest createWriteStreamRequest =
CreateWriteStreamRequest.newBuilder()
.setParent(tableName.toString())
.setWriteStream(stream)
.build();
WriteStream writeStream = bqClient.createWriteStream(createWriteStreamRequest);
JsonStreamWriter jsonStreamWriter = JsonStreamWriter
.newBuilder(writeStream.getName(), writeStream.getTableSchema())
.build();
return jsonStreamWriter;
}
发布于 2022-09-05 08:03:25
一般来说,BigQuery流插入是为了小的实时数据更新,它是轻量级和fast.Batch或加载,另一方面,接受文件上传,它意味着更大和更重的更新。BigQuery存储写入API是一个统一的BigQuery数据摄取API。它将流吞食和批量加载结合到一个高性能的API接口中。
是否有一种有效的方法可以在BigQuery中使用如此大的负载编写数据?
插入过程针对批量操作进行了优化,从而提高了性能,减少了加载时间。还请注意,较大的有效负载也会导致缓慢的插入,特别是如果它来自具有额外延迟的外部网络。如果您需要获得速度,您总是可以选择一个异步方法。将You can always consider using a message bus like Pub/Sub with Dataflow
写入BigQuery.The存储写入API是一种使用双向连接的gRPC API。AppendRows方法创建到流的连接。通常,单个连接至少支持1MB/s的吞吐量。上限取决于几个因素,如网络带宽、数据模式和服务器负载,但可能超过10 If /s。如果需要更多的吞吐量,则创建更多的连接。对于报价和限制,您也可以参考本文档。
按照GCP代码createWriteStream
,您的示例方法似乎很好。
https://stackoverflow.com/questions/73563793
复制相似问题