在数据量方面引发流式传输的限制是什么?

时间:2016-02-29 02:51:04

标签: apache-spark spark-streaming datastax-enterprise

我有数千万行数据。是否可以使用火花流在一周或一天内分析所有这些?根据数据量来限制火花流的限制是什么?我不确定上限是什么以及何时将它们放入我的数据库,因为Stream可能无法再处理它们了。我还有不同的时间窗口1,3,6小时等,我使用窗口操作来分隔数据。

请在下面找到我的代码:

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()

1 个答案:

答案 0 :(得分:1)

一次一个:

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

通常,是的 - Spark允许您在多台计算机上进行扩展,因此原则上您应该能够在相对较短的时间内启动大型集群并处理大量数据(假设我们正在谈论数小时或数天,而不是秒或更少,由于开销可能会有问题。

具体来说,在合理的时间内(即不使用极大的群集),在数千万条记录中执行您的问题中所示的处理似乎是可行的。

  • 根据数据量,Spark Streaming的限制是什么?

我不知道,但你很难接受它。有大量部署的例子,例如:在ebay中(“每天平均30TB的数百个指标”)。另请参阅FAQ,其中提到了8000台计算机的集群并处理了数据PB。

  • 何时应将结果写入[某种存储空间]?

根据Spark-Streaming的basic model,数据以微批处理。如果您的数据确实是一个流(即没有明确的结束),那么最简单的方法是存储每个RDD的处理结果(即微量分片)。

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

由于您的问题提到了几个小时的窗口大小,我怀疑您可能需要考虑批处理选项。

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

如果您正在使用Spark-Streaming,则可以维护多个状态(例如,使用mapWithState) - 每个时间窗口一个。

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

如果您是批处理,则可以使用不同的时间窗口多次运行相同的操作,例如reduceByWindow有多个窗口大小。