我正在尝试实现以前在Spark中运行良好的Hadoop Map / Reduce作业。该程序的目的是:
我有1个列表
A = List(c1, a3, b3, Y)List(c1, a3, b3, Y)List(c2, b3, Y))
并且我想创建1个列表,如下所示:
B = List(List(c1, a3, b3),Y)(List(a3, b3),Y)(List(b3),Y)(List(c1, a3, b3),Y)(List(a3, b3),Y)(List(b3),Y)(List(c2, b3),Y)(List(b3),Y))
Spark应用程序的定义如下:
package Project
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext
import org.apache.spark.SparkConf
import shapeless.ops.tuple.ToArray
import org.apache.log4j.{Level, Logger}
object Test2 {
def lastdAndSelf[A, B](li: List[A], m_Class: String , f: (List[A] ,String ) => B) : List[B] =
{ if (li == Nil) Nil
else f(li , m_Class ) :: lastdAndSelf(li.tail ,m_Class, f)
}
def main(args: Array[String]) {
Logger.getLogger("org").setLevel(Level.ERROR)
val sc = new SparkContext()
val m_input = args(0)
val rawData = sc.textFile(m_input)
val lines = rawData.map(line => line.split(" ").distinct.toList)
val itemsets = lines.map(line => lastdAndSelf(line.init, line.last , ( x : List[String], y : String ) => (x,y)))
for (item <- itemsets.collect())
{
println("test " + item.mkString)
}
sc.stop
}
}
Spark似乎将所有内容保留在内存中,直到它爆炸为止
java.lang.OutOfMemoryError:超出了GC开销限制
我可能确实犯了一些基本的错误,但是我找不到任何指向如何从中提出建议的指针,我想知道如何避免这种情况。
由于我是Scala和Spark的专家,所以我不确定问题是来自其中一个还是另一个。我目前正在尝试在自己的笔记本电脑上运行该程序,它适用于元组数组的长度不是很长的输入。
我运行了以下命令:
spark-submit --class Project.Test2 --master spark: //192.169.1.222: 7077 --conf spark.network.timeout = 10000000 --executor-memory 9G --num-executors 7 --executor-cores 4 /home/lamlq/Downloads/PFP03.jar /home/lamlq/Downloads/data_test_full.txt /home/lamlq/Downloads/
并出现以下错误:
19/11/28 10:16:26 WARN Utils:您的主机名Master01解析为环回地址:127.0.1.1;而是使用192.169.1.222(在界面上ens33)19/11/28 10:16:26 WARN Utils:如果需要,请设置SPARK_LOCAL_IP绑定到另一个地址19/11/28 10:16:27 WARN NativeCodeLoader:无法为您的平台加载本地Hadoop库...正在使用内置Java类(如果适用)使用Spark的默认log4j资料:org / apache / spark / log4j-defaults.properties 19/11/28 10:20:02错误实用程序:线程task-result-getter-1中未捕获的异常java.lang.OutOfMemoryError:Java堆空间位于java.lang.reflect.Array.newInstance(Array.java:75)在java.io.ObjectInputStream.readArray(ObjectInputStream.java:1939)在java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1567)在java.io.ObjectInputStream.readObject(ObjectInputStream.java:431)在org.apache.spark.serializer.JavaDeserializationStream.readObject(JavaSerializer.scala:75)在org.apache.spark.serializer.JavaSerializerInstance.deserialize(JavaSerializer.scala:108)在org.apache.spark.scheduler.DirectTaskResult.value(TaskResult.scala:88)在org.apache.spark.scheduler.TaskResultGetter $$ anon $ 3 $$ anonfun $ run $ 1.apply $ mcV $ sp(TaskResultGetter.scala:94)
感谢弗拉迪斯拉夫·瓦尔斯拉夫人的支持。我运行了以下命令:
spark-submit --class Project.Test2 --master spark://192.169.1.222:7077 --conf spark.network.timeout = 10000000-执行器内存9G--num-executors 7 --executor-cores 4 /home/lamlq/Downloads/PFP03.jar /home/lamlq/Downloads/data_test_full.txt / home / lamlq / Downloads /
并出现以下错误:
19/11/28 10:16:26 WARN Utils:您的主机名Master01解析为环回地址:127.0.1.1;而是使用192.169.1.222(在界面上ens33)19/11/28 10:16:26 WARN Utils:如果需要,请设置SPARK_LOCAL_IP绑定到另一个地址19/11/28 10:16:27 WARN NativeCodeLoader:无法为您的平台加载本地Hadoop库...正在使用内置Java类(如果适用)使用Spark的默认log4j资料:org / apache / spark / log4j-defaults.properties 19/11/28 10:20:02错误实用程序:线程task-result-getter-1中未捕获的异常java.lang.OutOfMemoryError:Java堆空间位于java.lang.reflect.Array.newInstance(Array.java:75)在java.io.ObjectInputStream.readArray(ObjectInputStream.java:1939)在java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1567)在java.io.ObjectInputStream.readObject(ObjectInputStream.java:431)在org.apache.spark.serializer.JavaDeserializationStream.readObject(JavaSerializer.scala:75)在org.apache.spark.serializer.JavaSerializerInstance.deserialize(JavaSerializer.scala:108)在org.apache.spark.scheduler.DirectTaskResult.value(TaskResult.scala:88)在org.apache.spark.scheduler.TaskResultGetter $$ anon $ 3 $$ anonfun $ run $ 1.apply $ mcV $ sp(TaskResultGetter.scala:94)