将自定义代码添加到Hadoop / Spark - 压缩编解码器

时间:2016-06-03 07:17:36

标签: java scala hadoop apache-spark

在处理数据压缩时,Spark支持底层Hadoop基础架构中的各种压缩方案。例如Snappy(默认),LZ4,LZF,GZIP。

如何指定使用与现有编解码器不同的用户构建的自定义编解码器顺序。比如说,我的编解码器叫做DUMB。如何使用DUMB而不是默认的Snappy。我查看了CompressionCodecFactory类(https://hadoop.apache.org/docs/r1.2.1/api/org/apache/hadoop/io/compress/CompressionCodecFactory.html),但仍然不太了解如何连接线程。有没有人做过类似的事情,或有任何提示?

编辑:基于@Paweł_Jurczenko的回答,我添加了更多细节。

这是DUMB:

public class Dumb{

  public Dumb() {

  }

  public int CompressIt(InBuffers inBuffs) {
    return CallCompressor(inBuffs);
  } 
}

* InBuffers是一个实现要压缩的缓冲区列表的类,而CallCompressor则执行脏的地下工作。

要在主类中使用DUMB,我会这样做:

Dumb myDumbComp = new Dumb();
myDumbComp.CompressIt(inBuffs)     //inBuffs is a List of individual input buffers

但是现在,我希望有一个标准的CompressionCodec接口,通过它我可以在Hadoop中调用该方法。

1 个答案:

答案 0 :(得分:2)

首先,您的自定义编解码器应该实现CompressionCodec接口。然后,您应该将spark.io.compression.codec属性设置为编解码器的完全限定类名,例如:

val sparkConf: SparkConf = new SparkConf()
  .setAppName("...")
  .set("spark.io.compression.codec", "com.organization.compress.CustomCodec")
val sc: SparkContext = new SparkContext(sparkConf)

从现在开始,您的CustomCodec将在压缩内部Spark数据期间使用,如RDD分区,广播变量和随机输出。当然,您的编解码器必须存在于类路径中。如果您还要压缩输出数据,则应设置hadoopConfiguration的以下属性(SparkContext的一部分):

sc.hadoopConfiguration.set("mapreduce.output.fileoutputformat.compress", "true")
sc.hadoopConfiguration.set("mapreduce.output.fileoutputformat.compress.codec", "com.organization.compress.CustomCodec")
sc.hadoopConfiguration.set("mapreduce.output.fileoutputformat.compress.type", "BLOCK")