Google Dataflow - 如果写入本地服务器,如何在 java 中指定 TextIO?
Posted
技术标签:
【中文标题】Google Dataflow - 如果写入本地服务器,如何在 java 中指定 TextIO?【英文标题】:Google Dataflow - How to specify the TextIO in java if writing to an On-prem server? 【发布时间】:2019-02-18 18:57:57 【问题描述】:Google Dataflow - 如果从 Dataflow 写入本地服务器,如何指定 TextIO? (前提是 On-prem 服务器通过 Cloud *** 连接到 GCP)
pipeline.apply("Writer",TextIO.write().to("XXX.XXX.XXX.XXX://tmp/somedirectory/somefilename");
在运行 Dataflow 作业时,是否像上述那样提供本地 IP 和目录?我尝试了,并且在步骤摘要中添加了元素,作业成功完成,但我没有看到本地服务器中写入的任何文件。 [不确定是否与本地服务器的身份验证有关]
【问题讨论】:
【参考方案1】: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
所以鉴于你指定的'filename'没有架构,我怀疑它会被写入worker的本地磁盘,这不是很有用!
因此,正如@ajp 建议的那样,您需要写入例如 GCS,然后让您的本地服务器从 GCS 读取。 - 您或许可以使用 pub/sub 消息作为本地服务器的信号,表明结果已准备就绪
【讨论】:
【参考方案2】:以这种方式使用 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。
【讨论】:
以上是关于Google Dataflow - 如果写入本地服务器,如何在 java 中指定 TextIO?的主要内容,如果未能解决你的问题,请参考以下文章
性能:Google Dataflow 将 avro 文件写入 GCS
通过 Google Cloud Dataflow 创建/写入 Parititoned BigQuery 表
通过 Google Cloud Dataflow 创建/写入 Parititoned BigQuery 表
尝试在 Dataflow 中使用 Apache Beam 将数据从 Google PubSub 写入 GCS 时出错
我们可以使用单个 Google Cloud Dataflow 将来自多个 Pubsub(源)的数据写入多个 GCS(接收器)吗?