spark - 在 localhost master 上执行时急切加载和缓存 RDD

spark - eager loading and caching RDD while executing on localhost master

第一个问题,无论如何我可以在应用任何reduce函数之前急切地加载RDD吗?如果不是,我将不得不执行虚拟 reduce 函数,因为我在我的 rest 应用程序启动期间尝试缓存 RDD!

其次,即使在 运行 reduce 函数之后,我也没有看到任何缓存发生。我正在使用 spark 和 spark sql。我正在使用 sparkcontext 读取 hdfs 目录(part-r-*)。在调用 registerAsTable 之后,我尝试在结果 JavaSchemaRDD 上调用 cahce()。但是,如果我尝试在加载 JavaRDD 后调用 cache() ,那么缓存似乎会起作用。在 JavaRDD 上调用 cache() 与 JavaSchemaRDD 有什么区别?

  1. Spark 无法'pre-warm' RDD。即使您使用 cache()persist() 函数将 RDD 标记为缓存,它也只会在计算时被缓存,并且根据惰性计算模型,计算本身只会在 action 被执行时执行执行。您可能想要使用的缓存整个 RDD 的最简单操作是 count()
  2. 您的数据只有在执行计算时才会保留,正如我上面所描述的那样。无论你在 JavaRDD 还是 JavaSchemaRDD 对象上调用 cache() 都没有区别,它只会在你调用 cache()persist() 之后在此 RDD 之上执行操作后才会被缓存。正如我上面所说,填充缓存的最简单操作是 count(),因为它将遍历所有 RDD 并缓存所有分区(如果您有足够的内存)。 take() 之类的东西只会缓存部分分区,reduce() 会导致在您的情况下不需要的额外计算。

如果它没有回答您的问题,请提供代码示例

//启动期间

JavaSchemaRDD schemaRDD0 = sqlContext.applySchema(ObjAJavaRdd, ObjA.class); schemaRDD0.registerAsTable(“tablename”); schemaRDD0.cache()

//在每个请求期间;每次调用都有多个查询请求,spark 每次都从文件中加载 RDD,而不是第一次缓存它

JavaSchemaRDD schemaRDD1 = sqlContext.sql(queryString); JavaPairRDD<String, double[]> pairRDD = schemaRDD1.mapToPair(row -> transform(row)); JavaPairRDD<String, double[]> pairReducedRDD = pairRDD.reduceByKey((a,b) -> reduceterms(a, b));

如果我在启动期间执行以下操作,它会按预期进行缓存
ObjAJavaRdd.cache() JavaSchemaRDD schemaRDD0 = sqlContext.applySchema(ObjAJavaRdd, ObjA.class); schemaRDD0.registerAsTable(“tablename”);