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

时间:2015-03-04 03:48:56

标签: java apache-spark hdfs

第一个问题,无论如何,在应用任何reduce函数之前,我是否可以急切地加载RDD?如果不是,我将不得不做虚拟减少功能,因为我试图在我的休息应用程序启动期间缓存RDD!

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

2 个答案:

答案 0 :(得分:1)

  1. Spark没有办法预热' RDD。即使您将RDD标记为使用cache()persist()函数进行缓存,它也只会在计算时缓存,并且根据惰性计算模型,计算本身仅在action将被执行时执行执行。您可能想要使用的最简单的操作是缓存整个RDD count()
  2. 只有在执行计算本身时,您的数据才会保留,如上所述。在JavaRDD或JavaSchemaRDD对象上调用cache()没有区别,只有在调用cache()persist()之后在该RDD之上执行操作后才会缓存它。正如我上面所说,填充缓存的最简单的操作是count(),因为它将遍历所有RDD并缓存所有分区(如果你有足够的内存)。像take()这样的东西只会缓存一些分区,reduce()会导致额外的计算,而这些计算在你的情况下是不需要的。
  3. 如果它没有回答您的问题,请提供代码示例

答案 1 :(得分:0)

//在启动期间

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

//在每个请求期间;每次调用有几个查询请求,每次火花从文件加载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”);