Python Spark中的RDD以什么顺序处理数据?

Python Spark中的RDD以什么顺序处理数据?,python,multithreading,apache-spark,parallel-processing,pyspark,Python,Multithreading,Apache Spark,Parallel Processing,Pyspark,上下文 Spark提供RDD,映射函数可用于延迟设置并行处理的操作。可以使用指定的分区参数创建RDD,该参数确定每个RDD要创建多少个分区,最好该参数等于系统的数量(例如,您有12个文件要处理,创建一个带有3个分区的RDD,该RDD将4个系统的数据分成4个存储桶,所有文件在每个系统中同时处理)。据我所知,这些分区控制进入每个系统进行处理的数据部分 问题 我需要微调和控制每个系统同时运行多少个函数。如果两个或更多函数同时在同一GPU上运行,系统将崩溃 问题 如果一个RDD没有被均匀地分割(如上面的

上下文
Spark提供RDD,映射函数可用于延迟设置并行处理的操作。可以使用指定的分区参数创建RDD,该参数确定每个RDD要创建多少个分区,最好该参数等于系统的数量(例如,您有12个文件要处理,创建一个带有3个分区的RDD,该RDD将4个系统的数据分成4个存储桶,所有文件在每个系统中同时处理)。据我所知,这些分区控制进入每个系统进行处理的数据部分

问题
我需要微调和控制每个系统同时运行多少个函数。如果两个或更多函数同时在同一GPU上运行,系统将崩溃

问题
如果一个RDD没有被均匀地分割(如上面的例子),那么系统上有多少线程并发运行

示例
在:

输出:

总之
我需要知道的是,如果RDD按原来的方式拆分,是什么控制了同时处理的线程数?是内核数,还是有一个全局参数可以设置为在每个分区(系统)上一次只处理4个

Spark中的RDD以什么顺序处理数据

除非是某种边界情况,例如只有一个分区,否则顺序是任意的或不确定的。这将取决于集群、数据和不同的运行时事件

多个分区仅为给定阶段设置总体并行性的限制,或者换句话说,它是Spark中的最小并行单元。无论您分配多少资源,单个阶段都应处理比当时更多的数据。同样,当无法访问工作人员且任务被重新调度到某个级别时,可能会出现边界情况其他机器

您可以考虑的另一个可能的限制是执行器线程的数量。即使您增加分区的数量,单个执行器线程一次也只能处理一个分区

以上两项都不能告诉您将在何处或何时处理给定分区。而您可以在配置级别使用一些肮脏、低效和不可移植的技巧(例如,每台机器只有一个执行线程的单个工作线程)为了确保在给定的机器上只处理一个分区,一般来说,这并不特别有用

作为一条经验法则,我想说的是,Spark代码永远不应该与执行它的时间和地点有关。API的一些低级方面提供了设置特定于分区的首选项的方法,但据我所知,这些并不能提供硬保证

尽管如此,我们至少可以想出几种方法来解决这个问题:

  • 具有配置级别保证的长时间运行的executor线程-如果Spark只负责加载和保存数据,这是可以接受的
  • 控制GPU上排队作业的单例对象
  • 将GPU处理委托给专门服务,以确保正确访问

另一方面,您可能不感兴趣的是,它大致描述了一种适用于此处的体系结构。

您是否尝试过查看Spark UI?运行您的示例后,我为每个
collect()获得了3个任务
action,它是您在创建RDD时提供的分区数。除此之外,并行运行的任务数取决于Spark应用程序配置。例如,如果您从
pyspark--master local[8]开始
而且您至少有8个内核,它将能够同时并行8个任务。由于作业运行得很快,我没有这样做。我会看一看,但我认为UI会提供运行的工作线程数量的顶层视图,而不是每个工作线程中处理的并发线程数量。那么您是说如果我限制参数er to--掌握本地语言[4]它应该一次只能并行4个任务?我将仔细研究一下,谢谢。我怀疑执行顺序可能是任意的,这就是为什么我关心这个实现,并且不能有一个控制参数,这样就没有两个进程在同一个GPU上运行。但是我觉得我可能有一个解决方案。我想但是,只要写一个GPU繁忙的数据库,并发进程就会选择一个空闲的GPU或等待一个空闲的GPU,去尝试一下。Yahoo CaffeOnSpark链接的发现很棒,但他们只是将其用于培训,没有迹象表明它可以通过Caffeomodel文件实现检测,我会研究一下。谢谢!
sample_files = ['one.jpg','free.jpg','two.png','zero.png',
                'four.jpg','six.png','seven.png','eight.jpg',
                'nine.png','eleven.png','ten.png','ten.png',
                'one.jpg','free.jpg','two.png','zero.png',
                'four.jpg','six.png','seven.png','eight.jpg',
                'nine.png','eleven.png','ten.png','ten.png',
                'eleven.png','ten.png']
CLUSTER_SIZE = 3
example_rdd = sc.parallelize(sample_files, CLUSTER_SIZE)
example_partitions = example_rdd.glom().collect()

# Print elements per partition
for i, l in enumerate(example_partitions): print "parition #{} length: {}".format(i, len(l))
# Print partition distribution
print example_partitions

# How many map functions run concurrently when the action is called on this Transformation?
example_rdd.map(lambda s: (s, len(s))
action_results = example_rdd.reduceByKey(add)
parition #0 length: 8
parition #1 length: 8
parition #2 length: 10
[ ['one.jpg', 'free.jpg', 'two.png', 'zero.png', 'four.jpg', 'six.png', 'seven.png', 'eight.jpg'], 
['nine.png', 'eleven.png', 'ten.png', 'ten.png', 'one.jpg', 'free.jpg', 'two.png', 'zero.png'], 
['four.jpg', 'six.png', 'seven.png', 'eight.jpg', 'nine.png', 'eleven.png', 'ten.png', 'ten.png', 'eleven.png', 'ten.png'] ]