Python Spark未与binaryfile并行运行RDD Pyspark

Python Spark未与binaryfile并行运行RDD Pyspark,python,apache-spark,pyspark,Python,Apache Spark,Pyspark,我是Spark的新手,并开始用Python编写一些脚本。我的理解是Spark并行执行转换(map) 上面的代码从文件夹中收集.zip文件列表并对其进行处理。当我执行它时,我看到这是连续发生的 输出 file:/F:/usr/temp/sample.zip 2020-10-22 10:42:37.089085 file:/F:/usr/temp/sample1.zip 2020-10-22 10:43:07.103317 您可以看到,它在30秒后开始处理第二个文件。意思是在完成第一个文件之后。我

我是Spark的新手,并开始用Python编写一些脚本。我的理解是Spark并行执行转换(map)

上面的代码从文件夹中收集
.zip
文件列表并对其进行处理。当我执行它时,我看到这是连续发生的

输出

file:/F:/usr/temp/sample.zip 2020-10-22 10:42:37.089085
file:/F:/usr/temp/sample1.zip 2020-10-22 10:43:07.103317

您可以看到,它在30秒后开始处理第二个文件。意思是在完成第一个文件之后。我的代码出了什么问题?为什么它不并行执行RDD?你能帮帮我吗?

我不知道这个方法是如何通过spark分区对文件进行分区的。似乎与
textFiles
相反,它倾向于只创建一个分区。让我们看一个名为
dir
的示例目录,其中包含5个文件

ls dir 测试1测试2测试3测试4测试5 如果我使用
textFile
,事情是并行运行的。我不提供输出,因为它不是很漂亮,但你可以自己检查。我们可以验证是否与
getNumPartitions
并行运行

sc.textFile(“dir”).foreach(lambda x:some_函数(x,None)) #难看的输出,但一切都同时开始, #除了最后一个,因为你有4个核。 >>>sc.textFile(“dir”).getNumPartitions() 5. 对于
binaryFiles
来说,事情是不同的,出于某种原因,所有的东西都进入同一个分区

>>sc.binaryFiles(“dir”).getNumPartitions()
1.
我甚至试过使用10k文件,但所有的文件都被放在同一个分区中。我相信这背后的原因是,在scala中,
binaryFiles
返回一个带有文件名的RDD和一个允许读取文件的对象(但不执行读取)。因此,它是快速的,并且产生的RDD很小。因此,将它放在一个分区上是可以的。 在scala中,我们可以在使用
binaryFiles
之后使用重新分区,这样做会非常有效

scala>sc.binaryFiles(“dir”).getNumPartitions
1.
scala>sc.binaryFiles(“dir”).repartition(4).getNumPartitions
4.
scala>sc.binaryFiles(“dir”).重新分区(4)
.foreach{case(name,ds)=>{
println(System.currentTimeMillis+“:”+名称)
《睡眠》(2000年)
//对数据流ds进行一些读取
}}
1603352918396:文件:/home/oanicol/sandbox/dir/test1
1603352918396:文件:/home/oanicol/sandbox/dir/test3
1603352918396:文件:/home/oanicol/sandbox/dir/test4
1603352918396:文件:/home/oanicol/sandbox/dir/test5
1603352920397:文件:/home/oanicol/sandbox/dir/test2
python中的问题是,
binaryFiles
实际上将文件读取到单个分区上。另外,这对我来说非常神秘,但是pyspark 2.4中的以下代码行产生了您注意到的相同行为,这是没有意义的

#这应该可以,但不能
sc.binaryFiles(“dir”,minPartitions=4).foreach(lambda x:some_函数(x,,))
#这也不起作用,这很奇怪,但无论如何都不会建议这样做
#因为所有数据都将在一个分区上读取
sc.binaryFiles(“dir”).repartition(4).foreach(lambda x:some_函数(x,,))
但是,由于
binaryFiles
实际上读取文件,因此可以使用
wholeTextFile
将文件读取为文本文件,并按预期的方式运行:

#这很有效
sc.wholeTextFiles(“dir”,minPartitions=4).foreach(lambda x:some_函数(x,,))

您的机器上有多少个内核?@Oli我的机器上有4个内核
file:/F:/usr/temp/sample.zip 2020-10-22 10:42:37.089085
file:/F:/usr/temp/sample1.zip 2020-10-22 10:43:07.103317