Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark “最好的方法是什么?”;“缓存”;在请求之间触发数据集?_Apache Spark - Fatal编程技术网

Apache spark “最好的方法是什么?”;“缓存”;在请求之间触发数据集?

Apache spark “最好的方法是什么?”;“缓存”;在请求之间触发数据集?,apache-spark,Apache Spark,我有一个Spark计划,开始在给定年份的数据集中创建法国网络(城市、地方当局…)。然后用于其他操作:本地会计、企业间搜索等 数据集的业务规则很难创建:许多过滤器,各种检查,我事先不知道请求它的调用方将如何使用它。但大多数时候,他要求提供2019年的数据集,因为他只需要“当今法国所有的城市” 我下面的程序成功返回2019年的结果。 下一个来电者还呼吁2019年的城市:Spark重新开始他之前所做的全部工作 这里的优化原则是什么 我应该在我的程序中存储我用于请求和构建的spark会话的同一级别,比如

我有一个
Spark
计划,开始在给定年份的数据集中创建法国网络(城市、地方当局…)。然后用于其他操作:本地会计、企业间搜索等

数据集的业务规则很难创建:许多过滤器,各种检查,我事先不知道请求它的调用方将如何使用它。但大多数时候,他要求提供2019年的数据集,因为他只需要“当今法国所有的城市”

我下面的程序成功返回2019年的结果。 下一个来电者还呼吁2019年的城市:
Spark
重新开始他之前所做的全部工作

这里的优化原则是什么

我应该在我的程序中存储我用于请求和构建的spark会话的同一级别,比如
Map
,其中键是年份,数据集是今年至少有一个调用方请求的数据集吗

假设一个spark shell或spark编译程序在同一个环境中运行 会话接收请求:

  • 使用IGNITE,或
  • 依赖于“跳过的阶段”效果(也使用DFs的.cache)
  • 例如,后者针对RDD,但DF具有以下基本特性:

    简单的例子,但您可以看到Spark shuffling意味着某些方面不需要再做了,但这取决于您的用例和最初读取数据的方式

    注意,Spark UI跳过了阶段,因此并不总是像人们想象的那么糟糕。在某些情况下,您的“缓存”是通过这种方式实现的

    对于需要不同处理的操作,则至少底层(中间)源需要.cache或.persist

    如果使用了新的spark submit:

  • 使用IGNITE,或
  • 重复使用检查点目录,尽管非常复杂,请参见, 虽然复杂,并且只有在预读的无序RDD上可能有多个操作时才真正适用,否则效果不会太好。或
  • 使用良好的初始查询并进行bucketBy保存和重新读取。看见 在分类时特别方便

  • 您必须将数据集保存到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