如何在Google DataFlow中为Google云端存储文件实施自定义文件解析器

时间:2016-04-29 08:21:10

标签: google-cloud-dataflow

我在Google云端存储中有自定义文件格式,我想从Google DataFlow中读取它。

我通过继承FileBasedReader实现了Source和Reader,但后来我意识到它不支持从Google Cloud Storage读取(而FileBasedSink实际上是......)所以我不确定什么是最好的想法在这里解决......

我试图将TextIO子类化,但我无法达到目的,因为它似乎没有设计为子类。

关于如何处理的任何好主意?

感谢。

更新以反映评论

使用的文件模式:gs://mybucket/my.json

从FileBasedSource实现Source类:

MessageSource<T> extends FileBasedSource<T>

从FileBasedReader实现了Reader类(我真正关心的):

MessageReader<T> extends FileBasedReader<T>

阅读过程是:

MySource source = // instantiate source
Pipeline p = Pipeline.create(options);
p.apply(TextIO.Read.from(options.getSource()).named("ReadFileData"))
     .apply(ParDo.of(new DoFn<String, String>() {

getSource()来自此命令行参数(已验证正确):

    --source=gs://${BUCKET_NAME}/my.json \

我错过了什么吗?

第二次更新

在运行source.getEstimatedSizeBytes(options)时,它告诉我没有找到处理程序?

java.io.IOException: Unable to find handler for gs://mybucket/my.json
at com.google.cloud.dataflow.sdk.util.IOChannelUtils.getFactory(IOChannelUtils.java:186)
at com.google.cloud.dataflow.sdk.io.FileBasedSource.getEstimatedSizeBytes(FileBasedSource.java:182)
at com.etc.TrackingDataPipeline.main(TrackingDataPipeline.java:66)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:293)
at java.lang.Thread.run(Thread.java:745)

我认为FileBasedSource应该处理GCS?

1 个答案:

答案 0 :(得分:3)

从您在&#34;第二次更新&#34;中显示的堆栈跟踪中,您似乎直接从getEstimatedSizeBytes方法调用了main()。这预计会导致您看到的错误。

构建管道运行器时会注册标准URL方案处理程序。在您的示例代码中,当您调用Pipeline.create(options)时会发生这种情况(这会调用注册标准处理程序的PipelineRunner.fromOptions(options)。)

如果您希望在运行管道之外的上下文中注册标准URL方案,则可以显式调用IOChannelUtils.registerStandardIOFactories()。我应该注意到,这不是一个受支持的API,而是在引擎盖下#34;。因此,它可能随时发生变化。