输入文件大小:从2MB到4GB的文件大小。
集群规格:1个主人+4个节点:C3.8xls–driver记忆 5G </跨度> \ - 执行器 - 内存3G \–executor-cores 2 \–num-executors 60 \
代码
由于没有指定,我假设在我的回答中使用gzip和Spark 2.2。
就在这里。 Spark是一个Hadoop项目,因此即使它是基于对象的文件系统,也将S3视为基于块的文件系统。 所以真正的问题是:你使用的是S3文件系统的哪个实现(s3a,s3n)等。可以找到类似的问题 这里 。
Spark文档 表明它能够读取压缩文件:
所有Spark s基于文件的输入方法(包括textFile)都支持在目录,压缩文件和通配符上运行。例如,您可以使用textFile(“/ my / directory”),textFile(“/ my / directory / .txt”)和textFile(“/ my / directory / .gz”)。
这意味着您的文件很容易读取并转换为每行的纯文本字符串。
但是,您使用的是压缩文件。假设它是一种不可拆分的格式,例如gzip,则需要整个文件进行解压缩。您运行的是3gb执行程序,它可以很好地满足4mb-1gb文件的需要,但不能同时处理大于3gb的文件(可能在考虑开销后较小)。
在此可以找到更多信息 题 。可拆分压缩类型的详细信息可在此处找到 回答 。
作为前一点的必然结果,这意味着火花在读取明文时对RDD进行了解压缩。在重新上传时,它不再被压缩。要压缩,您可以将压缩编解码器作为参数传递:
sc.saveAsTextFile("s3://path", classOf[org.apache.hadoop.io.compress.GzipCodec])
还有其他压缩格式可用。