Google bigquery 使用Apache beam BigQueryIO向BigQuery插入数据时数据丢失

Google bigquery 使用Apache beam BigQueryIO向BigQuery插入数据时数据丢失,google-bigquery,apache-beam,Google Bigquery,Apache Beam,我使用下面的代码使用ApacheBeam BigQueryIO向BQ插入数据。我从kafka(Beam KafkaIO)读取数据并对其进行处理,创建字符串的Pcollection,然后将其流式传输到BQ。向BQ写入数据时,并不是将所有记录都写入表中。它也不会抛出任何异常 public class ConvertToTableRow extends DoFn<String, TableRow> { /** * */ private static final long seria

我使用下面的代码使用ApacheBeam BigQueryIO向BQ插入数据。我从kafka(Beam KafkaIO)读取数据并对其进行处理,创建字符串的Pcollection,然后将其流式传输到BQ。向BQ写入数据时,并不是将所有记录都写入表中。它也不会抛出任何异常

public class ConvertToTableRow extends DoFn<String, TableRow> {

/**
 * 
 */
private static final long serialVersionUID = 1L;

private StatsDClient statsdClient;
private String statsDHost;
private int statsDPort = 9125;

public ConvertToTableRow(String statsDHost) {
    this.statsDHost = statsDHost;
}

@Setup
public void startup() {
    this.statsdClient = new NonBlockingStatsDClient("Metric", statsDHost, statsDPort);
}

@ProcessElement
public void processElement(@Element String record, ProcessContext context) {
    try {
        statsdClient.incrementCounter("bq.message");
        TableRow row = new TableRow();
        row.set("name", "Value");
        Long timestamp = System.currentTimeMillis();

        DateFormat dateFormater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        Date date = new Date(timestamp);
        String insertDate = dateFormater.format(date);
        row.set("insert_date", insertDate);
        context.output(row);
    } catch (Exception e) {
        statsdClient.incrementCounter("exception.bq.message");
    }
}

@Teardown
public void teardown() {
    this.statsdClient.close();
}
公共类ConvertToTableRow扩展了DoFn{
/**
* 
*/
私有静态最终长serialVersionUID=1L;
私人StatsDClient StatsDClient;
私有字符串statsDHost;
专用int statsDPort=9125;
公共可转换表行(字符串statsDHost){
this.statsDHost=statsDHost;
}
@设置
公共无效启动(){
this.statsdClient=new NonBlockingStatsDClient(“Metric”,statsDHost,statsDPort);
}
@过程元素
public void processElement(@Element字符串记录,ProcessContext上下文){
试一试{
statsdClient.incrementCounter(“bq.message”);
TableRow行=新TableRow();
行集合(“名称”、“值”);
长时间戳=System.currentTimeMillis();
DateFormat DateFormatter=新的SimpleDateFormat(“yyyy-MM-dd HH:MM:ss.SSS”);
日期=新日期(时间戳);
String insertDate=DateFormatter.format(日期);
行设置(“插入日期”,插入日期);
输出(行);
}捕获(例外e){
statsdClient.incrementCounter(“exception.bq.message”);
}
}
@拆卸
公共无效拆卸(){
this.statsdClient.close();
}
}

private void streamWriteOutputToBQ(PCollection bqTableRows){
字符串tableSchema=//tableSchema;
bqTableRows
.apply((BigQueryIO.writeTableRows().skipInvalidRows().withMethod(方法.流式处理\u插入)
.to(“myTable”)。使用JSONSchema(tableSchema)
.withWriteDisposition(BigQueryIO.Write.WriteDisposition.Write_APPEND));
}

我不确定,如果我缺少BigQueryIO的任何配置

您能否发现您从哪个阶段丢失了元素?您应该能够在UI中看到元素计数。你在用windows吗?如果是这样,是否会丢弃延迟数据?statsdClient.incrementCounter(“bq.message”)-->此度量计数正确,并且没有异常度量计数器的计数。所以我想所有的信息都会传到这个帕多。但是,如果此计数器为零,您是否可以尝试删除try/catch块(或在计数器递增后重新引发异常)并确保管道仍然运行?如果不是,那应该(更大声地)指出问题所在。实际上,我已经在异常块中添加了日志,我在问这个问题时忽略了这个日志。LOGGER.error(“准备tableRow:{},{}”,记录,e时发生异常);你能发现你从哪个阶段到哪个阶段失去了元素吗?您应该能够在UI中看到元素计数。你在用windows吗?如果是这样,是否会丢弃延迟数据?statsdClient.incrementCounter(“bq.message”)-->此度量计数正确,并且没有异常度量计数器的计数。所以我想所有的信息都会传到这个帕多。但是,如果此计数器为零,您是否可以尝试删除try/catch块(或在计数器递增后重新引发异常)并确保管道仍然运行?如果不是,那应该(更大声地)指出问题所在。实际上,我已经在异常块中添加了日志,我在问这个问题时忽略了这个日志。LOGGER.error(“准备tableRow:{},{}”,记录,e时发生异常);
private void streamWriteOutputToBQ(PCollection<TableRow> bqTableRows) {
    String tableSchema = //tableSchema;
    bqTableRows
    .apply((BigQueryIO.writeTableRows().skipInvalidRows().withMethod(Method.STREAMING_INSERTS)
            .to("myTable").withJsonSchema(tableSchema)
            .withWriteDisposition(BigQueryIO.Write.WriteDisposition.WRITE_APPEND)));
        

}