Scala 如何对大型数据集使用COGROUP
我有两个Scala 如何对大型数据集使用COGROUP,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我有两个rdd即val-tab\u a:rdd[(String,String)]和val-tab\u b:rdd[(String,String)]我使用cogroup来处理以下数据集: val tab_c = tab_a.cogroup(tab_b).collect.toArray val updated = tab_c.map { x => { //somecode } } 我正在为map函数使用tab\u ccogroup值,它对小数据集很好,但在大数据集的情况下,它会抛
rdd
即val-tab\u a:rdd[(String,String)]
和val-tab\u b:rdd[(String,String)]
我使用cogroup
来处理以下数据集:
val tab_c = tab_a.cogroup(tab_b).collect.toArray
val updated = tab_c.map { x =>
{
//somecode
}
}
我正在为map函数使用tab\u c
cogroup值,它对小数据集很好,但在大数据集的情况下,它会抛出内存不足异常
我曾尝试将最终值转换为RDD,但没有出现相同的错误
val newcos = spark.sparkContext.parallelize(tab_c)
1.如何对大型数据集使用Cogroup
2.我们是否可以保留共组值
代码
代码更新:
val tab_c = tab_a.cogroup(tab_b).filter(x => x._2._1 =!= x => x._2._2)
// tab_c = {1,Compactbuffer(1,john,US),Compactbuffer(1,john,UK)}
{2,Compactbuffer(2,john,US),Compactbuffer(2,johnson,UK)}..
错误:
ERROR LiveListenerBus: SparkListenerBus has already stopped! Dropping event SparkListenerTaskEnd(4,3,ResultTask,FetchFailed(null,0,-1,27,org.apache.spark.shuffle.MetadataFetchFailedException: Missing an output location for shuffle 0
at org.apache.spark.MapOutputTracker$$anonfun$org$apache$spark$MapOutputTracker$$convertMapStatuses$2.apply(MapOutputTracker.scala:697)
at org.apache.spark.MapOutputTracker$$anonfun$org$apache$spark$MapOutputTracker$$convertMapStatuses$2.apply(MapOutputTracker.scala:693)
ERROR YarnScheduler: Lost executor 8 on datanode1: Container killed by YARN for exceeding memory limits. 1.0 GB of 1020 MB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.
谢谢你TL;DR不
收集
为了安全地运行此代码,在没有其他假设的情况下(工作节点的平均需求可能会大大减少),每个节点(驱动程序和每个执行器)所需的内存将大大超过所有数据的总内存需求
如果要在Spark之外运行它,则只需要一个节点。因此,Spark在这里没有任何好处
但是,如果您跳过collect.toArray,并对数据分布做一些假设,您可能会运行得很好。TL;DR不
收集
为了安全地运行此代码,在没有其他假设的情况下(工作节点的平均需求可能会大大减少),每个节点(驱动程序和每个执行器)所需的内存将大大超过所有数据的总内存需求
如果要在Spark之外运行它,则只需要一个节点。因此,Spark在这里没有任何好处
但是,如果您跳过collect.toArray
并对数据分发进行一些假设,您可能会运行得很好。当您使用collect()
时,您基本上是在告诉spark将所有生成的数据移回主节点,这很容易产生瓶颈。此时,您不再使用Spark,而只是一台机器中的普通阵列
要触发计算,只需使用在每个节点上都需要数据的东西,这就是执行器位于分布式文件系统之上的原因。例如saveAsTextFile()
请记住,这里的整个目标(即,如果您有大数据)是将代码移动到您的数据并在那里进行计算,而不是将所有数据带到计算中。当您使用collect()
时,您基本上是在告诉spark将所有结果数据移回主节点,这很容易产生瓶颈。此时,您不再使用Spark,而只是一台机器中的普通阵列
要触发计算,只需使用在每个节点上都需要数据的东西,这就是执行器位于分布式文件系统之上的原因。例如saveAsTextFile()
请记住,这里的整个目标(即,如果您有大数据)是将代码移动到您的数据并在那里进行计算,而不是将所有数据都带到计算中。但是我们需要一个操作来开始执行,是否有任何方法可以跳过
collect()
method并继续使用map函数?@Vignesh任何操作都可以触发spark作业,请尝试take(1)或takeSample(false,1)是的,但问题是来自cogroup的所有数据都会命中驱动程序节点,但我们需要一个操作来开始执行,是否有任何方法可以跳过collect()
方法并继续使用映射函数?@Vignesh任何操作都可以触发spark作业,尝试take(1)或takeSample(false,1)是,但问题是cogroup中的所有数据都会命中驱动程序节点树,但即使将函数从collect()
更改为filter()
抛出错误YarnScheduler:datanode1上的执行器8丢失:容器因超出内存限制而被纱线杀死。使用了1.0 GB的1020 MB物理内存。考虑提升火花。纱线。执行器。内存开销< /代码>。即使没有火花,当你拥有的数据多于内存时,情况总是如此。如果数据太倾斜(例如,在相同键下的很多),或者尝试考虑增加可用内存,那么尝试将总大小减小到调用链上的操作(如过滤器、连接或聚合)。同意,但即使将函数从collect()
更改为filter()
后仍会抛出Error YarnScheduler:datanode1上丢失的执行器8:容器因超出内存限制而被纱线杀死。使用了1.0 GB的1020 MB物理内存。考虑提升火花。纱线。执行器。内存开销< /代码>。即使没有火花,当你拥有的数据多于内存时,情况总是如此。如果数据太倾斜(例如,在相同键下的很多),或者尝试考虑增加可用内存,那么尝试将总大小减小到调用链上的操作(如过滤器、连接或聚合)。
ERROR LiveListenerBus: SparkListenerBus has already stopped! Dropping event SparkListenerTaskEnd(4,3,ResultTask,FetchFailed(null,0,-1,27,org.apache.spark.shuffle.MetadataFetchFailedException: Missing an output location for shuffle 0
at org.apache.spark.MapOutputTracker$$anonfun$org$apache$spark$MapOutputTracker$$convertMapStatuses$2.apply(MapOutputTracker.scala:697)
at org.apache.spark.MapOutputTracker$$anonfun$org$apache$spark$MapOutputTracker$$convertMapStatuses$2.apply(MapOutputTracker.scala:693)
ERROR YarnScheduler: Lost executor 8 on datanode1: Container killed by YARN for exceeding memory limits. 1.0 GB of 1020 MB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.