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 有什么区别?
- Spark 无法'pre-warm' RDD。即使您使用
cache()
或 persist()
函数将 RDD 标记为缓存,它也只会在计算时被缓存,并且根据惰性计算模型,计算本身只会在 action
被执行时执行执行。您可能想要使用的缓存整个 RDD 的最简单操作是 count()
- 您的数据只有在执行计算时才会保留,正如我上面所描述的那样。无论你在 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”);
第一个问题,无论如何我可以在应用任何reduce函数之前急切地加载RDD吗?如果不是,我将不得不执行虚拟 reduce 函数,因为我在我的 rest 应用程序启动期间尝试缓存 RDD!
其次,即使在 运行 reduce 函数之后,我也没有看到任何缓存发生。我正在使用 spark 和 spark sql。我正在使用 sparkcontext 读取 hdfs 目录(part-r-*)。在调用 registerAsTable 之后,我尝试在结果 JavaSchemaRDD 上调用 cahce()。但是,如果我尝试在加载 JavaRDD 后调用 cache() ,那么缓存似乎会起作用。在 JavaRDD 上调用 cache() 与 JavaSchemaRDD 有什么区别?
- Spark 无法'pre-warm' RDD。即使您使用
cache()
或persist()
函数将 RDD 标记为缓存,它也只会在计算时被缓存,并且根据惰性计算模型,计算本身只会在action
被执行时执行执行。您可能想要使用的缓存整个 RDD 的最简单操作是count()
- 您的数据只有在执行计算时才会保留,正如我上面所描述的那样。无论你在 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”);