Spark-在16 GB RAM单机中将54 GB CSV文件转换为单个JSON

时间:2018-08-16 05:18:49

标签: apache-spark

我想获取一个CSV文件并转换为单个JSON,我已经编写并验证了代码。我有一个54 GB的CSV文件,我想将此单个文件转换并导出为单个JSON,我想在Spark中获取此数据,它将使用SparkSQL -- compute this once, instead of for each row Declare @now_minus_6mos as date = DATEADD(month, -6, GETDATE()); print @now_minus_6mos; select 'item' AS type, soitem.productnum as 'SKU', (soitem.unitprice / 1 ) as unitPrice, -- I do not have UOM, so simplify to be one -- I do not have Customer replace(customer.name, "#", "") AS priceList, (soitem.dateLastFulfillment) -- remove the max, since we are getting only the last one from (Select * From (Select productnum ,unitprice ,dateLastFulfillment ,Row_Number() Over(Partition By productnum Order By dateLastFulfillment DESC) as dlfRow From soitem --move where filters here to reduce number of rows returned Where soitem.dateLastFulfillment > @now_minus_6mos and soitem.unitprice > 0 ) aa Where dlfRow = 1 ) soitem 内置函数来设计JSON。 我仅在一台机器上在Eclipse IDE中运行Spark作业。机器配置具有16 GB RAM,i5处理器,600 GB HDD。

现在,当我尝试运行spark程序时,它抛出collect_set(struct并且堆大小不足错误。我试图将java.lang.OutOfMemory的值spark.sql.shuffle.partitions增加到2000,但是由于我提到的相同的错误,在加载后和转换期间作业仍然失败。

我不想将单个CSV拆分为多个部分,我想处理该单个CSV,如何实现呢?需要帮忙。谢谢。

火花配置:

20000

1 个答案:

答案 0 :(得分:0)

我这边的观察很少,

  1. 在驱动程序末尾收集数据时,它需要有足够的内存来保存完整的json输出。 12g不足以容纳该IMO。

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

  4. 最重要的是,Spark旨在在多台计算机上并行处理数据以获取最大吞吐量。如果您想在单机/单执行器/单核等上进行处理,那么您根本就不会利用Spark。

不确定为什么要将其作为一个文件处理,但是我建议再次重新访问您的计划,并以Spark能够利用其好处的方式对其进行处理。希望这会有所帮助。