使用Spark流式传输RabbitMQ消息

时间:2015-07-25 03:57:32

标签: scala apache-spark rabbitmq spark-streaming

我是scala的新手,试图通过RabbitMQ队列将序列化Java对象发送到Spark Streaming应用程序。

我可以成功排列已使用ObjectOutputStream序列化的对象。要在Spark端接收我的对象,我已从此处下载了自定义RabbitMQ InputDStreamReceiver实现 - https://github.com/Stratio/rabbitmq-receiver

但是,据我所知,代码库只支持String消息,而不支持二进制消息。因此,我开始攻击该代码,以使其支持能够读取二进制消息并将其存储为字节数组,以便我可以在Spark端反序列化它。这次尝试就在这里 - https://github.com/llevar/rabbitmq-receiver

然后我在Spark驱动程序中有以下代码:

val conf = new SparkConf().setMaster("local[6]").setAppName("NetworkWordCount")
val ssc = new StreamingContext(conf, Seconds(1))

val receiverStream: ReceiverInputDStream[scala.reflect.ClassTag[AnyRef]]  =
  RabbitMQUtils.createStreamFromAQueue(ssc, 
                                       "localhost", 
                                       5672, 
                                       "mappingQueue", 
                                       StorageLevel.MEMORY_AND_DISK_SER_2)
val parsedStream = receiverStream.map{ m =>
  SerializationUtils.deserialize(m.asInstanceOf[Array[Byte]]).asInstanceOf[SAMRecord]
}
parsedStream.print()
ssc.start()

不幸的是,这似乎不起作用。数据从队列中消耗掉。我没有得到任何错误,但我没有得到任何我期望的输出。

这就是我得到的。

  

2015-07-24 23:33:38 WARN BlockManager:71 - 阻止输入-0-1437795218845仅复制到0个对等体而不是1个对等体   2015-07-24 23:33:38 WARN BlockManager:71 - 阻止输入-0-1437795218846仅复制到0个对等体而不是1个对等体   2015-07-24 23:33:38 WARN BlockManager:71 - 阻止输入-0-1437795218847仅复制到0个对等体而不是1个对等体   2015-07-24 23:33:38 WARN BlockManager:71 - 阻止输入-0-1437795218848只复制到0个对等体而不是1个对等体

在调用store()方法之前,我能够成功反序列化我的对象 - https://github.com/llevar/rabbitmq-receiver/blob/master/src/main/scala/com/stratio/receiver/RabbitMQInputDStream.scala#L106

只需调用来自SerializationUtils调用的数据的delivery.getBody,但我似乎无法从主程序中的DStream获取相同的数据。< / p>

感谢任何帮助。

0 个答案:

没有答案