我是一个火花新手,我需要建议......
我在独立集群上测试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中收集它们。
答案 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
函数将作为任务分发到群集上。