【发布时间】:2015-06-16 08:43:04
【问题描述】:
我的 Dataflow 管道需要读取资源文件 GeoLite2-City.mmdb。我将它添加到我的项目中并运行管道。我确认 GCS 上的暂存桶中存在项目包 zip 文件。
但是,当我尝试读取资源文件 GeoLite-City.mmdb 时,我得到了 FileNotFoundException。我怎样才能解决这个问题?这是我的代码:
String path = myClass.class.getResource("/GeoLite2-City.mmdb").getPath();
File database = new File(path);
try
{
DatabaseReader reader = new DatabaseReader.Builder(database).build(); //<-this line get a FileNotFoundException
}
catch (IOException e)
{
LOG.info(e.toString());
}
我的项目包压缩文件是“classes-WOdCPQCHjW-hRNtrfrnZMw.zip”
(它包含类文件和GeoLite2-City.mmdb)
路径值为“file:/dataflow/packages/staging/classes-WOdCPQCHjW-hRNtrfrnZMw.zip!/GeoLite2-City.mmdb”,但无法打开。
这是选项。
--runner=BlockingDataflowPipelineRunner
--project=peak-myproject
--stagingLocation=gs://mybucket/staging
--input=gs://mybucket_log/log.68599ca3.gz
目标是转换 GCS 上的日志文件,并将转换后的数据插入 BigQuery。 当我在本地运行时,成功导入 Bigquery。 我认为本地 PC 和 GCE 获取资源路径是有区别的。
【问题讨论】:
-
这是否使用 DirectPipelineRunner 在本地运行?
-
您还可以确认您的 DatabaseReader 类是否完全支持位于 zip 存档中的文件?这与 Dataflow 无关 - 您可以尝试在主程序中创建 DatabaseReader 并将其指向 classes-WOdCPQCHjW-hRNtrfrnZMw.zip 文件的本地副本,然后检查它是否有效。
-
不,跑步者是 BlockingDataflowPipelineRunner。当我使用 DirectPipelineRunner 在本地运行时,它运行良好。路径值在本地是“/C:/Users/Jennie/workspace/DataflowJavaSDK-master/eclipse/starter/target/classes/GeoLite2-City.mmdb”,这是我的选择。 [ --runner=BlockingDataflowPipelineRunner --project=peak-myproject --stagingLocation=gs://mybucket/staging --input=gs://mybucket_log/log.68599ca3.gz ]
标签: java google-cloud-dataflow