Spark Streaming 在数据量方面有什么限制?

What's the limit to spark streaming in terms of data amount?

我有几千万行的数据。是否可以使用 Spark Streaming 在一周或一天内分析所有这些? Spark Streaming 在数据量方面有什么限制?我不确定上限是多少,什么时候应该将它们放入我的数据库,因为 Stream 可能无法再处理它们。我也有不同的时间 windows 1,3, 6 小时等,我使用 window 操作来分离数据。

请在下面找到我的代码:

conf = SparkConf().setAppName(appname)
sc = SparkContext(conf=conf)
ssc = StreamingContext(sc,300)
sqlContext = SQLContext(sc)
channels = sc.cassandraTable("abc","channels")
topic = 'abc.crawled_articles'
kafkaParams = {"metadata.broker.list": "0.0.0.0:9092"}

category = 'abc.crawled_article'
category_stream = KafkaUtils.createDirectStream(ssc, [category], kafkaParams)
category_join_stream = category_stream.map(lambda x:read_json(x[1])).filter(lambda x:x!=0).map(lambda x:categoryTransform(x)).filter(lambda x:x!=0).map(lambda x:(x['id'],x))


article_stream = KafkaUtils.createDirectStream(ssc, [topic], kafkaParams)
article_join_stream=article_stream.map(lambda x:read_json(x[1])).filter(lambda x: x!=0).map(lambda x:TransformInData(x)).filter(lambda x: x!=0).flatMap(lambda x:(a for a in x)).map(lambda x:(x['id'].encode("utf-8") ,x))

#axes topic  integration the article and the axes
axes_topic = 'abc.crawled_axes'
axes_stream = KafkaUtils.createDirectStream(ssc, [axes_topic], kafkaParams)
axes_join_stream = axes_stream.filter(lambda x:'delete' not in str(x)).map(lambda x:read_json(x[1])).filter(lambda x: x!=0).map(lambda x:axesTransformData(x)).filter(lambda x: x!=0).map(lambda x:(str(x['id']),x)).map(lambda x:(x[0],{'id':x[0], 'attitudes':x[1]['likes'],'reposts':0,'comments':x[1]['comments'],'speed':x[1]['comments']}))
#axes_join_stream.reduceByKeyAndWindow(lambda x, y: x + y, 30, 10).transform(axestrans).pprint()

#join
statistics = article_join_stream.window(1*60*60,5*60).cogroup(category_join_stream.window(1*60*60,60)).cogroup((axes_join_stream.window(24*60*60,5*60)))
statistics.transform(joinstream).pprint()

ssc.start()    # Start the computation ssc.awaitTermination()
ssc.awaitTermination()

一次一个:

  • 是否可以在[给定的时间]内分析[一些大量的行]?

一般来说,是的 - Spark 允许您在多台机器上横向扩展,所以原则上您应该能够启动一个大型集群并在相对较短的时间内处理运行ch 大量数据(假设我们'谈论数小时或数天,而不是几秒钟或更短时间,这可能会因开销而出现问题)。

具体来说,在我看来,在合理的时间内(即不使用非常大的集群)对数千万条记录执行您问题中说明的那种处理是可行的。

  • Spark Streaming 在数据量方面的限制是多少?

我不知道,但你很难做到。有一些非常大的部署示例,例如在 ebay ("hundreds of metrics over an average of 30TB daily"). Also, see the FAQ 中,其中提到了一个由 8000 台机器组成的集群并处理 PB 的数据。

  • 什么时候应该将结果写入[某种存储]?

根据 Spark-Streaming 的 basic model,数据是以微批处理的。如果你的数据确实是一个流(即没有确定的结尾),那么最简单的做法就是存储每个 RDD 的处理结果(即 microbatch)。

如果您的数据不是流,例如你不时处理一堆静态文件,你可能应该考虑放弃流部分(例如,只使用 Spark 作为批处理器)。

由于您的问题提到 window 几个小时的大小,我想您可能需要考虑批处理选项。

  • 如何在不同时间处理相同的数据windows?

如果您使用的是 Spark-Streaming,您可以维护多个状态(例如使用 mapWithState)- 每次一个 window。

另一个想法(代码更简单,操作更复杂)- 您可以启动多个集群,每个集群都有自己的 window,从同一个流中读取。

如果您进行批处理,您可以 运行 在不同的时间多次执行相同的操作 windows,例如reduceByWindow 有多种 window 尺寸。