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 如何确保RDD的每个分区都有一些数据_Apache Spark - Fatal编程技术网

Apache spark 如何确保RDD的每个分区都有一些数据

Apache spark 如何确保RDD的每个分区都有一些数据,apache-spark,Apache Spark,我有一个36个元素的RDD。我有一个由3个节点组成的集群,每个节点有4个核心。我已经将RDD重新划分为36个部分,这样每个分区可能有一个元素要处理,但是整个36个元素被划分为只有4个部分有9个元素,其余部分是空的,因此没有任何东西要处理,服务器资源没有得到充分利用 如何重新划分数据以确保每个零件都有一些数据要处理?如何确保每个零件都有3个元素要处理 根据定义,重新分区(numPartitions)随机重新排列RDD中的数据,以创建更多或更少的分区,并在这些分区之间进行平衡,从而始终在网络上重新排

我有一个36个元素的RDD。我有一个由3个节点组成的集群,每个节点有4个核心。我已经将RDD重新划分为36个部分,这样每个分区可能有一个元素要处理,但是整个36个元素被划分为只有4个部分有9个元素,其余部分是空的,因此没有任何东西要处理,服务器资源没有得到充分利用


如何重新划分数据以确保每个零件都有一些数据要处理?如何确保每个零件都有3个元素要处理

根据定义
重新分区(numPartitions)
随机重新排列RDD中的数据,以创建更多或更少的分区,并在这些分区之间进行平衡,从而始终在网络上重新排列所有数据

apachespark提供的保证是均匀分布,但这不会在每个分区中产生完全相同数量的元素。(该数据集的大小也非常小!)

您可以考虑使用<代码> HashPartitioner <代码>:

scala> val rdd = sc.parallelize(for { x <- 1 to 36 } yield (x, None), 8) 
rdd: org.apache.spark.rdd.RDD[(Int, None.type)] = ParallelCollectionRDD[31] at parallelize at <console>:27

scala> import org.apache.spark.rdd.RDD
import org.apache.spark.rdd.RDD

scala> import org.apache.spark.HashPartitioner
import org.apache.spark.HashPartitioner

scala> def countByPartition(rdd: RDD[(Int, None.type)]) = rdd.mapPartitions(iter => Iterator(iter.length))
countByPartition: (rdd: org.apache.spark.rdd.RDD[(Int, None.type)])org.apache.spark.rdd.RDD[Int]

scala> countByPartition(rdd).collect
res25: Array[Int] = Array(4, 5, 4, 5, 4, 5, 4, 5)

scala> countByPartition(rdd.partitionBy(new HashPartitioner(12))).collect
res26: Array[Int] = Array(3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3)
scala>val rdd=sc.parallelize(用于{x import org.apache.spark.rdd.rdd
导入org.apache.spark.rdd.rdd
scala>import org.apache.spark.HashPartitioner
导入org.apache.spark.HashPartitioner
scala>def countByPartition(rdd:rdd[(Int,None.type)])=rdd.mapPartitions(iter=>Iterator(iter.length))
countByPartition:(rdd:org.apache.spark.rdd.rdd[(Int,None.type)])org.apache.spark.rdd.rdd[Int]
scala>countByPartition(rdd).collect
res25:Array[Int]=数组(4,5,4,5,4,5)
scala>countByPartition(rdd.partitionBy(新的HashPartitioner(12))).collect
res26:Array[Int]=数组(3,3,3,3,3,3,3,3,3,3,3)
我借用了zero323关于

我希望这有帮助

编辑:

如果您愿意,请执行以下操作:

scala> val rdd = sc.parallelize(for { x <- 1 to 36 } yield (x, None), 12) 
rdd: org.apache.spark.rdd.RDD[(Int, None.type)] = ParallelCollectionRDD[36] at parallelize at <console>:29

scala> countByPartition(rdd).collect
res28: Array[Int] = Array(4, 5, 4, 5, 4, 5, 4, 5)
scala>val rdd=sc.parallelize(用于{x countByPartition(rdd).collect
res28:Array[Int]=数组(4,5,4,5,4,5)

结果不一定相同。

您使用的是
coalesce
还是
repartition
?我想这也可能是因为您的元素很少。我使用的是repartition。是的,我的元素太少了,在本例中只有36个。但是每个元素都有很多处理要做。我希望每个分区都有一些数据,而不是不均匀repartitioning@philantrovert有没有解决这个问题的办法,因为我有数百万条记录,但有些分区根本不接收数据,而有些分区的数据多达5条data@AnkushSingh重新分区应该做到这一点,因为它会在所有分区之间洗牌数据,然后生成的分区的数量必须几乎相等首先,你说你有36条记录,然后是百万条记录……那么这是什么情况呢?谢谢你的回答。如果我做了这个val rdd=sc.parallelize(对于{x No.你一定会得到同样的结果。