我使用Apache Pyspark中的MovieLens数据集。
1.使用spark.read.load()
直接从.csv文件读取-〉工作正常
1.将.csv文件放入Postgres服务器,使用jdbc连接(如)将SQL关系读取到Spark DataFrame
dataframeList[table] = spark.read.format("jdbc"). \
options(
url = 'jdbc:postgresql://localhost:5432/movielens_dataset',
dbtable = table,
user = 'postgres',
password = 'postgres',
driver = 'org.postgresql.Driver').\
load()
这个代码是在一个for loop
中读取6个表。
当我在一个大的df上调用show(5)
时,这个方法似乎不起作用。
ERROR Executor: Exception in task 0.0 in stage 1.0 (TID 1)
java.lang.OutOfMemoryError: Java heap space
我试着增加驱动程序内存,并将其设置为4/5/6 G,但这导致Chrome崩溃并关闭。
sparkConf.setAppName("My app")
.set("spark.jars", "postgresql-42.5.0.jar")
.set("spark.driver.memory", "6g")
spark = SparkSession.builder.config(conf=sparkConf).getOrCreate()
我在谷歌浏览器的Jupyter笔记本电脑上运行这段代码,我的笔记本电脑有8 GB的内存。我不明白为什么它在这种情况下不工作,因为在这两种情况下,它们本质上都是DataFrame。只是它们是由不同的方法创建的。
有人能解释一下为什么会发生这种情况吗?还有,我该怎么解决这个问题呢?有人能推荐一个好的资源来理解Spark配置变量(驱动程序/执行器内核、内存、内存开销等),以及在不同的情况下如何调整它们?非常感谢!
1条答案
按热度按时间eivnm1vs1#
当 您 使用 JDBC 连接 外部 数据 库 时 , 在 您 的 情况 下 ( Postgresql ) , 增加 驱动 程序 内存 将 无助 于 解决 您 的 错误 , 因为 数据 提取 是 由 执行器 完成 的 。 您 的 错误 还 显示 Java 堆 空间 OOM 错误 是 在 执行器 中 阶段 1.0 的 任务 0.0 期间 发生 的 。
根据 您 提供 的 代码 和 配置 , 您 没有 配置 任何 连接 属性 , 所有 参数 都 使用 默认 值 。 因此 , 当 您 从 Postgresql 读取 大 数据 集 时 , 您 的 spark 应用 程序 可能 只 使用 单个 执行器 来 处理 此 操作 。 在 这种 情况 下 , 不 确定 如何 配置 执行器 , 它 可能 会 通过 读取 大 数据 集 触发 OOM 错误 。
当 我们 在 spark 中 使用 JDBC 时 , 并行 性 是 spark 应用 程序 性能 最 关键 的 部分 之 一 。 增加 执行器 的 数量 只是 增加 并行 性 的 方法 之 一 , 也 是 增加 分区 的 数量 。 此外 ,
batchsize
、lowerBound
和upperBound
的 值 可以 提高 性能 和 增加 并行 性 。了解 Spark 配置 的 最 佳 方式 是 通过 Spark 文档 :https://spark.apache.org/docs/latest/configuration.html , 对于 JDBC 部件 , 可以 选中 以下 选项 :另外 , 我 建议 您 观看 这 篇 文章 , 因为 它 很 好 地 介绍 了 JDBC 阅读 中 的 spark 优化 。
由于 性能 会 受到 数据 库 、 JDBC 设计 、 网络 、 数据 库 使用 的 磁盘 等 因素 的 影响 , 没有 一 个 标准 的 解决 方案 或 参数 可以 在 不同 的 情况 下 适用 和 优化 。