我是Spark的新手,如果这个问题太基础,请原谅我。 我有一个实时场景,数据不断被推送到队列,并且需要对这些数据进行分析。 Spark从队列中提取数据Analysis是多阶段的,RDD是从每个阶段的中间更新一遍又一遍地迭代,最后我们得到一些在RDD本身更新的映射。 分析需要每n分钟重复一次,它应该适用于RDD +新数据的先前最终状态。这些作业总是按顺序运行,下一个作业永远不会运行,直到上一个作业完成。
我总是可以将数据从运行发布到外部存储或缓存,然后在下一个周期再次填充RDD,但这会带来不必要的开销,并会对性能产生影响。
请为此方案建议最佳方法。缓存还是持久RDD是解决方案?我不确定缓存/持久性如何为Spark工作。它是本地的还是所有节点都可用。理想情况是每个节点保留其数据块时,对于下一次迭代,我们几乎没有处理延迟。
答案 0 :(得分:0)
您似乎正在使用普通的Spark项目,从队列中获取信息并进行更新。如果是这样,一个更好的方法可能是使用Spark流,通过window operations自动化这种迭代。 Spark流媒体还为您提供了一些我认为可能对您有用的操作,例如updateStateByKey。
在您的情况下,您可以定义从队列中提取的流,在窗口中执行某些操作并在完成时更新状态。
希望能帮到你!
好吧,保持简单...... 有两种主要方案可以使用Spark。一方面,您有批处理过程,它适用于RDD。一个例子可能是"我需要每天总结一下有多少人按类型购买商店"。这就是我所说的"普通Spark",核心Spark API。
另一方面,信息的性质以及您要访问此信息的方式是连续的。例如,"我希望实时显示有多少人,按类型,来到我的商店,以显示它作为衡量标准"。
Spark Streaming是核心Spark API的扩展,可实现实时数据流的可扩展,高吞吐量,容错流处理
你必须知道的第一件事是选择一个方法的方案。你需要实时吗?
坚持和缓存不会像你想象的那样工作。如您所知,Spark中有两种函数,transformation and actions。这些方法用于不止一次地执行相同的操作。与您的代码中的检查点一样。你应该阅读this。
您可以在将生成的RDD存储为HDFS(即)中的文件的执行之间共享信息,并在每次迭代开始时将其作为数据源加载。
希望它对你有所帮助。