Spark的奴隶效率低

时间:2014-11-18 17:38:13

标签: apache-spark

我是一个火花新手,我需要建议......

我在独立集群上测试Spark的功能,该集群包含一台主机(8个CPU,16GB RAM)(启动start-master.sh和启动应用程序)和两个从机(两个 - 8个CPU,16GB RAM) ),从spark-class org.apache.spark.deploy.worker.Worker spark://IP:PORT开始,应该用于分布式计算。 我成功运行集群 - 从服务器连接到主服务器和应用程序正常工作。

问题在于,与在一台本地计算机上运行应用程序相比,我没有看到任何性能效率......如前所述 - 主计算机的所有CPU都已满载,并且从属计算机的CPU几乎处于非活动状态。     也许有人可以说出典型情况 - 为什么会发生这种情况?     我理解,我提供的关于我的问题和配置的信息很少,但我不知道从哪里开始,在这种情况下真正重要的是什么。

[编辑] 示例代码:

SparkConf conf = new SparkConf().setAppName("myapplication").setMaster("mastermachine:7077").setJars(new String[] {"target/myapplication-0.0.1-SNAPSHOT-driver.jar"}).set("spark.home","path_to_spark");
    JavaSparkContext sc = new JavaSparkContext(conf);

...

// "Document" - is my data structure that keeps text from file

List<Document> doclist = fileNameList.stream().parallel().flatMap(docName -> Arrays.asList(getDoc(docName)).stream()).collect(Collectors.toList());

JavaRDD<Document> rdd = sc.parallelize(doclist);

Set<String> words = rdd.collect().stream().parallel().flatMap(doc -> doc.getWords().stream()).collect(Collectors.toSet());

sc.stop();

即。我在这里从文本文件中获取字符串并在Set中收集它们。

1 个答案:

答案 0 :(得分:2)

鉴于提供的代码,很明显您没有看到任何并行分布式处理,因为基本上没有使用Spark。

在Spark lingo中,

collect是一个将分布式RDD数据检索给驱动程序的操作,因此在执行此操作时:

// parallelize the document list to distribute over the Spark cluster
JavaRDD<Document> rdd = sc.parallelize(doclist);
// get all documents back to the driver
List<Document> docs = rdd.collect()

发出collect后,上一步中分发的集合将返回给驱动程序。所有进一步的操作都发生在驱动程序上,您将看不到任何分布式计算。

该代码的正确Spark版本为:

val docList = ???
val rdd = sc.parallelize(docList)
val wordsRdd = rdd.flatMap(doc => doc.getWords)

在此示例中,flatMap函数将作为任务分发到群集上。