繁体   English   中英

我想在spark scala中使用rdd连接两个数据集并将结果保存到文件中。 它在所有节点中执行,但最后一个任务永远在运行

[英]i want to join two datasets with rdd in spark scala and save results to file. It was executing in all nodes but the last task running forever

这是我的代码::

val trg = sqlContext.read.format("com.databricks.spark.csv").options(Map("path"-> {path+"/test/phonesort.csv"}, "header" -> "true")).load().toDF().repartition(1000) //10 million data

val src = sqlContext.read.format("com.databricks.spark.csv").options(Map("path"-> {path+"/test/bajaj_src.csv"}, "header" -> "true")).load().toDF().sort("PHONE1").repartition(10) //1,00,000 data

val srcrdd = src.rdd.map(row => { (row(1),row)}).persist()
val brd = sc.broadcast(srcrdd) //BROADCASTING SAMLL DATASET
 val trgrdd = trg.rdd.map ( row => {
   (row(1),row)
})
val res = trgrdd.join(brd.value) map{ case (x,(y,z)) => y.mkString("\"","\",\"","\"")+","+z.mkString("\"","\",\"" , "\"") }
 res.saveAsTextFile(path+"/test/1.csv")

问题是当我试图在3节点集群中执行最后一个进入无限循环的任务时(永远没有完成任务)。 在这里,我分享了我的工作运行状态的截图,标记为:在这里请求某人的帮助..谢谢

工作截图

舞台细节的截图

当您的密钥分布不均匀时会发生这种情况。

加入调用一个cogroup,它将具有相同键的所有数据放入同一个分区/任务中。

在这种情况下,您有44259072条记录具有相同的密钥,因此它们都由单个线程中的单个CPU处理。

查看您的数据以查找此值并确定您是否确实要加入该值。 我希望你不会因为每一个案例我都看到它实际上是一个虚拟值。 如果你这样做,我不知道如何继续。 你可以获得更多的记录,因为在同一个键上加入多个值可以有效地进行笛卡尔连接。

编辑:如果我了解您正在播放RDD,请进一步阅读您的代码? 你不应该这样做。 您应该执行以下操作:

val smallRDD: RDD[(K, V)] = ???
val largeRDD: RDD[(K, V)] = ???
val bcRDD: Broadcast[Map[K, V]] = sc.broadcast(smallRDD.collectAsMap())
val joined = largeRDD.map{case (k, v) => (k, (v, bcRDD(k)) }

如果以上内容不适用并且我正在读错你的代码,那么数据可能是均匀分布的,但它们最终会出现在相同的分区上。 当由分区数量修改的键的哈希码等于相同值时,可能会发生这种情况。 在这种情况下,您将需要考虑编写自己的分区程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM