apache-spark - Spark - 在 16 GB RAM 单机中将 54 GB CSV 文件转换为单个 JSON
问题描述
我想获取一个 CSV 文件并转换为单个 JSON,我已经编写并验证了代码。我有一个 54 GB 的 CSV 文件,我想将此单个文件转换并导出为单个 JSON,我想在 Spark 中获取此数据,它将使用 SparkSQLcollect_set(struct
内置函数设计 JSON。我只在一台机器上运行 Eclipse IDE 中的 Spark 作业。机器配置有 16 GB RAM、i5 处理器、600 GB 硬盘。
现在,当我尝试运行 spark 程序时,它会抛出java.lang.OutOfMemory
堆大小不足的错误。我试图将spark.sql.shuffle.partitions
值2000
增加到,20000
但由于我提到的相同错误,在加载后和转换过程中作业仍然失败。
我不想将单个 CSV 拆分为多个部分,我想处理这个单个 CSV,我该如何实现?需要帮忙。谢谢。
火花配置:
val conf = new SparkConf().setAppName("App10").setMaster("local[*]")
// .set("spark.executor.memory", "200g")
.set("spark.driver.memory", "12g")
.set("spark.executor.cores", "4")
.set("spark.driver.cores", "4")
// .set("spark.testing.memory", "2147480000")
.set("spark.sql.shuffle.partitions", "20000")
.set("spark.driver.maxResultSize", "500g")
.set("spark.memory.offHeap.enabled", "true")
.set("spark.memory.offHeap.size", "200g")
解决方案
我的观察很少,
当您最后在驱动程序上收集数据时,它需要有足够的内存来保存完整的 json 输出。12g 对于该 IMO 来说内存不足。
200g executor memory 被注释了,然后分配了多少?执行器也需要足够的内存来处理/转换这些繁重的数据。如果驱动程序分配有 12g 并且如果您总共有 16 个,那么考虑到系统上运行的其他应用程序,执行程序的唯一可用内存为 1-2gb。有可能得到OOM。我建议查找驱动程序或执行程序是否缺少内存
最重要的是,Spark 旨在在多台机器上并行处理数据以获得最大吞吐量。如果你想在单机/单执行器/单核等上处理这个,那么你根本就没有享受到 Spark 的好处。
不知道为什么要将其作为单个文件进行处理,但我建议您再次重新审视您的计划并以 spark 能够利用其优势的方式处理它。希望这可以帮助。
推荐阅读
- c# - 使用 LINQ 将 CSV 读取到对象时出现字符串格式错误
- swift - 如何在不快速舍入的情况下划分双精度值?
- scala - 如何在Scala中定义极限值的类型?
- c# - 如何修复此代码进入的无限循环?
- google-apps-script - 有没有办法在 gmail 插件卡中显示 gmail 可编辑的 html 消息内容?
- excel - 日期和时间最接近匹配excel
- maven - NPM 安装不适用于 maven(错误:找不到模块 '../lib/utils/unsupported.js')
- python - 在 python 中解析或运行 docker shell 命令
- angular - *cdkDragPreview 定位角材质
- perl - cpan 错误:无法获取终端大小。Win32 GetConsoleScreenBufferInfo 调用不起作用