如何在SBT(本地)的数据流上运行Scio管道

时间:2019-09-18 16:27:16

标签: scala spotify-scio

我正在尝试在数据流上运行我的第一个 Scio 管道。

有问题的代码可以在here中找到。但是我认为这不太重要。
我的第一个实验是使用 DirecRunner 读取一些本地CSV文件并编写另一个本地CSV文件。如预期般运作。

现在,我正尝试从 GCS 中读取文件,将输出写入 BigQuery ,并使用 DataflowRunner 运行管道。我已经进行了所有必要的更改(或者我相信这是)。但是我无法使其运行。

我已经gcloud auth application-default login,当我这样做的时候

sbt run --runner=DataflowRunner --project=project-id --input-path=gs://path/to/data --output-table=dataset.table

我可以看到Jb是在 Dataflow 中提交的。但是,一小时后,作业将失败,并显示以下错误消息。

  

工作流程失败。原因:数据流作业似乎被卡住了,因为在最近1小时内未发现任何工人活动。

(请注意,这项工作一直没有做,并且由于这是一项实验,因此数据太简单而无法花费几分钟的时间)

检查 StackDriver ,我发现以下错误:

  

java.lang.ClassNotFoundException:scala.collection.Seq

与某些杰克逊有关:

  

java.util.ServiceConfigurationError:com.fasterxml.jackson.databind.Module:提供程序com.fasterxml.jackson.module.scala.DefaultScalaModule无法实例化

这就是一开始就杀死每个执行器的原因。我真的不明白为什么我找不到Scala标准库。

我还尝试过先创建一个模板,然后使用以下命令将其删除:

sbt run --runner=DataflowRunner --project=project-id --input-path=gs://path/to/data --output-table=dataset.table --stagingLocation=gs://path/to/staging --templateLocation=gs://path/to/templates/template-1

但是,运行模板后,我得到了相同的错误。
另外,我注意到 staging 文件夹中有很多jar,但是scala-library.jar不在其中。

我缺少明显的东西吗?

2 个答案:

答案 0 :(得分:3)

这是sbt 1.3.0的一个已知问题,它引入了一些重大更改。类装载机。尝试1.2.8吗?

此外,Jackson问题可能与Java 11或更高版本有关。立即使用Java 8。

答案 1 :(得分:2)

通过设置sbt http://www.google.com来解决:

run / classLoaderLayeringStrategy := ClassLoaderLayeringStrategy.Flat

sbt对使用run运行的应用程序使用新的类加载器。这将导致重用JVM(例如Predef)已经加载的其他类,从而减少了启动时间。有关详细信息,请参见classLoaderLayeringStrategy

这不适用于Beam DataflowRunner,因为它明确地不会从父类加载器暂存类,请参见in-process classloaders

尝试检测类加载器有权访问的所有资源。这不会递归给类加载器的父级,以阻止它从系统类加载器中获取资源。

因此,解决方法是强制将应用程序使用的所有类加载到同一类加载器中,以便DataflowRunner进行所有操作。

希望有帮助