【问题标题】:Will spark load data into in-memory if data is 10 gb and RAM is 1gb如果数据为 10 GB 且 RAM 为 1 GB,则将数据加载到内存中
【发布时间】:2019-08-21 02:14:24
【问题描述】:

如果我有 5 个节点 的集群,每个节点都有 1gb 内存,现在如果我的 数据文件10gb 分布在所有 5 个节点中,假设每个节点 2gb,现在如果我触发

val rdd = sc.textFile("文件路径")

rdd.collect

将 spark 加载数据到 ram 中以及 spark 将如何处理这种情况 它会立即拒绝还是会处理它。

【问题讨论】:

  • 如果没有指定持久级别,Spark 会尝试将数据加载到内存中,但是如果没有足够的空间可用,则会溢出到磁盘。
  • @PrateekPrateek 。不确定您是否使用收集火花溢出到磁盘,收集后甚至不再火花。
  • 但是如果 collect 会抛出内存异常,因为驱动节点上没有足够的空间。
  • @thebluephantom 如果我使用任何其他操作 api 会怎样
  • 一般collect用于小规模测试。

标签: apache-spark


【解决方案1】:

当您使用收集时,所有发送的数据仅在驱动程序节点中收集为数组。 从这一点分布火花和其他节点不发挥作用。您可以将其视为单机上的纯 java 应用程序。

可以用spark.driver.memory判断驱动内存,要求10G。

从这一刻起,如果您没有足够的内存来存储数组,您可能会遇到 OutOfMemory 异常。

【讨论】:

  • @RefiPetertz 感谢您的回答,如果我使用任何其他操作 api 怎么办,它仍然不会将数据加载到 ram 中
  • 这与不同的 API 无关,只是不要收集继续使用 spark,这样您的所有操作将在必要时使用它们的内存溢出到磁盘分布在节点上。当我说使用 spark 时,意味着您使用 spark sql 内置函数或使用 UDF 进行更复杂的针点操作。
  • @intellect_dp 这个问题的答案仍然是正确的。如果您将其标记为这样,那就太好了。
【解决方案2】:

让我们先了解一下@intellect_dp 你问的问题,你有一个由 5 个节点组成的集群(这里的术语“节点”我假设机器通常包括硬盘、RAM、4 核 cpu 等),现在 每个节点拥有 1 GB 的 RAM,并且您有 10 GB 的数据文件,该文件以某种方式分布,即 2 GB 的数据驻留在每个节点的硬盘中。这里假设您使用的是 HDFS,现在每个节点的块大小为 2GB。

现在让我们打破这个:

  • 每个块大小 = 2GB
  • 每个节点的 RAM 大小 = 1GB

由于 Spark 中的惰性求值,只有当“Action API”被触发时,才会将您的数据加载到 RAM 中并进一步执行。

在这里您是说您使用“收集”作为操作 api。现在这里的问题是 RAM 大小小于您的块大小,如果您使用 spark 的所有默认配置 (1 block = 1 partition ) 处理它,并且考虑到不会再添加更多节点up,那么在这种情况下它会给你内存不足的异常。

现在的问题是——spark 有什么方法可以通过给定的硬件配置来处理这种大数据?

Ans - 是的,首先你需要设置默认最小分区:

val rdd = sc.textFile("filepath",n)

这里 n 将是我默认的最小块分区,现在我们只有 1gb 的 RAM,所以我们需要保持它小于 1gb,所以假设我们取 n = 4, 现在你的块大小是 2gb,块的最小分区是 4:

每个分区大小将 = 2GB/4 = 500mb;

现在 spark 将首先处理这 500mb 并将其转换为 RDD,当下一个 500mb 块到来时,第一个 rdd 将溢出到硬盘(假设您已设置 存储级别“MEMORY_AND_DISK_ONLY”)。

通过这种方式,它将使用给定的集群硬件配置处理整个 10 GB 的数据文件。

现在我个人不会为这种情况推荐给定的硬件配置, 因为它肯定会处理数据,但也有一些缺点:

  • 首先它会涉及多个 I/O 操作,使得整个过程非常缓慢。

  • 其次,如果在读取或写入硬盘时出现任何延迟,您的整个工作将被丢弃,您会对这样的硬件配置感到沮丧。除此之外,您永远无法确定它会触发处理您的数据,并且能够在数据增加时给出结果。

所以尽量减少 I/O 操作,并且 利用 Spark 的内存计算能力,并增加少量资源以获得更快的性能。

【讨论】:

  • 非常感谢您的解释,您拯救了我的一天!!
【解决方案3】:

另一方面,如果我们这样做,性能会受到影响,我们将无法获得我们想要的速度。

Spark 存储也只会产生 RDD,所以我可以说结果不会是完整的数据,如果我们从表名中选择 *,最坏的情况是,它会以块的形式提供数据,它可以提供什么......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-01
    • 2012-07-21
    相关资源
    最近更新 更多