首页 > 解决方案 > 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.partitions2000增加到,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")

标签: apache-spark

解决方案


我的观察很少,

  1. 当您最后在驱动程序上收集数据时,它需要有足够的内存来保存完整的 json 输出。12g 对于该 IMO 来说内存不足。

  2. 200g executor memory 被注释了,然后分配了多少?执行器也需要足够的内存来处理/转换这些繁重的数据。如果驱动程序分配有 12g 并且如果您总共有 16 个,那么考虑到系统上运行的其他应用程序,执行程序的唯一可用内存为 1-2gb。有可能得到OOM。我建议查找驱动程序或执行程序是否缺少内存

  3. 最重要的是,Spark 旨在在多台机器上并行处理数据以获得最大吞吐量。如果你想在单机/单执行器/单核等上处理这个,那么你根本就没有享受到 Spark 的好处。

不知道为什么要将其作为单个文件进行处理,但我建议您再次重新审视您的计划并以 spark 能够利用其优势的方式处理它。希望这可以帮助。


推荐阅读