如果有人能用简化的术语回答这几个与火星洗牌相关的问题,我将不胜感激。
在spark中,当加载数据集时,我们指定指定的分区数,它告诉输入数据(RDD)应分成多少个块,并根据分区数量,相同的任务数量启动(正确,如果假设错误)。对于 X 工作节点中的核心数量。对应 X 一次运行的任务数。
类似地,这里有几个问题。
因为,所有byKey操作以及coalesce,repartition,join和cogroup都会导致数据混乱。
数据是否会为重新分区操作改变其他名称?
重新分区发生时,初始分区(声明的分区数)会发生什么。
有人可以举例说明(解释)整个群集中的数据移动是如何发生的。我已经看到了几个例子 显示了键的随机箭头移动(但不知道如何驱动移动),例如,如果我们已经有10个分区中的数据,则重新分区操作是否首先组合所有数据,然后将特定键发送到特定的基于哈希码%numberofpartitions的分区。
答案 0 :(得分:0)
首先,HDFS块被分成不在块中的分区数。这些请愿书都存在于记忆中。这些分区驻留在工作程序内存中。
问:数据是否为重新分区操作改变了另一个名称?
A-否。通常,重新分区意味着增加数据分成的现有分区。因此,每当我们增加分区时,我们实际上都试图在代码中设置的新分区数“移动”数据而不是“随机播放”。当我们在一个分区中移动特定键的数据时,稍微改组。
问:重新分区发生时,初始分区(声明的分区数)会发生什么? A-涵盖在上面 还有一个潜在的事情是rdd.repartition(n)不会改变no。在rdd的分区中,它是一个转换,当其他一些rdd被创建时会起作用 rdd1 = rdd.repartition(n)
Now it will create new rdd1 that have n number of partition.To do this, we can call coalesce function like rdd.coalesce(n) Being an action function, this will change the partitions of rdd itself.
问:有人可以举例说明(解释)整个集群中的数据移动是如何发生的。我已经看到了几个示例,其中显示了键的随机箭头移动(但不知道如何驱动移动),例如,我们已经有10个分区中的数据,重新分区操作是否首先组合所有数据,然后根据哈希码%numberofpartitions将特定密钥发送到特定分区。
Ans-以两种不同的概念进行分区和分区,因此分区是将数据均匀划分为用户设置的分区数,但在分区中,数据根据用户设置的算法在这些分区之间进行混洗HashPartitioning& RangePartitioning。
像rdd = sc.textFile(“../ path”,5)rdd.partitions.size / length
O/p: Int: 5(No.of partitions)
rdd.partitioner.isDefined
O/p: Boolean= false
rdd.partitioner
O/p: None(partitioning scheme)
但是,
rdd = sc.textFile(“../ path”,5).partitionBy(new org.apache.spark.HashPartition(10).cache()
rdd.partitions.size
O/p: Int: 10
rdd.partitioner.isDefined
O/p: Boolean: true
rdd.partitioner
O/p: HashPartitioning@
希望这会有所帮助!!!