如何从持续的RDD构建DStream?

时间:2016-03-15 02:52:20

标签: elasticsearch apache-spark pyspark

我每5分钟从ElasticSearch读取数据到Spark。所以每5分钟会有一个RDD。

我希望基于这些RDD构建一个DStream,以便我可以在过去1天,最后1小时,最后5分钟内获取数据报告等等。

要构建DStream,我正在考虑创建自己的接收器,但spark的官方文档仅使用scala或java来提供信息。我使用python。

所以你知道有办法吗?我知道我们可以。在所有DStream都是一系列RDD之后,当然我们应该从持续的RDD创建DStream。我只是不知道如何。请提出一些建议

2 个答案:

答案 0 :(得分:1)

编写自己的接收器将是你提到的一种方式,但似乎是很多开销。您可以做的是使用QueueReceiver创建QueueInputDStream,如this example。它是Scala,但你也应该能够在Python中做类似的事情:

val rddQueue = new Queue[RDD[Map[String, Any]]]()
val inputStream = ssc.queueStream(rddQueue)

之后,您只需每隔X sec/min/h/day/whatever查询一次ES实例,然后将结果放入该队列。

使用Python我想它会是这样的:

rddQueue = []
rddQueue += es_rdd() // method that returns an RDD from ES
inputStream = ssc.queueStream(rddQueue)

// some kind of loop that adds to rddQueue new RDDS

显然你需要在queueStream中使用它之前在队列中有一些东西(或者至少我在pyspark中得到例外,如果它是空的)。

答案 1 :(得分:0)

没有必要使用接收器。您可以直接覆盖InputDStream类来实现弹性搜索数据拉动逻辑。当您的数据已经从复制和可重放的存储中受益时,这是一种不依赖接收器的更好方法。

请参阅:http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.streaming.dstream.InputDStream

但是,我不确定您是否可以直接从python中轻松创建InputDStream类。