在BigQuery上插入行:InsertAllRequest与BigQueryIO.writeTableRows()

时间:2018-07-12 23:53:25

标签: google-cloud-platform google-bigquery google-cloud-pubsub google-cloud-dataproc dataflow

当我使用 writeTableRows在BigQuery上插入行时,与 InsertAllRequest 相比,性能确实很差。显然,某些设置不正确。需要帮助。

用例1:编写了Java程序,以使用Twitter4j处理“样本” Twitter流。当一条推文到来时,我使用以下代码将其写入BigQuery:

insertAllRequestBuilder.addRow(rowContent);

当我从 Mac 运行此程序时,它每分钟将大约1000行直接插入到BigQuery表中。我以为可以通过在集群上运行数据流作业来做得更好。

使用案例2::一条推文到来时,我将其写到Google的 PubSub 主题中。我是从Mac运行的,它每分钟发送大约1000条消息。

我写了一个 Dataflow 作业,该作业读取了此主题并使用 BigQueryIO.writeTableRows()写入BigQuery。我有一个 8台计算机Dataproc 集群。我使用 DataflowRunner 在此群集的主节点上开始了这项工作。它的速度令人难以置信!每5分钟大约100行。这是相关代码的片段:

statuses.apply("ToBQRow", ParDo.of(new DoFn<Status, TableRow>() {
    @ProcessElement
    public void processElement(ProcessContext c) throws Exception {
        TableRow row = new TableRow();
        Status status = c.element();
        row.set("Id", status.getId());
        row.set("Text", status.getText());
        row.set("RetweetCount", status.getRetweetCount());
        row.set("FavoriteCount", status.getFavoriteCount());
        row.set("Language", status.getLang());
        row.set("ReceivedAt", null);
        row.set("UserId", status.getUser().getId());
        row.set("CountryCode", status.getPlace().getCountryCode());
        row.set("Country", status.getPlace().getCountry());
        c.output(row);
    }
})) 
    .apply("WriteTableRows", BigQueryIO.writeTableRows().to(tweetsTable)//
            .withSchema(schema)
            .withMethod(BigQueryIO.Write.Method.FILE_LOADS)
            .withTriggeringFrequency(org.joda.time.Duration.standardMinutes(2))
            .withNumFileShards(1000)
            .withWriteDisposition(BigQueryIO.Write.WriteDisposition.WRITE_APPEND)
            .withCreateDisposition(BigQueryIO.Write.CreateDisposition.CREATE_IF_NEEDED));

我在做什么错?我应该使用“ SparkRunner”吗?我如何确认它正在群集的所有节点上运行。请指教。

1 个答案:

答案 0 :(得分:2)

使用BigQuery,您可以:

  • 流式传输数据。低延迟(每秒高达10万行)是有代价的。
  • 批量处理数据。更高的延迟,令人难以置信的吞吐量,完全免费。

这就是您所经历的差异。如果仅要摄取1000行,则批处理将明显变慢。拥有100亿行的记录将通过批处理更快地进行,而且没有任何费用。

Dataflow / Bem的BigQueryIO.writeTableRows可以流式传输或批量处理数据。

使用BigQueryIO.Write.Method.FILE_LOADS粘贴的代码正在选择批处理。