Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google cloud dataflow 并行运行相同的DF模板会产生奇怪的结果_Google Cloud Dataflow - Fatal编程技术网

Google cloud dataflow 并行运行相同的DF模板会产生奇怪的结果

Google cloud dataflow 并行运行相同的DF模板会产生奇怪的结果,google-cloud-dataflow,Google Cloud Dataflow,我有一个数据流作业,它从云SQL中提取数据并将其加载到云存储中。我们已将作业配置为接受参数,以便可以使用相同的代码提取多个表。数据流作业被编译为模板 当我们以串行方式创建/运行模板实例时,我们会得到预期的结果。但是,如果我们并行创建/运行实例,云存储上只会出现一些文件。在这两种情况下,我们都可以看到DF作业被创建并成功终止 例如,我们有11个实例,它们生成11个输出文件。在串行模式下,我们得到所有11个文件,在并行模式下,我们只得到大约3个文件。在并行运行期间,所有11个实例同时运行 有人能就为

我有一个数据流作业,它从云SQL中提取数据并将其加载到云存储中。我们已将作业配置为接受参数,以便可以使用相同的代码提取多个表。数据流作业被编译为模板

当我们以串行方式创建/运行模板实例时,我们会得到预期的结果。但是,如果我们并行创建/运行实例,云存储上只会出现一些文件。在这两种情况下,我们都可以看到DF作业被创建并成功终止

例如,我们有11个实例,它们生成11个输出文件。在串行模式下,我们得到所有11个文件,在并行模式下,我们只得到大约3个文件。在并行运行期间,所有11个实例同时运行

有人能就为什么会发生这种情况提供一些建议吗?我假设DF模板创建的临时文件在并行运行期间会被覆盖

并行运行的主要动机是更快地提取数据

编辑

管道非常简单:

        PCollection<String> results =  p
            .apply("Read from Cloud SQL", JdbcIO.<String>read()
                .withDataSourceConfiguration(JdbcIO.DataSourceConfiguration
                        .create(dsDriver, dsConnection)
                        .withUsername(options.getCloudSqlUsername())
                        .withPassword(options.getCloudSqlPassword())
                )
                .withQuery(options.getCloudSqlExtractSql())
                .withRowMapper(new JdbcIO.RowMapper<String>() {
                    @Override
                    public String mapRow(ResultSet resultSet) throws Exception {
                        return mapRowToJson(resultSet);
                    }
                })
                .withCoder(StringUtf8Coder.of()));
当我调用模板时,我还提供了“tempLocation”。我可以看到正在使用动态临时位置。尽管如此,我并没有看到并行运行时的所有输出文件


谢谢

解决方案

  • 添加唯一的模板位置
  • 添加唯一的输出路径和文件名
  • DF完成处理后,将输出文件移动到CS上的最终目标

  • 您是否有可能提供一些代码来显示您正在执行的操作?是否可以至少显示管道的IO输入源和接收器步骤。以及命令行或创建作业UI屏幕截图,以便我们可以看到您传递的参数。我怀疑问题可能在于,不知何故,这两条管道正在写入同一个地面军事系统位置,并可能清除彼此上方的地面军事系统位置。我还将尝试确保这两个作业使用单独的--tempLocation和--stagingLocation值,看看这是否解决了问题。谢谢你的建议,我已经为每个实例生成了一个动态模板,但是我仍然看到了这个问题——尽管可能不是很糟糕。所有作业的目标都是相同的CS位置,因此我可能会尝试为每个作业生成一个唯一的输出位置,然后在最后将它们移回中心位置……请也尝试一下,并让我知道这是否有帮助。如果您使用相同的地面军事系统输出位置,我相信它们会相互覆盖。我可以确认,添加唯一的输出位置解决了问题。您可以观察日志中的行为-DF首先将临时文件写入输出CS位置,然后重命名它。这会导致文件被覆盖
    mvn compile exec:java \
     -Dexec.mainClass=com.xxxx.batch_ingestion.LoadCloudSql \
     -Dexec.args="--project=myproject \
        --region=europe-west1 \
        --stagingLocation=gs://bucket/dataflow/staging/ \
        --cloudStorageLocation=gs://bucket/data/ \
        --cloudSqlInstanceId=yyyy \
        --cloudSqlSchema=dev \
        --runner=DataflowRunner \
        --templateLocation=gs://bucket/dataflow/template/BatchIngestion"