Google数据流 - 能够在当前运行的步骤中并行化工作

时间:2017-05-10 06:50:37

标签: java google-cloud-platform google-cloud-dataflow

我想运行谷歌数据流进行模拟过程。我尝试通过自动缩放(THROUGHPUT_BASED)启动max worker节点5的数据流。

问题是数据流没有利用所有工作节点(5)广告给我留言。

自动缩放:根据在当前运行步骤中并行化工作的能力,将工作者数量减少到1个。

请提出可能存在的问题。

日志附在下面。

  

2017-05-10T06:01:36.555Z:详情:(5de468ab73bd7581):自动缩放是   已启用作业2017-05-09_23_01_36-6765647625807820060。的数量   工人将在1到1000之间.2017-05-10:06:01:37.811Z:详细信息:   (feb335244b957ccc):已启用检查所需的云API。   2017-05-10T06:02:05.328Z:详情:(feb335244b9573fd):扩展   GroupByKey操作成可优化的部分。   2017-05-10T06:02:05.332Z:细节:(feb335244b957017):提升   ValueCombiningMappingFns到MergeBucketsMappingFns   2017-05-10T06:02:05.714Z:详细信息:(feb335244b957a72):相邻融合   ParDo,读,写和展平操作2017-05-10T06:02:05.716Z:   详细信息:(feb335244b95768c):将消费者AnonymousParDo融入其中   读/ DataflowPipelineRunner.BatchBigQueryIONativeRead   2017-05-10T06:02:05.718Z:详情:(feb335244b9572a6):融合消费者   WriteToBigQuery / DataflowPipelineRunner.BatchBigQueryIOWrite / DataflowPipelineRunner.BatchBigQueryIONativeWrite   进入AnonymousParDo 2017-05-10T06:02:05.728Z:详细信息:   (feb335244b95730e):添加StepResource设置并拆除工作流程   图形。 2017-05-10T06:02:05.767Z:基本:(75edc98e2ecf8a50):执行   手术   读/ DataflowPipelineRunner.BatchBigQueryIONativeRead + AnonymousParDo + WriteToBigQuery / DataflowPipelineRunner.BatchBigQueryIOWrite / DataflowPipelineRunner.BatchBigQueryIONativeWrite   2017-05-10T06:02:05.973Z:基本:(c9b9bc749d188107):开始5   工人... 2017-05-10T06:02:07.735Z:基本:(4903a2f536f5c1ae):   作为作业发布的BigQuery查询:" dataflow_job_4354447435307355184"。您   可以使用bq工具检查其状态:" bq show -j   --project_id = com-dl-parts-dev dataflow_job_4354447435307355184"。 2017-05-10T06:03:03.727Z:详情:(376dc1d89cc4c16e):工人有   开始成功了。 2017-05-10T06:04:09.561Z:基本:   (4903a2f536f5c868):BigQuery查询完成,作业:   " dataflow_job_4354447435307355184" 2017-05-10T06:04:09.987Z:基本:   (4903a2f536f5cfbf):BigQuery导出作业   " dataflow_job_5261227963771635305"开始。您可以查看其状态   使用bq工具:" bq show -j --project_id = com-dl-parts-dev   dataflow_job_5261227963771635305&#34 ;. 2017-05-10T06:05:10.798Z:详情:   (d0c3fbda1e314661):BigQuery导出作业进度:   " dataflow_job_5261227963771635305"观察到总共1个导出文件   迄今。 2017-05-10T06:05:10.801Z:基本:(d0c3fbda1e31498f):   BigQuery导出工作完成了:" #34; dataflow_job_5261227963771635305"   2017-05-10T06:06:12.303Z:基本:(d51372b306784d58):自动缩放:   调整大小的工作人员池从5到1. 2017-05-10T06:06:12.306Z:详细信息:   (d51372b306784f56):自动缩放:将工作人员数量减少到1   基于当前运行步骤的进度。   2017-05-10T06:07:38.000Z:基本:(4e3c32839262218d):自动缩放:   试图将工人池升级到2. 2017-05-10T06:08:11.074Z:   基本:(4e3c328392622142):自动调节:从1到1的调整后的工作池   2. 2017-05-10T06:08:11.077Z:详细信息:(4e3c32839262213c):自动缩放:根据并行化的能力将工作者数量提高到2   当前正在运行的步骤中的工作。 2017-05-10T06:13:41.023Z:   基本:(ae82479176c127a3):自动调节:从2到2的调整后的工作池   1. 2017-05-10T06:13:41.027Z:详细信息:(ae82479176c129d5):自动缩放:根据并行化的能力将工作者数量减少到1   当前正在运行的步骤中的工作。 2017-05-10T06:20:31.844Z:   基本:(a41dfc71af8c36fd):执行BigQuery导入作业   " dataflow_job_4354447435307352182&#34 ;.你可以用它来检查它的状态   bq工具:" bq show -j --project_id = com-dl-parts-dev   dataflow_job_4354447435307352182"

更新: - 防止融合是正确的方法吗?

我正在使用bigquery IO读取Bigquery表。此输入参数为每个记录提供产品编号。

我正在进行ParDo操作。在流程元素功能中,我正在为每个产品做一些数据预测操作。

PCollection<TableRow> quotes3 = quotes2.apply(ParDo.of(new  DoFn<TableRow, TableRow>() {
private static final long serialVersionUID = 1L;
    @Override
    public void processElement(ProcessContext c) throws Exception{

        TableRow rowData = c.element();
        rowData = c.element();
        TableRow tableRowData = ForcastOperation(rowData);
        c.output(tableRowDRP);
    }
}));

在最后一步中,我使用数据流管道将预测结果转储到bigquery。

quotes3.apply(BigQueryIO.Write
        .named("WriteToBigQuery")
        .to("com-dl-parts:ds_parts.output_data")
        .withSchema(schema)
        .withWriteDisposition(BigQueryIO.Write.WriteDisposition.WRITE_APPEND)
        .withCreateDisposition(BigQueryIO.Write.CreateDisposition.CREATE_IF_NEEDED));

pipelineTransform.run();

更新: - 2017年5月17日13:38

我想通过下面列出的方式打破融合。它将GroupByKey应用操作扩展到308个节点。但我不确定它是否正在将具有ForcastOperation方法的数据扩展到308个节点。

 PCollection<String> quotes1 = quotes.apply(ParDo.of(new  DoFn<TableRow, KV<String, String>>() {
    private static final long serialVersionUID = 1L;
    private Random random = new Random();

        @Override
        public void processElement(ProcessContext c) throws Exception{
            TableRow rowData = c.element();
            rowData = c.element();
            c.output(KV.of(rowData.get("APRODUCT").toString(), rowData.get("APRODUCT").toString()));
        }
        })).apply(GroupByKey.<String, String>create())
           .apply(Values.<Iterable<String>>create())
           .apply(Flatten.<String>iterables());



PCollection<TableRow> quotes3 = quotes1.apply(ParDo.of(new  DoFn<String, TableRow>() {
private static final long serialVersionUID = 1L;
    @Override
    public void processElement(ProcessContext c) throws Exception{

        TableRow rowData = c.element();
        rowData = c.element();
        TableRow tableRowData = ForcastOperation(rowData);
        c.output(tableRowDRP);
    }
}));

在最后一步中,我使用数据流管道将预测结果转储到bigquery。

    quotes3.apply(BigQueryIO.Write
        .named("WriteToBigQuery")
        .to("com-dl-parts:ds_parts.output_data")
        .withSchema(schema)
        .withWriteDisposition(BigQueryIO.Write.WriteDisposition.WRITE_APPEND)
        .withCreateDisposition(BigQueryIO.Write.CreateDisposition.CREATE_IF_NEEDED));

pipelineTransform.run();

1 个答案:

答案 0 :(得分:3)

我查看了这份工作的日志,看来它从BigQuery读取的数据量非常小 - 大约1kb。这是预期的吗?

如果是,如果你仍想要并行化1kb 1000-way的处理,那么我认为你的ForecastOperation函数每个元素的计算量非常大。

在这种情况下,您需要在从BigQuery读取和应用ForecastOperation之间打破融合。请参阅https://cloud.google.com/dataflow/service/dataflow-service-desc#preventing-fusion