apache-spark - Apache Spark 内存不足,分区数量较少

标签 apache-spark

我有一个 Spark 应用程序内存不足,集群有两个节点,RAM 大约为 30G,输入数据大小大约为几百 GB。

该应用程序是一个 Spark SQL 作业,它从 HDFS 读取数据并创建一个表并缓存它,然后执行一些 Spark SQL 查询并将结果写回 HDFS。

最初我将数据分成 64 个分区,结果出现了 OOM,然后我能够通过使用 1024 个分区来解决内存问题。但是为什么使用更多的分区可以帮助我解决 OOM 问题?

最佳答案

大数据的解决方案是分区(分而治之)。由于并非所有数据都可以放入内存中,因此也无法在一台机器上进行处理。
每个分区都可以在相对较短的时间内装入内存并处理(映射)。在为每个分区处理数据之后。它需要合并(减少)。这是传统 map reduce
将数据拆分到更多分区意味着每个分区越来越小。
[编辑]
Spark 使用称为弹性分布式数据集(RDD)的革命性概念。

  • 有两种类型的操作,transformation 和acton
  • 转换是从一个 RDD 映射到另一个。它是懒惰的评估。那些 RDD 可以被视为我们不想得到的中间结果。
  • 当您确实想要获取数据时使用操作。那些 RDD/data 可以被视为我们想要的东西,就像 take top failed 一样。
  • Spark 会在执行前分析所有操作并创建一个 DAG(有向无环图)。
  • 当操作被触发时,Spark 从源 RDD 开始计算。然后忘记它。

  • Spark DAG
    (来源:cloudera.com)
    我为 Youtube 上的演示做了一个小截屏Spark Makes Big Data Sparking .

    关于apache-spark - Apache Spark 内存不足,分区数量较少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38133744/

    相关文章:

    java - 如何使用NNLS进行非负多元线性回归?

    scala - 使用 Maven 打包并运行 Scala Spark 项目

    apache-spark - 大量窗口函数导致内存不足(滞后、超前)

    scala - 如何使用正则表达式在 sc.textFile 中包含/排除某些输入文件?

    java - “JavaPackage”对象不可调用

    apache-spark - 如何将来自kafka的directstream转换为spark 1.3.0中的数据帧

    java - 将 Apache Spark 添加到 Eclipse Maven 项目时出现问题

    apache-spark - Spark netlib-java BLAS

    java - 尝试使用 SPARK 1.6 (WrappedArray) 从嵌套 JSON 中收集值

    python - PySpark takeOrdered 多个字段(升序和降序)