数据来自Apache Beam JdbcIO时缓慢的BigQuery加载作业

时间:2018-03-14 11:39:00

标签: google-cloud-platform google-bigquery apache-beam apache-beam-io

我尝试使用BigQuery加载作业从Apache Beam管道向BigQuery添加行。 I处理的初始数据来自Postgresql数据库,并使用JdbcIO数据源读入Beam:

@Override
public PCollection<Intent> expand(PBegin input) {
    return input.apply(JdbcIO.<Intent>read()
                             .withDataSourceConfiguration(JdbcIO.DataSourceConfiguration
                                 .create(DASHBOARD_DB_DRIVER, getJdbcConnectionString()))
                             .withQuery(QUERY)
                             .withCoder(ProtoCoder.of(Intent.class))
                             .withRowMapper(new IntentParser()));

}

BigQuery编剧:

@Override
public WriteResult expand(PCollection<KV<StateTable, StateRow>> events) {
    Write<KV<StateTable, StateRow>> writer = BigQueryIO.<KV<StateTable, StateRow>>write()
                                                       .withCreateDisposition(CreateDisposition.CREATE_NEVER)
                                                       .withWriteDisposition(WriteDisposition.WRITE_APPEND)
                                                       .withFormatFunction(new StateRowMapper())
                                                       .to(x -> x.getValue().getKey().getDestination());

    return events.apply(writer);
}

当我执行管道时,我得到了数千个以下日志条目(我猜每行一个),这个过程需要很长时间(+10分钟)。

INFO: Opening TableRowWriter to gs://piesync-analytics-temp-storage/BigQueryWriteTemp/16b8edc635ac4dfcaf2494b0217be8f8/15a00ba8-70ff-43ad-99f7-0090b9465d0b.
Mar 14, 2018 12:13:46 PM org.apache.beam.sdk.io.gcp.bigquery.TableRowWriter <init>

我检查了Google云端存储中的临时文件(BigQuery加载作业所需),并注意到每个文件只包含1行数据。

我担心这一点,因为当我做同样的事情时,使用相同的数据,但是从文件而不是数据库中读取(使用TextIO)我只会获得几十个日志条目并且临时文件包含数千条BigQuery记录。在这种情况下,该过程在不到一分钟的时间内完成

我没有指定任何窗口或触发,因为我只是尝试读取一次来源。

我想我必须启用某种批处理,但我不知道在哪里和哪里。

0 个答案:

没有答案