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

Spark分区大小大于executor内存

云啸
2023-03-14

我有四个问题。假设在spark中有3个worker节点。每个工人节点有3个执行器,每个执行器有3个核心。每个执行器有5 gb内存。(总共6个执行器,27个内核,15GB内存)。如果:

>

  • 我有30个数据分区。每个分区的大小为6 GB。最佳情况下,分区的数量必须等于核心的数量,因为每个核心执行一个分区/任务(每个分区执行一个任务)。在这种情况下,由于分区大小大于可用的执行器内存,每个执行器核心将如何处理分区?注意:我没有调用cache()或persist(),只是在RDD上应用了一些狭义的转换,如map()和filter()。

    如果我调用存储级别设置为MEMORY_AND_DISK的persist(),那么如果分区大小大于memory,它会将数据溢出到磁盘?该数据将存储在哪个磁盘上?工作节点的外部HDD?

  • 共有1个答案

    越伯寅
    2023-03-14

    我回答,因为我知道每个部分的事情,可能忽略了你的一些断言:

    我有四个问题。假设在spark中有3个worker节点。每个工人节点有3个执行器,每个执行器有3个核心。每个执行器有5 gb内存。(总共6个执行器,27个内核,15GB内存)。如果:>>>我将使用一个执行器,一个核心,会发生什么。这是公认的Afaik范式。

    >

  • 我有30个数据分区。每个分区的大小为6 GB。最佳情况下,分区的数量必须等于核心的数量,因为每个核心执行一个分区/任务(每个分区执行一个任务)。在这种情况下,由于分区大小大于可用的执行器内存,每个执行器核心将如何处理分区?注意:我没有调用cache()或persist(),只是在RDD上应用了一些狭义的转换,如map()和filter()。>>>分区数与核心数相同不正确。您可以使用10个内核服务1000个分区,一次处理一个。如果你有100k分区和on-prem呢?你不太可能得到10万个执行者。>>>继续前进,将驱动程序端的收集问题放在一边:您可能没有足够的内存用于执行器上的给定操作;Spark可能会以牺牲处理速度为代价泄漏到文件到磁盘。但是,分区的大小不应该超过一个最大大小,这是一段时间前加强的。使用多核执行器可能会发生故障,即OOM的,也是GC问题的结果,这是一个困难的话题。

    这是一个很有见地的博客:https://medium.com/swlh/spark-oom-error-closeup-462C7A01709D

  •  类似资料:
    • 当在火花中进行连接时,或者通常是对于随机操作,我可以设置分区的最大数量,我希望火花在其中执行此操作。 按留档: 火花sql。洗牌分区200配置在为联接或聚合洗牌数据时要使用的分区数。 如果我想减少每个任务中必须完成的工作量,我必须估计数据的总大小并相应地调整此参数(分区越多,意味着单个任务中完成的工作量越少,但任务越多)。 我想知道,我能告诉spark根据数据量简单地调整分区的数量吗?一、 e.在

    • 我使用火花处理大文件,我有12个分区。我有rdd1和rdd2,我在它们之间建立了连接,而不是选择(rdd3)。我的问题是,我咨询了最后一个分区比其他分区太大,从分区1到分区11但分区12。所以我划分了。我将我的rdd3重新分区为,但我最后一个分区仍然太大。我如何平衡分区的大小? 我的i编写自己的自定义分区程序?

    • 问题内容: 我正在尝试提出一个要求区分大小写的结果的请求。 例如在我的数据库中 该请求是 但我有3行作为结果,我只想要abcdef 我试图找到一个解决方案 但是我有这个错误: 未知归类:’Latin1_General_CS_AS’{“成功”:false,“错误”:“#1273-未知归类:’Latin1_General_CS_AS’”} 谢谢 问题答案: 感谢您的帮助,我找到了不是latin1 ut

    • 我有一本区分大小写的字典, 所以我可以在这本字典里找到区分大小写的键。 例如,我可以有下面的键值对, {test,10} {测试,20} {test1,30} {test2,40} ... 当有人传递密钥时,我想检索该值。检索应该部分不区分大小写,这意味着,如果匹配准确的大小写,则返回区分大小写的结果,如果区分大小写的键不存在,则检索区分大小写的键值。 例如,在字典中插入上述值 如果用户通过“测试

    • 找到给定RDD的每个分区大小的最佳方法是什么。我正在尝试调试一个扭曲的分区问题,我尝试了以下方法: 它适用于小型RDD,但对于大型RDD,它会产生OOM错误。我的想法是,导致了这种情况的发生。但不管怎样,我只是想知道有没有更好的方法?