我有两个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,但它没有用完。
那我该怎么办呢?或者使用这样的计算机功能是否毫无价值?
提前致谢。