云数据流至BigQuery - 太多的来源(Cloud Dataflow to BigQuery

2019-10-21 13:08发布

我有一份工作,除其他事项外还插入一些从文件到BigQuery资料表供以后人工分析读取数据。

它失败,出现以下错误:

job error: Too many sources provided: 10001. Limit is 10000., error: Too many sources provided: 10001. Limit is 10000.

这是什么称其为“源”? 它是一个文件或管道一步?

谢谢,G

Answer 1:

我猜的错误是从BigQuery的到来,意味着我们正在努力,当我们创建输出表上传文件太多。

你能提供的错误/上下文(如命令行输出的一个片段一些细节(如果使用的是BlockingDataflowPipelineRunner),所以我可以确认?一个也的jobId将是有益的。

是否有一些关于你的流水线结构会导致大量的输出文件? 这可能是某个大数据量或者是细碎片化输入文件,而不需要额外GroupByKey操作(这将让我们reshard数据分成大块)。



Answer 2:

在该说明谷歌云数据流BigQueryIO.Write出现未知错误(HTTP代码500)可以减轻这个问题:

为Java 1.x的数据流SDK:--experiments = enable_custom_bigquery_sink:作为一种变通方法,您可以启用这个实验

在数据流SDK的Java版本是2.x,这种行为是默认的,没有实验是必要的。

请注意,在两个版本中,GCS临时文件可能,如果你的作业失败遗留下来的。



Answer 3:

public static class ForceGroupBy <T> extends PTransform<PCollection<T>, PCollection<KV<T, Iterable<Void>>>> {
    private static final long serialVersionUID = 1L;
    @Override
    public PCollection<KV<T, Iterable<Void>>> apply(PCollection<T> input) {
        PCollection<KV<T,Void>> syntheticGroup = input.apply(
                ParDo.of(new  DoFn<T,KV<T,Void>>(){
                    private static final long serialVersionUID = 1L;
                    @Override
                    public void processElement(
                            DoFn<T, KV<T, Void>>.ProcessContext c)
                                    throws Exception {
                        c.output(KV.of(c.element(),(Void)null));

                    } }));
        return syntheticGroup.apply(GroupByKey.<T,Void>create());
    }
}


文章来源: Cloud Dataflow to BigQuery - too many sources