Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark PySpark:使用binaryFiles()函数读取二进制文件时进行分区_Apache Spark_Pyspark_Rdd_Binaryfiles_Partitioning - Fatal编程技术网

Apache spark PySpark:使用binaryFiles()函数读取二进制文件时进行分区

Apache spark PySpark:使用binaryFiles()函数读取二进制文件时进行分区,apache-spark,pyspark,rdd,binaryfiles,partitioning,Apache Spark,Pyspark,Rdd,Binaryfiles,Partitioning,或 使用上述任一代码,我试图在我的RDD{中创建8个分区,其中,我希望数据均匀分布在所有分区}。当我打印{rdd.getNumPartitions()}时,显示的分区数仅为8个,但在Spark UI上,我观察到虽然创建了8个分区,但所有二进制文件数据都只放在一个分区上。 注意:minPartition属性不起作用。即使在设置minPartitions=5之后,在RDD中创建的分区数量也仅为1。因此,使用了分区/重分区函数。 这是我想要的行为还是我遗漏了什么;DR这是预期的行为 由于使用b

使用上述任一代码,我试图在我的RDD{中创建8个分区,其中,我希望数据均匀分布在所有分区}。当我打印{rdd.getNumPartitions()}时,显示的分区数仅为8个,但在Spark UI上,我观察到虽然创建了8个分区,但所有二进制文件数据都只放在一个分区上。

注意:minPartition属性不起作用。即使在设置minPartitions=5之后,在RDD中创建的分区数量也仅为1。因此,使用了分区/重分区函数。


这是我想要的行为还是我遗漏了什么;DR这是预期的行为


由于使用
binaryFiles
读取文件,文件的整个内容将作为单个记录加载,并且单个记录不能跨多个分区拆分。这里没有任何内容可供分发。

Spark 2.4+,问题应该得到解决,请参阅此答案下方的@Rahul评论

Spark 2.1-2.3
binaryFiles()
minPartitions
参数被忽略。请参阅和。注意,在提交更改中,函数中不再使用
minPartitions

如果使用
binaryFiles()
读取多个二进制文件,则输入文件将根据以下内容合并到分区中:

  • spark.files.maxPartitionBytes
    ,默认128 MB
  • spark.files.openCostInBytes
    ,默认为4 MB
  • spark.default.parallelism
  • 输入的总大小
描述了前三个配置项。请参阅上面的提交更改以查看实际计算

我有一个场景,我希望每个输入分区最多40 MB,因此每个任务最多40 MB。。。在解析时增加并行性。(Spark在每个分区中放入了128 MB的内存,使我的应用程序速度变慢。)在调用
binaryFiles()
之前,我将
Spark.files.maxPartitionBytes
设置为40 M:

对于只有一个输入文件,@user9864979的回答是正确的:不能仅使用
binaryFiles()
将单个文件拆分为多个分区


使用Spark 1.6读取多个文件时,
minPartitions
参数确实有效,您必须使用它。如果不这样做,您将遇到问题:您的所有输入文件将只读取到两个分区中

您会发现Spark通常会提供比您请求的更少的输入分区。我有一个场景,我希望每两个输入二进制文件有一个输入分区。我发现将
minPartitions
设置为“输入文件的#7/10”大致满足了我的要求。
我还有一个场景,我希望每个输入文件有一个输入分区。我发现将
minPartitions
设置为“输入文件的#*2”可以满足我的需求


Spark 1.5binaryFiles()的行为:每个输入文件有一个分区。

但根据Spark的官方文档,binaryFiles()函数中的minPartition参数确定输入数据的最小分割数。因此,如果minPartitions设置为5,那么输入数据应该被分割成至少五个分区。对吧?@user_19不太对。它决定了分区的最小数量。它并没有说分区将是非空的,或者数据将在分区之间均匀分布。如果您至少有num个分区文件,那么您可以期望更均匀的分布(实际上没有任何保证)。如果您想要使用单个输入文件分发数据,那么您使用的函数是错误的。从Spark 2.1开始,
minPartitions
参数被忽略——请参阅我的答案。答案很好。这看起来像是在spark 2.4()中修复的。同时,将spark.files.maxPartitionBytes设置为较低的值似乎是诱使spark使用多个分区的解决方法。
sc = SparkContext("Local")
rdd = sc.binaryFiles(Path to the binary file , minPartitions = 5).partitionBy(8)
sc = SparkContext("Local")
rdd = sc.binaryFiles(Path to the binary file , minPartitions = 5).repartition(8)
spark = SparkSession \
   .builder \
   .config("spark.files.maxPartitionBytes", 40*1024*1024)