Java Spark cluster在较大的输入上出现故障,适用于小型设备

Java Spark cluster在较大的输入上出现故障,适用于小型设备,java,cluster-computing,apache-spark,real-time-data,Java,Cluster Computing,Apache Spark,Real Time Data,我在玩Spark。它是来自网站的默认预构建发行版(0.7.0),具有默认配置、群集模式、一个工作程序(我的本地主机)。我看了安装文档,一切都很好 我有一个CSV文件(各种大小,1000-100万行)。如果我用小的输入文件(例如1000行)运行我的应用程序,一切正常,程序在几秒钟内完成,并产生预期的输出。 但是当我提供一个更大的文件(10万行,或100万行)时,执行失败。我试图挖掘日志,但没有多大帮助(它将整个过程重复9-10次,然后退出失败。此外,还有一些与从某个空源获取失败相关的错误) 第一个

我在玩Spark。它是来自网站的默认预构建发行版(0.7.0),具有默认配置、群集模式、一个工作程序(我的本地主机)。我看了安装文档,一切都很好

我有一个CSV文件(各种大小,1000-100万行)。如果我用小的输入文件(例如1000行)运行我的应用程序,一切正常,程序在几秒钟内完成,并产生预期的输出。 但是当我提供一个更大的文件(10万行,或100万行)时,执行失败。我试图挖掘日志,但没有多大帮助(它将整个过程重复9-10次,然后退出失败。此外,还有一些与从某个空源获取失败相关的错误)

第一个JavaRDD返回的结果Iterable对我来说是可疑的。如果我返回一个硬编码的单例列表(比如res.add(“something”);return res;),即使有一百万行,一切都很好。但是,如果我添加我想要的所有键(28个长度为6-20个字符的字符串),这个过程只有在输入量大的情况下才会失败。 问题是,我需要所有这些密钥,这是实际的业务逻辑

我使用的是Linux amd64,四核,8GB内存。最新的OracleJava7JDK。Spark配置:

SPARK_WORKER_MEMORY=4g
SPARK_MEM=3g
SPARK_CLASSPATH=$SPARK_CLASSPATH:/my/super/application.jar
我必须提到,当我开始这个项目时,它说:

13/05/30 11:41:52 WARN spark.Utils: Your hostname, *** resolves to a loopback address: 127.0.1.1; using 192.168.1.157 instead (on interface eth1)
13/05/30 11:41:52 WARN spark.Utils: Set SPARK_LOCAL_IP if you need to bind to another address
这是我的节目。它基于JavaWordCount示例,修改最少

public final class JavaWordCount
{
    public static void main(final String[] args) throws Exception
    {
        final JavaSparkContext ctx = new JavaSparkContext(args[0], "JavaWordCount",
            System.getenv("SPARK_HOME"), new String[] {"....jar" });

        final JavaRDD<String> words = ctx.textFile(args[1], 1).flatMap(new FlatMapFunction<String, String>() {

            @Override
            public Iterable<String> call(final String s)
            {
                // parsing "s" as the line, computation, building res (it's a List<String>)
                return res;
            }
        });

        final JavaPairRDD<String, Integer> ones = words.map(new PairFunction<String, String, Integer>() {

            @Override
            public Tuple2<String, Integer> call(final String s)
            {
                return new Tuple2<String, Integer>(s, 1);
            }
        });
        final JavaPairRDD<String, Integer> counts = ones.reduceByKey(new Function2<Integer, Integer, Integer>() {

            @Override
            public Integer call(final Integer i1, final Integer i2)
            {
                return i1 + i2;
            }
        });

        counts.collect();

        for (Tuple2<?, ?> tuple : counts.collect()) {
            System.out.println(tuple._1 + ": " + tuple._2);
        }
    }
}
公共最终类JavaWordCount
{
公共静态void main(最终字符串[]args)引发异常
{
final JavaSparkContext ctx=新的JavaSparkContext(args[0],“JavaWordCount”,
getenv(“SPARK_HOME”),新字符串[]{“…jar”});
final JavaRDD words=ctx.textFile(args[1],1).flatMap(新的flatMap函数(){
@凌驾
公共Iterable调用(最终字符串s)
{
//解析“s”作为行、计算、构建res(它是一个列表)
返回res;
}
});
final javapairdd one=words.map(新的PairFunction(){
@凌驾
公共元组2调用(最终字符串s)
{
返回新的Tuple2(s,1);
}
});
最终JavaPairRDD计数=1.reduceByKey(新函数2(){
@凌驾
公共整数调用(最终整数i1、最终整数i2)
{
返回i1+i2;
}
});
counts.collect();
for(Tuple2 tuple:counts.collect()){
System.out.println(tuple.\u 1+“:”+tuple.\u 2);
}
}
}

我通过将spark.mesos.rough属性设置为true来修复它。更多信息

更新:我和Spark玩了几个小时。这些设置对我有点帮助,但在一台机器上处理1000万行文字似乎几乎是不可能的

System.setProperty("spark.serializer", "spark.KryoSerializer"); // kryo is much faster
System.setProperty("spark.kryoserializer.buffer.mb", "256"); // I serialize bigger objects
System.setProperty("spark.mesos.coarse", "true"); // link provided
System.setProperty("spark.akka.frameSize", "500"); // workers should be able to send bigger messages
System.setProperty("spark.akka.askTimeout", "30"); // high CPU/IO load

注意:增加帧大小似乎特别有助于防止:
org.apache.spark.sparkeexception:与MapOutputTracker通信时出错

在较新的spark版本中,应使用:

conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")

根据

在更改Spark系统属性之前,您的作业失败的原因是什么?在Spark用户组中,我得到的答案是.collect()将触发每个(临时)RDD的收集。这才是真正的问题。这里有解决方案的线程:我搜索了很多年试图找到我的问题的解决方案,这个问题的答案解决了我的问题,所以请编辑你的问题,包括“org.apache.spark.SparkException:与MapOutputRacker通信时出错”在你的问题中,为了让其他人在将来更容易使用谷歌搜索,
spark.akka.frameSize
也解决了我的
org.apache.spark.sparkeException:与MapOutputTracker通信时出错的问题。System.setProperty()是否也在spark shell中工作?我无法设置帧大小