spark如何处理hdfs压缩文件以及如何选择hdfs压缩编解码器(splittable或不可拆分)

时间:2017-10-18 08:30:27

标签: hadoop apache-spark split compression bz2

背景:

我们有一个项目使用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块的关系,压缩文件的输入拆分和火花分区,可拆分和不可拆分压缩)

  1. 如何处理压缩分区?

    spark的每个执行程序都会将其分配的分区解压缩为spark块并对块进行转换和操作吗?

  2. 如果我们删除解压缩时间,哪一个更慢?

    cnCompress计算速度会慢吗?因为只有2个分区,只有两个节点会进行转换和操作。对于cnFlat,有8个分区。

  3. 选择压缩编解码器(splittableor不可拆分)时,是否需要考虑压缩大小?

    压缩后,如果压缩大小小于或等于HDFS块大小。 在splittable方面,我们选择splittableor而不是splittable压缩编解码器是没有意义的,因为spark RDD只有一个分区(我的意思是只有一个worker会处理rdd)?

0 个答案:

没有答案