Spark重新分区落入单个分区

2024-01-30

我正在学习spark,当我使用以下表达式在pyspark shell中测试repartition()函数时,我观察到一个非常奇怪的结果:之后所有元素都落入同一个分区repartition()功能。 在这里,我用了glom()了解 rdd 内的分区。我正期待着repartition()打乱元素并将它们随机分布在分区之间。仅当我使用新分区数

在我的测试过程中,如果我设置新的分区数 > 原始分区数,也不会观察到洗牌。我在这里做错了什么吗?

In [1]: sc.parallelize(range(20), 8).glom().collect()
Out[1]:
[[0, 1],
 [2, 3],
 [4, 5],
 [6, 7, 8, 9],
 [10, 11],
 [12, 13],
 [14, 15],
 [16, 17, 18, 19]]

In [2]: sc.parallelize(range(20), 8).repartition(8).glom().collect()
Out[2]:
[[],
 [],
 [],
 [],
 [],
 [],
 [2, 3, 6, 7, 8, 9, 14, 15, 16, 17, 18, 19, 0, 1, 12, 13, 4, 5, 10, 11],
 []]

In [3]: sc.parallelize(range(20), 8).repartition(10).glom().collect()
Out[3]:
[[],
 [0, 1],
 [14, 15],
 [10, 11],
 [],
 [6, 7, 8, 9],
 [2, 3],
 [16, 17, 18, 19],
 [12, 13],
 [4, 5]]

我使用的是spark版本2.1.1。


恭喜!你刚刚重新发现SPARK-21782 https://issues.apache.org/jira/browse/SPARK-21782 - 当 numPartitions 是 2 的幂时,重新分区会产生偏差:

目前,重新分区(shuffle-enabled coalesce)的算法如下:

对于每个初始分区索引,生成位置为 (new Random(index)).nextInt(numPartitions) 然后,对于初始分区索引中的元素号 k,将其放入新分区位置 + k(模 numPartitions)。

因此,本质上,元素大致均匀地分布在 numPartitions 个存储桶上 - 从编号为position+1 的存储桶开始。

请注意,为每个初始分区索引创建一个新的 Random 实例,并具有固定的种子索引,然后将其丢弃。因此,对于世界上任何 RDD 的每个索引来说,位置都是确定的。此外,nextInt(bound) 实现有一个特殊情况,即bound 是2 的幂,这基本上是从初始种子中获取几个最高位,仅进行最小的加扰。

PySpark 使情况变得更糟,因为它使用批处理序列化器 https://github.com/apache/spark/blob/b2ce17b4c9fea58140a57ca1846b2689b15c0d61/python/pyspark/rdd.py#L2102默认批量大小等于 10,因此每个分区上的项目数量较少,所有项目都会被打乱到相同的输出。

好消息是,它是Spark 2.3 中已解决 https://github.com/apache/spark/commit/77d046ec47a9bfa6323aa014869844c28e18e049谢谢谢尔盖·谢列布里亚科夫 https://github.com/megaserg.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spark重新分区落入单个分区 的相关文章

随机推荐

  • Python,确定字符串是否应转换为 Int 或 Float

    我想将字符串转换为最严格的数据类型 int 或 float 我有两个字符串 value1 0 80 this needs to be a float value2 1 00 this needs to be an integer 在Pyth
  • 将多个事件分组到单个 ics 文件中(icalendar 流)

    我想根据 RFC 将多个事件分组到单个 ICS 文件 iCalendar 流 中 这是可以做到的 但我不知道如何做到 谁能帮助我或给我一个例子 rfc 是这样说的 但是 多个 iCalendar 对象可以按顺序分组一起在 iCalendar
  • 为什么文档指示 CALayer 动画必须位于 UIView 动画块中?

    我目前正在阅读苹果的核心动画指南 https developer apple com library mac documentation Cocoa Conceptual CoreAnimation guide CreatingBasicA
  • 如何更改启动屏幕大小?

    我在 C 上使用 WPF 我添加了一个 png图像并将其配置为启动屏幕 这个png文件的分辨率是1100x800像素 问题是我的应用程序将支持许多分辨率的屏幕 所以这个尺寸的启动屏幕对于小屏幕 如 1366x768 屏幕 来说太大了 如果我
  • 注意:未定义的偏移量:0 in

    我收到这个 PHP 错误 这是什么意思 Notice Undefined offset 0 in C xampp htdocs mywebsite reddit vote tut src votes php on line 41 从这段代码
  • 在 angular2 的一个组件中添加多个 templateUrl

    angular2 允许使用反引号 编写多行 html 代码 但是当使用 templateUrl 时 我不知道如何添加多个 html 文件 当我尝试这个时 Component selector my app template h1 view1
  • 将内部带有字节数组的结构传递给互操作方法

    我遇到一种情况 必须将结构传递给 C 方法 在我的 C 文件中声明为 extern 然而这个结构相当复杂 我已经成功地使用了 AllocHGlobal 的方法 但我想了解是否可以通过仅传递对结构的引用来使其以这种方式工作 StructLay
  • Android - 创建适配器时出现 NullPointerException

    我正在为列表视图创建一个数组适配器 一切正常 我有 2 个片段 操作栏顶部有 2 个按钮 可在这 2 个片段之间进行更改 我的问题是 如果我在这些frag之间移动得太快 当我打开fragOne 切换到fragTwo 然后快速移回fragOn
  • LinearLayout 留下太多空白。为什么?

    我正在编写一个 Android 应用程序 帮助小孩子学习数学 它向用户提出一些问题 用户会回答这些问题 如果他 她全部答对 将获得奖品 现在我需要在中告诉用户这一点ResultsActivity 它是这样的
  • Windows 窗体:播放声音,但不是从头开始

    我想在我的设备中播放曲目 wav 文件 Windows Forms Application 但我不希望它从头开始播放 而是从曲目中的某个点开始播放 假设 10 秒 从头开始播放曲目没有问题 private void playSimpleSo
  • OpenCV 错误:Python 中的未知错误代码 -49

    我正在尝试使用 cv2 在 python 3 6 中学习人脸检测 我按照书上给出的src进行操作 我已经安装了opencv python 3 2 0 by pip xml 和 jpg 文件都与 python 代码位于同一路径中 from n
  • 拉拉维尔。如果数据库正在播种,则禁用观察者方法

    我的用户模型有一个观察者 在我的观察者 gt 创建的事件中我有一些代码 public function created User user sendEmail 因此 我们的想法是 当创建用户时 系统将向用户发送帐户已创建的电子邮件通知 问题
  • 如何使用 mvn site:site 生成站点?

    我想用mvn生成一个站点 但是我无法配置它来生成index html 我可以运行不同的报告 例如 mvn javadoc javadoc generates target site apidocs mvn cobertura cobertu
  • 如何处理 UI 的 Lambda/API 网关的 Cognito 身份验证重定向?

    当我进入 Cognito 身份验证页面时 https example auth us east 1 amazoncognito com login response type token client id xxxxxxxxxxxxxxxx
  • Mongodb:$in 运算符与大量单个查询

    我知道 MongoDB 能够每秒处理大量请求 但假设我必须根据给定的 id 查询集合的大量文档 什么听起来更好 在 id 属性上使用我想要获取的所有 id 创建 in 或者循环 findOne 查询 我肯定会使用 in 查询并提供 ids
  • 如何从 SqlAlchemy 创建和恢复备份?

    我正在编写一个 Pylons 应用程序 并尝试创建一个简单的备份系统 其中每个表都被序列化并压缩成一个文件 供管理员下载 并在发生不良情况时用于恢复应用程序 我可以使用以下命令很好地序列化我的表数据SqlAlchemy 序列化器 https
  • 如何通过 JavaScript/JQuery 将 HTML 文档添加到
    中?

    如何将 HTML 文档添加到 div div 通过 JavaScript JQuery 这就是我到目前为止所拥有的 emailBodyIninclude html
  • Azure Functions - 事件中心不触发函数

    我有一个 Azure 基础架构 2 个 HTTP 函数 gt 事件中心 gt 2 个函数 gt 表存储 因此两个 http 函数将消息发送到事件中心 以及两个由事件中心中的消息触发的函数 其中之一将消息保存在表存储中 基础结构每天由 Azu
  • 如何寻址 OData Url 中使用复合身份密钥的实体?

    我有一个实体订单项具有OrderId and 产品编号整数字段 这两个字段构成身份密钥 主密钥对于这张表 我想用OData Web API通过服务公开此类实体并能够选择订单项目他们的实例复合ID 的格式应该是什么URL 是否有处理此类场景的
  • Spark重新分区落入单个分区

    我正在学习spark 当我使用以下表达式在pyspark shell中测试repartition 函数时 我观察到一个非常奇怪的结果 之后所有元素都落入同一个分区repartition 功能 在这里 我用了glom 了解 rdd 内的分区