【问题标题】:Using external classes with dataflow将外部类与数据流一起使用
【发布时间】:2018-07-12 11:39:38
【问题描述】:

我正在尝试制作一个接受侧面输入的自定义转换类,并且我正在使用 PipelineTester 和 PAssert 尝试对其进行测试,但是在尝试将其引入转换的方法上,我不断收到无此类方法异常来自其他类。

引起:java.lang.NoSuchMethodError: com.org.utils.MyUtils.createMap(Ljava/lang/Iterable;)Ljava/util/Map; 在 com.org.beam.MyTransform.ProcessElement(MyTransform.java:51)

我尝试过使用@Autowired 注解来引入类

@Autowired
private MyUtils myutils;

就像在代码中创建一个静态实例一样

private static MyUtils myUtils = new MyUtils();

然后调用

this.myUtils.createMap(mapThisToThat(inputCollection, this.myMap));

我也尝试过将方法设为静态并像这样调用它们

MyUtils.createMap(mapThisToThat(inputCollection, this.myMap));

mapThisToThat 的签名是

private Iterable<MyObject> mapThisToThat(Iterable<MyObject> objectIterator, Map<String, Integer> myMap) {

正在传递给具有此签名的 createMap 方法 -

public Map<String, MyObject> createMap(Iterable<MyObject> inputCollection){

所以它正确地传递了 MyObjects 的 Iterable,但它说由于某种原因该方法不存在。这是否意味着光束变换不能有外部方法或者我做错了什么?

【问题讨论】:

    标签: java google-cloud-platform google-cloud-dataflow apache-beam


    【解决方案1】:

    对于我在 python 中的工作,我需要做很多事情才能使其工作:

    https://cloud.google.com/dataflow/faq#how-do-i-handle-nameerrors https://beam.apache.org/documentation/sdks/python-pipeline-dependencies/

    对于您在 java 中,由于某种原因,他们没有互惠文档,但在这里 https://beam.apache.org/documentation/runners/dataflow/ 他们说这样的话:

    在某些情况下,例如使用 Apache AirFlow 等调度程序启动管道,您必须拥有一个自包含的应用程序。除了上一节中显示的添加现有依赖项之外,您还可以通过在 pom.xml 的 Project 部分中显式添加以下依赖项来打包自执行 JAR。

    在他们的示例中自述文件https://github.com/mbrukman/apache-beam/tree/master/examples/java 他们这样说

    或者,您可以选择将所有依赖项捆绑到一个 JAR 中并在 Maven 环境之外执行它。例如,您可以执行以下命令来创建示例的捆绑 JAR,并在本地和云平台中执行它

    如果您继续浏览该示例存储库,则会有一个带有 utils 的 common 文件夹。希望你能复制他们的做法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-13
      • 1970-01-01
      • 2010-11-27
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多