我们有一个项目使用spark处理一些log / csv文件,每个文件都非常大,例如20GB。
所以我们需要压缩log / csv文件
HDFS块大小:128M,我们有一个1GB的日志文件。
如果文件未压缩,则HDFS中将有8个块
var rddFlat = sc.textFile("hdfs:///tmp/test.log")
rddFlat.partition.length将为8(因为将有8个输入拆分)
如果使用bzip2,假设压缩后的压缩大小为256MB(实际上bz具有高压缩比),则会有2个块
var rddCompress = sc.textFile("hdfs:///tmp/test.log.bz2")
rddCompress.partition.length将为2(是不是?)
如果我们有以下转型和行动
var cnFlat = rddFlat.map(x => x.contains("error")).count();
var cnCompress = rddCompress.map(x => x.contains("error")).count();
(HDFS块的关系,压缩文件的输入拆分和火花分区,可拆分和不可拆分压缩)
如何处理压缩分区?
spark的每个执行程序都会将其分配的分区解压缩为spark块并对块进行转换和操作吗?
如果我们删除解压缩时间,哪一个更慢?
cnCompress计算速度会慢吗?因为只有2个分区,只有两个节点会进行转换和操作。对于cnFlat,有8个分区。
选择压缩编解码器(splittableor不可拆分)时,是否需要考虑压缩大小?
压缩后,如果压缩大小小于或等于HDFS块大小。 在splittable方面,我们选择splittableor而不是splittable压缩编解码器是没有意义的,因为spark RDD只有一个分区(我的意思是只有一个worker会处理rdd)?