根据文档:
Shuffle spill (memory)是Shuffle数据在内存中反序列化形式的大小。
Shuffle spill (disk)是磁盘上数据序列化形式的大小。
我对洗牌的理解是:
- 每个执行器获取其上的所有分区,并将它们散列划分为200个新分区(这200个分区可以更改)。每个新分区都与一个执行器相关联,稍后将转到该执行器。例如:
For each existing partition: new_partition = hash(partitioning_id)%200; target_executor = new_partition%num_executors
,其中%
为模运算符,num_executors为集群中执行器的个数。 - 这些新分区被转储到其初始执行器的每个节点的磁盘上。稍后,target_executor 将读取每个新分区
- 目标执行程序选择它们各自的新分区(从生成的200个分区中)
我对shuffle操作的理解是否正确?
你能帮我把shuffle溢出(内存)和shuffle溢出(磁盘)的定义放在shuffle机制的上下文中(如果正确的话,就是上面描述的那个)吗?例如(也许):shuffle spill(磁盘)是上面提到的第2点发生的部分,其中200个分区被转储到各自节点的磁盘上;(我不知道这样说是否正确;举个例子)
让我们看一下文档,我们可以在哪里找到这个:
Shuffle read: Total shuffle bytes and records read, includes both data read locally and data read from remote executors
这是执行程序在阶段处理开始时加载到内存中的内容,您可以将其视为其他执行程序在前一阶段准备的shuffle文件
Shuffle write: Bytes and records written to disk in order to be read by a shuffle in a future stage
这是你的舞台输出的大小,它可能会被下一阶段提取出来进行处理,换句话说,这是这个舞台创建的shuffle文件的大小
现在是shuffle spill
Shuffle spill (memory) is the size of the deserialized form of the shuffled data in memory.
Shuffle spill (disk) is the size of the serialized form of the data on disk.
Shuffle溢出发生在执行程序读取Shuffle文件时,但这些文件无法装入该执行程序的执行内存中。当发生这种情况时,一些数据块从内存中删除并写入磁盘(换句话说,它溢出到磁盘)
回到你的问题:溢出(内存)和溢出(磁盘)之间有什么区别?它描述的是完全相同的数据块。第一个指标是描述溢出数据在移动到磁盘之前在内存中所占用的空间,第二个指标是描述它们写入磁盘时的大小。这两个指标可能不同,因为数据在写入磁盘时可能以不同的方式表示,例如,它们可能被压缩。
如果你想阅读更多:
Cloudera问题"Shuffle溢出(内存)是反序列化形式的大小当我们溢出内存中的数据时,而shuffle溢出内存(磁盘)是磁盘上的数据经过序列化后的大小泄漏。这就是为什么后者往往比前者小得多前。请注意,这两个指标都是在整个持续时间内汇总的在任务中(即在每个任务中你可以多次溢出)。">
中1中2
Spill is represented by two values: (These two values are always presented together.)
Spill (Memory): is the size of the data as it exists in memory before it is spilled.
Spill (Disk): is size of the data that gets spilled, serialized and, written into disk and gets compressed.