簡體   English   中英

Google Dataflow-能夠在當前運行的步驟中並行處理工作

[英]Google Dataflow - ability to parallelize the work in the currently running step

我正准備運行google dataflow進行模擬過程。 我嘗試在(THROUGHPUT_BASED)上通過自動縮放啟動最大工作節點5的數據流。

問題是數據流沒有利用所有提供消息的工作節點(5)。

自動縮放:根據並行執行當前運行步驟中的工作的能力,將工作人員的數量減少到1。

請提出可能是什么問題。

日志附在下面。

2017-05-10T06:01:36.555Z:詳細信息:(5de468ab73bd7581):為任務2017-05-09_23_01_36-6765647625807820060啟用了自動縮放。 工作者人數將在1到1000之間。2017-05-10T06:01:37.811Z:詳細信息:(feb335244b957ccc):檢查所需的Cloud 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融合到Read / DataflowPipelineRunner.BatchBigQueryIONativeRead 2017-05-10T06:02:05.718Z:詳細信息:(feb335244b9572a6):融合消費者WriteToBigQuery / DataflowPipelineRunnerW.BatchBigQuery DataflowPipelineRunner.BatchBigQueryIONativeWrite into AnonymousParDo 2017-05-10T06:02:05.728Z:詳細信息:(feb335244b95730e):向工作流圖添加StepResource設置和拆卸。 2017-05-10T06:02:05.767Z:基本:(75edc98e2ecf8a50):執行操作Read / DataflowPipelineRunner.BatchBigQueryIONativeRead + AnonymousParDo + WriteToBigQuery / DataflowPipelineRunner.BatchBigQueryIOWrite / DataflowPipelineRunner.BatchBigQueryIONativeWrite:2017-05-10 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_4354447435307355355184” 2017-05-10T06:04:09.987Z:基本:(4903a2f536f5cfbf):BigQuery導出作業“ dataflow_job_5261227963771635305”已啟動。 您可以使用bq工具檢查其狀態:“ bq show -j --project_id = com-dl-parts-dev dataflow_job_5261227963771635305”。 2017-05-10T06:05:10.798Z:詳細信息:(d0c3fbda1e314661):BigQuery導出作業進度:“ dataflow_job_5261227963771635305”到目前為止共觀察到1個導出文件。 2017-05-10T06:05:10.801Z:基本:(d0c3fbda1e31498f):BigQuery導出作業完成:“ dataflow_job_5261227963771635305” 2017-05-10T06:06:12.303Z:基本:(d51372b306784d58):自動縮放:將工作池從5調整為5 1. 2017年10月10日06:06:12.306Z:詳細信息:(d51372b306784f56):自動縮放:根據當前運行步驟的進度將工人人數減少到1。 2017-05-10T06:07:38.000Z:基本:(4e3c32839262218d):自動擴展:嘗試將工作池擴展到2.2017-05-10T06:08:11.074Z:基本:(4e3c328392622142):自動擴展:從以下位置調整大小的工作池1到2。2017-05-10T06:08:11.077Z:詳細信息:(4e3c32839262213c):自動縮放:基於並行化當前運行步驟中工作的能力,將工作人員的數量增加到2。 2017-05-10T06:13:41.023Z:基本:(ae82479176c127a3):自動擴展:將工作池的大小從2調整為1.2017-05-10T06:13:41.027Z:詳細信息:(ae82479176c129d5):自動擴展:減少了可以根據當前正在運行的步驟並行執行工作的能力將其設置為1。 2017-05-10T06:20:31.844Z:基本:(a41dfc71af8c36fd):執行BigQuery導入作業“ dataflow_job_4354447435307352182”。 您可以使用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();

更新:-17/05/2017 13:38

我想通過以下列出的方式打破融合。 它將GroupByKey應用操作擴展到308個節點。 但我不確定它是否將具有ForcastOperation方法的secpar pardo擴展到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();

我查看了此作業的日志,看來從BigQuery作為輸入讀取的數據量非常小-約為1kb。 這是預期的嗎?

如果是,並且仍然想並行處理1000 KB的1kb數據,那么我假設您的ForecastOperation函數每個元素的計算量非常大。

在這種情況下,您需要打破從BigQuery讀取和應用ForecastOperation之間的融合。 請參閱https://cloud.google.com/dataflow/service/dataflow-service-desc#preventing-fusion

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM