加入两个大型rdds总是最终溢出

时间:2015-09-22 17:46:31

标签: scala join apache-spark rdd

我有两个rdds加入他们的共同键值。

val emp = sc.textFile("text1.txt").map(line => (line.split("\t")(5),line.split("\t")(0))).distinct() // 400 million // 9 GB
val emp_new = sc.textFile("text2.txt").map(line => (line.split("\t")(3),line.split("\t")(1))).distinct() // 4 million   // 110 KB

MY SPARK CONFIGURATION:

首先我设置了我的intellij:-Xmx64G

val conf = new SparkConf().setAppName("abdulhay").setMaster("local[*]").set("spark.shuffle.spill", "true")
      .set("spark.shuffle.memoryFraction", "0.6").set("spark.storage.memoryFraction", "0.4")
      .set("spark.executor.memory","40g")
      .set("spark.driver.memory","40g")

val sc = new SparkContext(conf)

我的电脑:

128GB RAM & 24 CORES

到目前为止,我尝试了两种不同的选择:

FIRST:

val partitioner = new HashPartitioner(500)
val empp = emp.partitionBy(partitioner)
val emp_neww = emp_new.partitionBy(partitioner)

var joinRDD = empp.join(emp_neww);

val kkk = joinRDD.map(line => (line._2,1)).reduceByKey((a, b) => a + b)

kkk.foreach(println)

在这种方法中,我尝试实现此处建议的内容:How can I efficiently join a large rdd to a very large rdd in spark?

然而,在我的UI上,spark仍然将rdds分区为默认值。它将emp分为287,另一个分为4.并且一段时间火花开始溢出并持续数小时。

第二

val emp_newBC = sc.broadcast(emp_new.groupByKey.collectAsMap)

val joined = emp.mapPartitions(iter => for {
      (k, v1) <- iter
      v2 <- emp_newBC.value.getOrElse(k, Iterable())
    } yield (s"$v1-$v2", 1)).repartition(sc.defaultParallelism * 500)

val olsun = joined.reduceByKey((a,b) => a+b)

    olsun.foreach(println)

在这种情况下,我尝试过广播变量,因为emp_new大约为100 KB。然而,经过一段时间火花开始溢出持续永久。此外,我不确定我是否正在申请重新分配?最后,我还尝试将分区数从500增加到5000,但它没有用完。

那我该怎么办呢?或者使用这样的计算机功能是否毫无价值?

提前致谢。

0 个答案:

没有答案