加入Spark太慢了。有没有办法优化它?

时间:2015-06-29 02:21:00

标签: hadoop apache-spark

这是我的情景。 HDFS中有两个数据源。一个是具有20,000行的元素列表,而另一个是由具有相同元素类型的3,000,000,000行组成。我打算计算dataset2中的行数,其元素存在于dataset1中。

代码段如下:

val conf = new SparkConf().setAppName("test")
val sc = new SparkContext(conf)
val ds1Rdd = sc.textFile("/dataset_1").keyBy(line => line)
val ds2Rdd = sc.textFile("/dataset_2").keyBy(line => line)
println(ds1Rdd.join(ds2Rdd).count())

我可以看到活动阶段始终停留在Spark监视器网页的join进程中。

我的执行参数是--master yarn-cluster --num-executors 32 --driver-memory 8g --executor-memory 4g --executor-cores 4

有什么可以优化的吗?

2 个答案:

答案 0 :(得分:2)

我猜Map-Side加入Spark(http://dmtolpeko.com/2015/02/20/map-side-join-in-spark/)将解决您的问题。您可以广播dataset1然后执行Map-Side Join。

答案 1 :(得分:1)

您可以将小文件作为广播发送给所有工作人员,然后使用过滤器。

有什么症状?它是否在洗牌中溢出?您可以调整memoryFractions,executor-cores和分区的数量/大小,以便它不会溢出。