我每5分钟从ElasticSearch读取数据到Spark。所以每5分钟会有一个RDD。
我希望基于这些RDD构建一个DStream,以便我可以在过去1天,最后1小时,最后5分钟内获取数据报告等等。
要构建DStream,我正在考虑创建自己的接收器,但spark的官方文档仅使用scala或java来提供信息。我使用python。
所以你知道有办法吗?我知道我们可以。在所有DStream都是一系列RDD之后,当然我们应该从持续的RDD创建DStream。我只是不知道如何。请提出一些建议
答案 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类来实现弹性搜索数据拉动逻辑。当您的数据已经从复制和可重放的存储中受益时,这是一种不依赖接收器的更好方法。
但是,我不确定您是否可以直接从python中轻松创建InputDStream类。