我正在Spark群集上分发一些下载任务。输入来自一个源,它不能总是与Spark的常规方法并行,如parallelize
或textFile
等等。相反,我有一个服务为我提供了一堆使用parallelize
分发的下载任务(URL +封装的逻辑来读取和解密它)。控制Spark中任务的分配
当有几千个任务时,Spark将任务平均分配给所有从服务器,从而实现最高水平的并行性。但是,当有几百个任务时,Spark认为数据集很小,可以在几个从站上计算,以减少通信时间并增加数据局部性。但是在我的情况中,这是错误的,每个任务都可以生成数千个JSON记录,并且我希望下载能够通过与群集中一样多的机器来执行。
我的那一刻两个想法:
- 使用
repartition
到分区的数量设置为使用repartition
设置分区的号码下载任务数的核心 - 数量
我不喜欢第一个,因为我必须传递一段代码中的核心数量,这些代码当前并不需要知道它有多少资源。我一次只运行一个Spark作业,但将来可能会有更多这样的作业,所以实际上我必须将核心数量除以要在群集上运行的并行作业数量。我不喜欢第二个,因为当我只有40个节点时,划分成数千个分区似乎很尴尬。
有没有办法告诉Spark尽可能分配RDD的元素?如果不是,两种选择中的哪一种更可取?
你说你不能使用'parallelize'并且你也使用'parallelize'。我理解正确吗? :) –
啊,我想我明白了!你的意思是你没有预先提供的数据,只有网址。所以你不能通过'parallelize'分发数据,而是使用'parallelize'来分发这些URL。不介意我... –
@DanielDarabos你说得对了 – Dici