Google Dataflow-如果写入本地服务器,如何在Java中指定TextIO?

时间:2018-09-14 01:40:18

标签: google-cloud-dataflow apache-beam dataflow apache-beam-io

Google Dataflow-如果从Dataflow写入本地服务器,如何指定TextIO? (前提是本地服务器已通过Cloud VPN连接到GCP)

pipeline.apply("Writer",TextIO.write().to("XXX.XXX.XXX.XXX://tmp/somedirectory/somefilename");

在运行Dataflow作业时,是否提供上述工作中的本地IP和目录?我尝试过,并且在步骤摘要中添加了元素,该工作成功完成,但是在本地服务器上看不到任何文件。 [不确定与本地服务器的身份验证是否有关系]

2 个答案:

答案 0 :(得分:2)

Apache beam textio要求使用模式前缀指定文件系统,例如file:// gs:// hdfs://。没有这些,我相信它默认为本地文件。

https://cloud.google.com/blog/products/data-analytics/review-of-input-streaming-connectors-for-apache-beam-and-apache-spark

因此,鉴于您指定的“文件名”没有模式,我怀疑它会被写入工作程序的本地磁盘,这不是很有用!

因此,如@ajp所建议,您需要写入GCS等内容,然后使本地服务器从GCS中读取。 -您也许可以使用发布/订阅消息作为向本地服务器发送信号的信号,表明结果已准备就绪

答案 1 :(得分:1)

以这种方式使用IP地址和路径不适用于TextIO,只有在本地运行管道时,它才适用于文件路径。

要将文件从Cloud Dataflow远程传输到本地服务器,最好的方法是先在Cloud Storage存储桶中写入文件,如下所示:

pipeline.apply(TextIO.Write.named("WriteFilesOnPremise")
   .to("gs://myPipelineBucket/onPremiseFiles")

然后使用gsutil command从本地存储桶中的文件直接下载到本地文件系统中,或者使用Cloud Storage Client Library方法以编程方式下载文件,或者您可以在mount the bucket as filesystem with Cloud Storage FUSE本地系统。