我有一个用例,其中我要流式传输要压缩的宽(> 50k列)实木复合地板文件以进一步使用。
我已经证实,一旦数据被压缩,查询列的子集并执行过滤器就足够快,表明镶木地板适合此任务。
但是,即使数据很少,压缩(spark.read.parquet-> df.coalesce(1)-> df.write.parquet)还是有问题的。即,出现以下Spark错误:
ERROR SparkUncaughtExceptionHandler:线程中未捕获的异常 Thread [FileScanRDD-0,5,main] java.lang.OutOfMemoryError:直接缓冲区 记忆
由于我要写一个实木复合地板,因此我使用的是1执行程序集群。
我已经从谷歌搜索中尝试了很多Spark和jvm内存选项,但似乎唯一有帮助的是仅使用具有更多内存的节点并将内存设置保留为默认设置。但是,仅压缩总共200MB的50个实木复合地板文件已经需要600GB的内存节点,并且需要2个小时。由于我已经使用了我可以访问的最大节点,因此无法一次压缩更多文件。这些发现令人惊讶,并且使我怀疑实木复合地板对于这种用例的适用性。
有人用合理数量的资源来压缩宽阔的镶木地板文件吗,还是对内存问题有想法?
我正在使用独立的spark 2.3.2和Azure blob存储。