这是我的情景。 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
。
有什么可以优化的吗?
答案 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和分区的数量/大小,以便它不会溢出。