当前位置: 首页 > 知识库问答 >
问题:

了解火花中的洗牌和重新分区

皇甫学海
2023-03-14

如果有人能用简单的术语回答这些与火花洗牌相关的问题,我将不胜感激。

在spark中,当加载一个数据集时,我们指定分区的数量,这表示输入数据(RDD)应该被划分为多少个块,并且根据分区的数量启动相等数量的任务(如果假设错误,请纠正我)。对于工作节点中的X个核心数。一次运行相应的X个任务。

沿着类似的思路,这里有几个问题。

因为,所有byKey操作以及联合、重新分区、连接和共组都会导致数据混乱。

>

  • 数据洗牌是重新分区操作的另一个名称吗?

    当重新分区发生时,初始分区(声明的分区数)会发生什么。

    我已经看到了一些例子,其中显示了键的随机箭头移动(但不知道移动是如何驱动的),例如,如果我们已经有10个分区中的数据,重新分区操作是否首先组合所有数据,然后根据哈希代码%编号将特定键发送到特定分区。

  • 共有1个答案

    陆英毅
    2023-03-14

    首先,HDFS块被分成许多不在块中的分区。这些请愿书驻留在工作内存中。这些分区驻留在工作内存中。

    Q-数据洗牌是重新分区操作的另一个名称吗?

    答案是否定的。一般来说,重新分区意味着增加数据被划分到的现有分区。因此,每当我们增加分区时,我们实际上是在试图“移动”代码中设置的新分区中的数据,而不是“洗牌”。当我们在一个分区中移动特定键的数据时,就有点像洗牌。

    Q-发生重新分区时,初始分区(声明的分区数)会发生什么情况?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-partition和partition是两个不同的概念,因此partition指的是按照用户设置的分区数均匀划分数据,但在分区中,数据会根据用户设置的算法(如HashPartitioning)在这些分区之间进行混洗

    比如rdd= sc.textFile(“../路径”,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@
    

    希望这会有所帮助!!!

     类似资料:
    • 我在火花变换函数中有一个简单的问题。 coalesce(numPartitions) - 将 RDD 中的分区数减少到 numPartitions。可用于在筛选大型数据集后更有效地运行操作。 我的问题是 > < Li > < p > coalesce(num partitions)真的会从filterRDD中删除空分区吗? coalesce(numPartitions)是否经历了洗牌?

    • 我们正在运行以下阶段DAG,对于相对较小的洗牌数据大小(每个任务约19MB),我们经历了较长的洗牌读取时间 一个有趣的方面是,每个执行器/服务器中的等待任务具有等效的洗牌读取时间。这里有一个例子说明了它的含义:对于下面的服务器,一组任务等待大约7.7分钟,另一组等待大约26秒。 这是同一阶段运行的另一个例子。该图显示了3个执行器/服务器,每个执行器/服务器具有相同的洗牌读取时间的统一任务组。蓝色组

    • 我通过指定分区的数量从文本文件创建RDD(Spark 1.6)。但它给我的分区数与指定的分区数不同。 案例1 案例2 案例3 案例4 文件/home/pvikash/data/test的内容。txt是: 这是一个测试文件。将用于rdd分区 基于以上案例,我有几个问题。 对于案例2,显式指定的分区数为0,但实际分区数为1(即使默认最小分区为2),为什么实际分区数为1? 对于案例3,为什么在指定数量的

    • 我在任何地方都找不到如何在RDD内部执行重新分区?我知道您可以在RDD上调用重新分区方法来增加分区数量,但它是如何在内部执行的呢? 假设,最初有5个分区,他们有- 第一个分区 - 100 个元素 第二个分区 - 200 个元素 第 3 个分区 - 500 个元素 第 4 个分区 - 5000 个元素 第 5 分区 - 200 个元素 一些分区是倾斜的,因为它们是从HBase加载的,并且数据没有正确

    • 谁能给我解释一下吗? 然而,另一方面是,对于不能保证产生已知分区的转换,输出RDD将没有分区器集。例如,如果对哈希分区的键/值对RDD调用map(),则传递给map()的函数在理论上可以更改每个元素的键,因此结果将不会有分区器。Spark不会分析函数以检查它们是否保留密钥。相反,它提供了另外两个操作,mapValues()和flatMap Values(),它们保证每个元组的键保持不变。 Mate