当在localhostmaster上执行时,spark-earce加载和缓存RDD



第一个问题是,在应用任何reduce函数之前,我是否可以急切地加载RDD?如果没有,我将不得不做伪reduce函数,因为我正在尝试在我的rest应用程序启动期间缓存RDD!

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

  1. Spark无法对RDD进行"预热"。即使使用cache()persist()函数将RDD标记为缓存,它也将仅在计算时缓存,并且根据延迟计算模型,计算本身将仅在执行action时执行。您可能想要使用的缓存整个RDD的最简单操作是count()
  2. 只有在执行计算本身时,您的数据才会持久化,正如我上面所描述的那样。无论您是在JavaRDD上调用cache()还是在JavaSchemaRDD对象上调用,都没有区别,只有在调用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”);

最新更新