问题
项目中碰到一个新问题,需要利用Spark分析海量小文件,具体大概是这样的:
海量的双层压缩包:
数量可能几十万或更多,文件大小从几KB到几MB不等,可能是zip+zip压缩,也可能是zip+gz压缩。分析发现,外层的ZIP包中可能含有多个文件,内层的zip或gz包中只会有一个csv文件。
实际表头格式也有多种,但处理方法和具体业务结合的较多,本问不再赘述。
不同压缩方式的文件混在一起,无法在获取的时候自动分拣。
非主流的Spark使用方法:
由于存在一些现实因素,再加上担心hadoop对海量小文件支持的不好,因此实验环境是一个单机多进程(多个worker)的spark环境,文件存储在本地,而非HDFS,诸如newapihadoopfile等高大上的接口并没进行分析测试,但貌似整个apache生态圈都不太支持zip。
对于rdd和Dataframe的困惑:
过去提到Spark,接下来肯定是讨论rdd了。但Spark2.0之后,强化了Dataframe体系(DF),比如Spark机器学习的Mlib库,现在有两套接口,一套rdd的,一套DF的,而且官方更推荐使用后者。基于DF可以建立表,可以使用SQL,非常的方便,但我还不太熟悉这个体系。
对于本项目的情况,无论RDD还是DF体系都不能原生支持读取zip。但是都可以透明的读取gz,也就是把gz文件(目录)当作txt或csv等格式直接读取。(没卵用啊)
我的方案
搞了两种方案供大家参