我是scala的新手,试图通过RabbitMQ队列将序列化Java对象发送到Spark Streaming应用程序。
我可以成功排列已使用ObjectOutputStream
序列化的对象。要在Spark端接收我的对象,我已从此处下载了自定义RabbitMQ InputDStream
和Receiver
实现 - 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>
感谢任何帮助。