使用apache Ignite分享sparkRDD

时间:2017-06-15 07:36:50

标签: scala hadoop apache-spark ignite

我实施的是:

 val sparkConf = new SparkConf().setAppName(“SharedRDD”).setMaster(“local”)
 val sc = SparkContext.getOrCreate(sparkConf)
 val sparkRDD = sc.wholeTextFiles("sample.csv", 10)

此RDD由IgniteContext缓存

val igniteContext = new IgniteContext(sc, “example-shared-rdd.xml”, false)

val sharedIgniteRDD = igniteContext.fromCache[String, String](“cachedIgniteRDD”)
if (sharedIgniteRDD.isEmpty())
sharedIgniteRDD.savePairs(sparkRDD)

现在,如果任何spark作业需要访问此RDD,则无需创建新的RDD而是从点火缓存中检索它。

val RDDfromCache = igniteContext.fromCache[String, String](“CachedIgniteRDD”)

输入文件的示例数据

25/07/13,11599,CLOSED
25/07/13,256,PENDING_PAYMENT
25/07/13,12111,COMPLETE
25/07/13,8827,CLOSED
25/07/13,11318,COMPLETE
25/07/13,7130,COMPLETE
25/07/13,4530,COMPLETE
25/07/13,2911,PROCESSING
25/07/13,5657,PENDING_PAYMENT
25/07/13,5648,PENDING_PAYMENT

我需要调用groupByKey()API来对该输入文件的status列进行分组。

您的帮助将不胜感激。

谢谢

2 个答案:

答案 0 :(得分:1)

使用cachepersist应避免再次重新创建rdd。您可以选择保存rdds in-memorymemory-diskserializeddeserialized等。IgniteContext是上述解决方案的替代方案。

groupByKeyrdd IgniteContext的{​​{1}}有点棘手,因为您已使用wholeTextFile来阅读文本文件。 WholeTextFile将生成Tuple2 rdd("文本文件的路径","文本行 s")

阅读已保存的rdd fromCache IgniteContext

val RDDfromCache = igniteContext.fromCache[String, String](“CachedIgniteRDD”)

您可以对groupByKey

执行以下操作
val groupedRDD = RDDfromCache.flatMap(x => x._2.split("\n")).map(array => (array.split(",")(2), array)).groupByKey().foreach(println)

输出

(CLOSED,CompactBuffer(25/07/13,11599,CLOSED, 25/07/13,8827,CLOSED))
(PENDING_PAYMENT,CompactBuffer(25/07/13,256,PENDING_PAYMENT, 25/07/13,5657,PENDING_PAYMENT, 25/07/13,5648,PENDING_PAYMENT))
............
..........
..........

答案 1 :(得分:0)

wholeTextFiles将整个文件放入一个条目中,因此将它保存在Ignite中并没有多大意义。您基本上会有一个分布式缓存,其中包含一个大条目。这并没有提供任何好处。

您应首先拆分文件并将每行保存为单独的元组。然后,您可以将此数据保存在Ignite中,并使用RDD API进行处理。