我正在尝试在数据流上运行我的第一个 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
不在其中。
我缺少明显的东西吗?
答案 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进行所有操作。
希望有帮助