如果有人能用简单的术语回答这些与火花洗牌相关的问题,我将不胜感激。
在spark中,当加载一个数据集时,我们指定分区的数量,这表示输入数据(RDD)应该被划分为多少个块,并且根据分区的数量启动相等数量的任务(如果假设错误,请纠正我)。对于工作节点中的X个核心数。一次运行相应的X个任务。
沿着类似的思路,这里有几个问题。
因为,所有byKey操作以及联合、重新分区、连接和共组都会导致数据混乱。
>
数据洗牌是重新分区操作的另一个名称吗?
当重新分区发生时,初始分区(声明的分区数)会发生什么。
我已经看到了一些例子,其中显示了键的随机箭头移动(但不知道移动是如何驱动的),例如,如果我们已经有10个分区中的数据,重新分区操作是否首先组合所有数据,然后根据哈希代码%编号将特定键发送到特定分区。
首先,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