简体   繁体   English

如何使用 Apache Beam 从 RabbitMQ 读取数据

[英]How to read data from RabbitMQ using Apache Beam

I have a prototype Apache Beam pipeline where I try to read data from RabbitMQ using the following configuration我有一个原型 Apache Beam 管道,我尝试使用以下配置从 RabbitMQ 读取数据

        p.apply("read_from_rabbit", RabbitMqIO.read()
                .withUri(options.getRabbitMQUri())
                .withQueue(options.getRabbitMQQueue())
                )
            .apply("extract_json_data", MapElements.via(new RabbitMessageToKafkaMessage()))

when I try to run it, I always get当我尝试运行它时,我总是得到

Exception in thread "main" java.lang.NoClassDefFoundError: com/rabbitmq/client/QueueingConsumer$Delivery
    at java.lang.Class.getDeclaredConstructors0(Native Method)
    at java.lang.Class.privateGetDeclaredConstructors(Class.java:2671)
    at java.lang.Class.getDeclaredConstructors(Class.java:2020)
    at java.io.ObjectStreamClass.computeDefaultSUID(ObjectStreamClass.java:1793)
    at java.io.ObjectStreamClass.access$100(ObjectStreamClass.java:72)
    at java.io.ObjectStreamClass$1.run(ObjectStreamClass.java:253)
    at java.io.ObjectStreamClass$1.run(ObjectStreamClass.java:251)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.io.ObjectStreamClass.getSerialVersionUID(ObjectStreamClass.java:250)
    at java.io.ObjectStreamClass.writeNonProxy(ObjectStreamClass.java:735)
    at java.io.ObjectOutputStream.writeClassDescriptor(ObjectOutputStream.java:668)
    at java.io.ObjectOutputStream.writeNonProxyDesc(ObjectOutputStream.java:1282)
    at java.io.ObjectOutputStream.writeClassDesc(ObjectOutputStream.java:1231)
    at java.io.ObjectOutputStream.writeClass(ObjectOutputStream.java:1213)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1120)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
    at org.apache.beam.sdk.util.SerializableUtils.serializeToByteArray(SerializableUtils.java:51)
    at org.apache.beam.repackaged.beam_runners_direct_java.runners.core.construction.CoderTranslation.toCustomCoder(CoderTranslation.java:119)
    at org.apache.beam.repackaged.beam_runners_direct_java.runners.core.construction.CoderTranslation.toProto(CoderTranslation.java:83)
    at org.apache.beam.repackaged.beam_runners_direct_java.runners.core.construction.SdkComponents.registerCoder(SdkComponents.java:250)
    at org.apache.beam.repackaged.beam_runners_direct_java.runners.core.construction.PCollectionTranslation.toProto(PCollectionTranslation.java:35)
    at org.apache.beam.repackaged.beam_runners_direct_java.runners.core.construction.SdkComponents.registerPCollection(SdkComponents.java:205)
    at org.apache.beam.repackaged.beam_runners_direct_java.runners.core.construction.PTransformTranslation.translateAppliedPTransform(PTransformTranslation.java:369)
    at org.apache.beam.repackaged.beam_runners_direct_java.runners.core.construction.ParDoTranslation$ParDoTranslator.translate(ParDoTranslation.java:120)
    at org.apache.beam.repackaged.beam_runners_direct_java.runners.core.construction.PTransformTranslation.toProto(PTransformTranslation.java:149)
    at org.apache.beam.repackaged.beam_runners_direct_java.runners.core.construction.ParDoTranslation.getParDoPayload(ParDoTranslation.java:651)
    at org.apache.beam.repackaged.beam_runners_direct_java.runners.core.construction.ParDoTranslation.isSplittable(ParDoTranslation.java:666)
    at org.apache.beam.repackaged.beam_runners_direct_java.runners.core.construction.PTransformMatchers$6.matches(PTransformMatchers.java:269)
    at org.apache.beam.sdk.Pipeline$2.visitPrimitiveTransform(Pipeline.java:280)
    at org.apache.beam.sdk.runners.TransformHierarchy$Node.visit(TransformHierarchy.java:665)
    at org.apache.beam.sdk.runners.TransformHierarchy$Node.visit(TransformHierarchy.java:657)
    at org.apache.beam.sdk.runners.TransformHierarchy$Node.visit(TransformHierarchy.java:657)
    at org.apache.beam.sdk.runners.TransformHierarchy$Node.visit(TransformHierarchy.java:657)
    at org.apache.beam.sdk.runners.TransformHierarchy$Node.access$600(TransformHierarchy.java:317)
    at org.apache.beam.sdk.runners.TransformHierarchy.visit(TransformHierarchy.java:251)
    at org.apache.beam.sdk.Pipeline.traverseTopologically(Pipeline.java:458)
    at org.apache.beam.sdk.Pipeline.replace(Pipeline.java:258)
    at org.apache.beam.sdk.Pipeline.replaceAll(Pipeline.java:208)
    at org.apache.beam.runners.direct.DirectRunner.run(DirectRunner.java:154)
    at org.apache.beam.runners.direct.DirectRunner.run(DirectRunner.java:64)
    at org.apache.beam.sdk.Pipeline.run(Pipeline.java:313)
    at org.apache.beam.sdk.Pipeline.run(Pipeline.java:299)
    at myCompany.myProject.RabbitToKafka.runTransformer(RabbitToKafka.java:54)
    at myCompany.myProject.RabbitToKafka.main(RabbitToKafka.java:61)
Caused by: java.lang.ClassNotFoundException: com.rabbitmq.client.QueueingConsumer$Delivery
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 48 more

My understanding is that since my RabbitMessageToKafkaMessage class read RabbitMQ messages, these messages in turn contain RabbitMQ data, in particular delivery information injected into constructor : public RabbitMqMessage(String routingKey, QueueingConsumer.Delivery delivery) { Is this ok ?我的理解是,由于我的RabbitMessageToKafkaMessage类读取 RabbitMQ 消息,这些消息又包含 RabbitMQ 数据,特别是注入构造函数的传递信息: public RabbitMqMessage(String routingKey, QueueingConsumer.Delivery delivery) {这可以吗?

If so, how can I transform my RabbitMQMessage into a KV during the read operation ?如果是这样,如何在读取操作期间将我的RabbitMQMessage转换为KV

EDIT 1 error happens when running my pipeline from Eclipse.从 Eclipse 运行我的管道时发生EDIT 1错误。

EDIT 2 That project is a maven project run using Eclipse.编辑 2该项目是一个使用 Eclipse 运行的 Maven 项目。 My Apache Bean dependencies are all at the 2.12.0 version (which is the latest).我的 Apache Bean 依赖项都是 2.12.0 版本(这是最新的)。

My dependency tree is as follows (at least the part regarding RabbitMQ)我的依赖树如下(至少是关于RabbitMQ的部分)

myCompany:myProject:jar:0.1.5-SNAPSHOT
+- org.apache.beam:beam-sdks-java-io-rabbitmq:jar:2.12.0:compile
|  \- com.rabbitmq:amqp-client:jar:5.4.3:compile

As it appear, merging my previous pom with an Apache Beam compatible one was not a good idea, as it created a conflict between two different versions of amqp-client.看起来,将我之前的 pom 与兼容 Apache Beam 的 pom 合并并不是一个好主意,因为它在两个不同版本的 amqp-client 之间造成了冲突。 Removing the Spring boot parent pom solved the bug, by removing the bad amqp-client version.通过删除错误的 amqp-client 版本,删除 Spring boot 父 pom 解决了该错误。

Looks like there're some rough edges in dependency management.看起来依赖管理有一些粗糙的边缘。 The following steps may help to find the problem:以下步骤可能有助于找到问题:

  1. Confirm that the missing class (or the amqp-client jar) is on a runtime class path确认缺少的类(或amqp-client jar)在运行时类路径上
  2. Build uberjar and try to run it from commandline构建 uberjar 并尝试从命令行运行它
  3. Try with different runners (FlinkRunner, DataflowRunner)尝试使用不同的运行程序(FlinkRunner、DataflowRunner)
  4. Try with the latest version of Beam尝试使用最新版本的 Beam

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 我可以使用Java从Cometd主题读取流数据到Apache Beam吗? - Can I read stream data into Apache Beam from a cometd topic using java? Apache Beam - RabbitMq Read - 失败确认消息并引发异常 - Apache Beam - RabbitMq Read - fail ack message and exception raised 如何在Java中使用Apache Beam ParDo函数读取JSON文件 - How to read a JSON file using Apache beam parDo function in Java 如何从 apache 光束 java sdk 中的 minIO 读取文件 - How to read a file from minIO in apache beam java sdk 如何以最佳方式使用 Apache Beam 和 BigQueryIO 从多个 BigQuery 表中检索数据? - How can I retrieve data from multiple BigQuery tables using Apache Beam and BigQueryIO in the best way? 在Apache Beam中从GCS读取文件 - Read a file from GCS in Apache Beam 如何使用Apache Beam(KafkaIO)反序列化Avro数据 - How to deserialize avro data using Apache Beam (KafkaIO) 如何在Apache Beam中将文件读取为byte []? - How to read files as byte[] in Apache Beam? 如何使用 Apache Beam 将表模式从源传递到接收器? - How to pass Table schema from Source to Sink using Apache Beam? 使用 Apache Beam 和 Dataflow 从按日期分区的动态 GCS 存储桶中读取 - Read from dynamic GCS bucket partitioned by date using Apache Beam and Dataflow
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM