我想运行谷歌数据流进行模拟过程。我尝试通过自动缩放(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();
答案 0 :(得分:3)
我查看了这份工作的日志,看来它从BigQuery读取的数据量非常小 - 大约1kb。这是预期的吗?
如果是,如果你仍想要并行化1kb 1000-way的处理,那么我认为你的ForecastOperation函数每个元素的计算量非常大。
在这种情况下,您需要在从BigQuery读取和应用ForecastOperation之间打破融合。请参阅https://cloud.google.com/dataflow/service/dataflow-service-desc#preventing-fusion