Java 源与转移

Java 源与转移,java,google-cloud-dataflow,Java,Google Cloud Dataflow,我是这个项目的新手,我正在尝试在数据流和数据库之间创建一个连接器 文档清楚地说明了我应该使用源和接收器,但我看到很多人直接使用与PInput或PDone相关的pttransform 源/接收器API处于实验阶段(它解释了pttransform的所有示例),但似乎更容易将其与自定义运行程序集成(例如:spark) 如果我参考代码,将使用这两种方法。我看不到任何使用ptransformapi更有趣的用例 源/接收器API是否应该替换PTranform API 我是否错过了明确区分这两种方法的东西 源

我是这个项目的新手,我正在尝试在数据流和数据库之间创建一个连接器

文档清楚地说明了我应该使用源和接收器,但我看到很多人直接使用与PInput或PDone相关的pttransform

源/接收器API处于实验阶段(它解释了pttransform的所有示例),但似乎更容易将其与自定义运行程序集成(例如:spark)

如果我参考代码,将使用这两种方法。我看不到任何使用ptransformapi更有趣的用例

源/接收器API是否应该替换PTranform API

我是否错过了明确区分这两种方法的东西

源/接收器API是否足够稳定,可以被认为是编写输入和输出代码的好方法


谢谢你的建议

数据流的原理是,
pttransform
是抽象和可组合性的主要单元,也就是说,任何自包含的数据处理任务都应该封装为
pttransform
。这包括连接到第三方存储系统的任务:从某处摄取数据或将数据导出到某处

以谷歌云数据存储为例。在代码段中:

    PCollection<Entity> entities =
      p.apply(DatastoreIO.readFrom(dataset, query));
    ...
    p.apply(some processing)
     .apply(DatastoreIO.writeTo(dataset));
PCollection实体=
p、 应用(DatastoreIO.readFrom(dataset,query));
...
p、 应用(某些处理)
.apply(DatastoreIO.writeTo(dataset));
DatastoreIO.readFrom(dataset,query)
的返回类型是
PTransform
的子类,
DatastoreIO.writeTo(dataset)
的返回类型是
PTransform
的子类

诚然,这些函数是使用
接收器
类实现的,但对于只想读或写数据存储的用户来说,这是一个通常不重要的实现细节(但是,请参见本答案末尾关于公开
接收器
类的说明)。任何连接器,或就此而言,任何其他数据处理任务都是
p传输


注意:目前从某处读取的连接器倾向于
pttransform
,而向某处写入的连接器倾向于
pttransform
,但我们正在考虑以更灵活的方式使用连接器的选项(例如,从文件名的
PCollection
读取)

当然,对于想要实现新连接器的人来说,这个细节很重要。特别是,您可能会问:

Q:如果我可以将连接器实现为一个pttransform,那么为什么我需要
接收器
类呢?

A:如果只需使用内置转换(如
ParDo
GroupByKey
等)即可实现连接器,这是开发连接器的一种非常有效的方法。
然而,
接收器
类提供了一些低级功能,如果您需要这些功能,这些功能将很麻烦,或者无法自行开发

例如,
BoundedSource
UnboundedSource
提供了用于控制并行化如何发生的钩子(初始和动态工作重新平衡-
BoundedSource.splitintobunders
BoundedReader.splitatfrance
),而这些钩子当前未针对任意
DoFn
s公开

从技术上讲,您可以通过编写一个
DoFn
来实现文件格式的解析器,该解析器将文件名作为输入,读取文件并发出
SomeRecord
,但是如果文件在runt时变得非常大,那么该
DoFn
将无法动态地将文件的读取部分并行化到多个worker上另一方面,
FileBasedSource
内置了此功能,以及处理全局文件模式等

类似地,您可以通过实现一个
DoFn
来尝试实现流式处理系统的连接器,该连接器接受一个伪元素作为输入,建立一个连接,并将所有元素流到
ProcessingContext.output()中
,但是,
DoFn
s目前不支持从单个捆绑包写入无限量的输出,也不明确支持数据流为流管道提供强大一致性保证所需的检查点和重复数据消除机制。
UnboundedSource
,另一方面,支持所有这一切

Sink
(更准确地说,
Write.to()
PTransform
)也很有趣:它只是一个复合转换,您可以自己编写(也就是说,它在数据流运行程序或后端中没有硬编码支持),但它的开发考虑到了并行向存储系统写入数据时出现的典型分布式容错问题,并且它提供了一些钩子,迫使您记住这些问题:例如,由于数据束是并行写入的,有些数据束可能会因容错而重试或复制,因此一个钩子,用于“提交”成功完成的捆绑包的结果(
WriteOperation.finalize

总而言之:使用
Source
Sink
API开发连接器可以帮助您以一种在分布式处理环境中工作良好的方式构建代码,并且源API可以让您访问框架的高级功能。但是如果您的连接器非常简单,两者都不需要,那么您可以自由地从其他内置转换组装连接器

Q:假设我决定使用
源代码
接收器
。那么如何将连接器打包为库:我应该只提供
源代码
还是
接收器