Apache spark “最好的方法是什么?”;“缓存”;在请求之间触发数据集?
我有一个Apache spark “最好的方法是什么?”;“缓存”;在请求之间触发数据集?,apache-spark,Apache Spark,我有一个Spark计划,开始在给定年份的数据集中创建法国网络(城市、地方当局…)。然后用于其他操作:本地会计、企业间搜索等 数据集的业务规则很难创建:许多过滤器,各种检查,我事先不知道请求它的调用方将如何使用它。但大多数时候,他要求提供2019年的数据集,因为他只需要“当今法国所有的城市” 我下面的程序成功返回2019年的结果。 下一个来电者还呼吁2019年的城市:Spark重新开始他之前所做的全部工作 这里的优化原则是什么 我应该在我的程序中存储我用于请求和构建的spark会话的同一级别,比如
Spark
计划,开始在给定年份的数据集中创建法国网络(城市、地方当局…)。然后用于其他操作:本地会计、企业间搜索等
数据集的业务规则很难创建:许多过滤器,各种检查,我事先不知道请求它的调用方将如何使用它。但大多数时候,他要求提供2019年的数据集,因为他只需要“当今法国所有的城市”
我下面的程序成功返回2019年的结果。
下一个来电者还呼吁2019年的城市:Spark
重新开始他之前所做的全部工作
这里的优化原则是什么
我应该在我的程序中存储我用于请求和构建的spark会话的同一级别,比如Map
,其中键是年份,数据集是今年至少有一个调用方请求的数据集吗
假设一个spark shell或spark编译程序在同一个环境中运行
会话接收请求:
您必须将数据集保存到hdfs或正在使用的任何其他存储中,并在需要时加载它,而不是再次重新计算整个数据集。这更多的是关于如何设计应用程序。也许这些数据集应该在最近几年进行预计算,作为数据准备的一部分,并且随时可以使用。这是假设下一次运行时它会作为新作业触发,例如:每天运行一次的作业Redis是与spark一起使用的最佳选择。将结果存储到Redis中,对于下一个请求,只需从Redis获取即可。IGNITE?说得好。但在某些情况下,你会被跳过阶段。看见如果在shell或spark-submit中运行,这会有所缓解。您可以每天手动运行一次spark程序(此数据似乎不会每天更改),或者每天运行两次,最后写入sql db。有一个单独的Java web项目,如果总数据不超过2-3 GB,则在redis或RAM中读取和缓存数据(因为RAM将是最快的—静态哈希映射或其他静态列表)。并从数据库中每隔x小时刷新一次数据。还有一个API可以知道数据的修改日期,这样使用您的API的应用程序就可以知道后端进程是否按照预期的频率运行。下一个请求的结果将不再是
数据集。当来电者询问2019年法国存在的某种类型的企业时,一个潜在的来电会准备我的城市数据集,这些城市与地方当局相连,等等。从“缓存”返回的内容必须是数据集,而不是响应,因为调用方可以是Spark
本身。这里的结果我指的是响应/数据集,即您希望响应的内容。我明白了。将数据集的结果存储在平面表上,当再次请求时:从此表重新构建数据集。实际上,就像执行第二级的persist()
。但是,是的。这可能有用。一个简单的ds.write().parquet(store)编码>单向,数据集ds=session.read().parquet(商店)
另一种方法是成功存储/加载以前的数据集,前提是我为引用调用所用参数的文件选择存储名称:cities\u 2019
。谢谢
val d = sc.parallelize(0 until 100000).map(i => (i%10000, i)).cache // or not cached, does not matter for RDD, for DF, DS it does
val c=d.rightOuterJoin(d.reduceByKey(_+_))
val f=d.leftOuterJoin(d.reduceByKey(_+_))
c.count
c.collect // skipped, shuffled
f.count
f.collect // skipped, shuffled
val g = f.filter(e => e._1%2==0)
val h = f.filter(e => e._1==657)
val j = f.filter(e => e._1==1657)
g.collect
h.collect
j.collect // these skipped as well