hadoop 中对Vlong 和 Vint的压缩方法

hadoop
中对java的基本类型进行了writeable的封装,并且所有这些writeable都是继承自WritableComparable的,都是可比较的;并且,它们都有对应的get()
和 set()方法,

其中对整型(int 和
long)进行编码的时候,有固定长度格式(intWritable和LongWritable)和可变长度格式(VIntWritable 和
VLongWritable),其中VIntWritable和VLongWritable的编码规则是一样的,

所以VIntWritable的输出可以用VLongWritable读入。其实在VIntWritable的write(DataOUtput out) 与
readFields(DataInput
in)中分别调用的是WritableUtils.writeVint(out)和WritableUtils.readVint(int),

而writeVint()和readVint()方法也只是简单的调用了writeVLong和readVLong方法。通过writeVInt()写入的数据自然可以通过readVLong()来进行读人;编码规则如下:

其基本思想  主要思想是大的负数的压缩 ,先反码操作,将负数取反,负数一旦取反,前面的字节就有可能变零了。 然后没八位一组截取成
一个字节

写入

  1. public static void writeVLong(DataOutput stream, long i) throws IOException {

  2. // 如果在一个字节可以表示的范围内 直接返回

  3. if (i >= -112 && i <= 127) {

  4. stream.writeByte((byte)i);

  5. return;

  6. }

  7. //把负数变成正数

  8. int len = -112;

  9. if (i < 0) {

  10. i ^= -1L; // take one‘s complement‘

  11. len = -120;

  12. }
  13. //判断正数有几个位数 通过右移实现

  14. long tmp = i;

  15. while (tmp != 0) {

  16. tmp = tmp >> 8;

  17. len--;

  18. }
  19. // 写入第一个字节 该字节标识 这个数十正数还是负数 以及接下来有几个字节属于这个数

  20. stream.writeByte((byte)len);
  21. // 判断需要几个字节表示该数

  22. len = (len < -120) ? -(len + 120) : -(len + 112);
  23. //以每八位一组截取 成一个字节
  24. for (int idx = len; idx != 0; idx--) {

  25. int shiftbits = (idx - 1) * 8;

  26. long mask = 0xFFL << shiftbits;

  27. stream.writeByte((byte)((i & mask) >> shiftbits));

  28. }

  29. }

读取

  1. public static long readVLong(byte[] bytes, int start) throws IOException {

  2. int len = bytes[start];

  3. if (len >= -112) {

  4. return len;

  5. }

  6. boolean isNegative = (len < -120);

  7. len = isNegative ? -(len + 120) : -(len + 112);

  8. if (start+1+len>bytes.length)

  9. throw new IOException(

  10. "Not enough number of bytes for a zero-compressed integer");

  11. long i = 0;

  12. for (int idx = 0; idx < len; idx++) {

  13. i = i << 8;

  14. i = i | (bytes[start+1+idx] & 0xFF);

  15. }

  16. return (isNegative ? (i ^ -1L) : i);

  17. }

hadoop 中对Vlong 和 Vint的压缩方法,布布扣,bubuko.com

时间: 2024-10-25 08:55:11

hadoop 中对Vlong 和 Vint的压缩方法的相关文章

关于学习Hadoop中未总结的资料

出自:http://www.cnblogs.com/xia520pi/archive/2012/01/02/2310118.html 1)Cygwin相关资料 (1)Cygwin上安装.启动ssh服务失败.ssh localhost失败的解决方案 地址:http://blog.163.com/pwcrab/blog/static/16990382220107267443810/ (2)windows2003+cygwin+ssh 地址:http://wenku.baidu.com/view/37

Hadoop中最不容错过的压缩知识

随着大数据时代的来临,数据体量越来越大,处理这些数据会越来越受到网络IO的限制,为了尽可能多的处理更多的数据我们必须使用压缩.那么压缩在Hadoop里面是不是所有格式都适用呢?它都有哪些性能呢? 压缩在sqoop里面可以做,在hive和impala里面也可以做.那么什么情况下我们会用压缩呢?通常在数据量非常大,我们通过压缩去减小数据量,从而达到将来去使用数据的时候,减少数据传输IO的情况下去使用.压缩对于性能的提升以及存储效率的提高也有作用. 一.数据压缩 每种文件格式都支持压缩,压缩将减少磁盘

[转] - hadoop中使用lzo的压缩

在hadoop中使用lzo的压缩算法可以减小数据的大小和数据的磁盘读写时间,不仅如此,lzo是基于block分块的,这样他就允许数据被分解成chunk,并行的被hadoop处理.这样的特点,就可以让lzo在hadoop上成为一种非常好用的压缩格式. lzo本身不是splitable的,所以当数据为text格式时,用lzo压缩出来的数据当做job的输入是一个文件作为一个map.但是sequencefile本身是分块的,所以sequencefile格式的文件,再配上lzo的压缩格式,就可实现lzo文

hadoop中4种压缩格式的特征的比较

1 gzip压缩 优点:压缩率比较高,而且压缩/解压速度也比较快:hadoop本身支持,在应用中处理gzip格式的文件就和直接处理文本一样:有hadoop native库:大部分linux系统都自带gzip命令,使用方便. 缺点:不支持split. 应用场景:当每个文件压缩之后在130M以内的(1个块大小内),都可以考虑用gzip压缩格式.譬如说一天或者一个小时的日志压缩成一个gzip 文件,运行mapreduce程序的时候通过多个gzip文件达到并发.hive程序,streaming程序,和j

浅谈hadoop中mapreduce的文件分发

最近在做数据分析的时候,需要在mapreduce中调用c语言写的接口,此时就需要把动态链接库so文件分发到hadoop的各个节点上,原来想自己来做这个分发,大概过程就是把so文件放在hdfs上面,然后做mapreduce的时候把so文件从hdfs下载到本地,但查询资料后发现hadoop有相应的组件来帮助我们完成这个操作,这个组件就是DistributedCache,分布式缓存,运用这个东西可以做到第三方文件的分发和缓存功能,下面详解: 如果我们需要在map之间共享一些数据,如果信息量不大,我们可

Hadoop中Combiner的使用

文章转载于:http://blog.csdn.net/ipolaris/article/details/8723782 Hadoop中Combiner的使用 在MapReduce中,当map生成的数据过大时,带宽就成了瓶颈,怎样精简压缩传给Reduce的数据,有不影响最终的结果呢.有一种方法就是使用Combiner,Combiner号称本地的Reduce,Reduce最终的输入,是Combiner的输出.下面以<Hadoop in action>中的专利数据为例.我们打算统计每个国家的专利数目

Hadoop中map数的计算

转载▼ Hadoop中在计算一个JOB需要的map数之前首先要计算分片的大小.计算分片大小的公式是: goalSize = totalSize / mapred.map.tasks minSize = max {mapred.min.split.size, minSplitSize} splitSize = max (minSize, min(goalSize, dfs.block.size)) totalSize是一个JOB的所有map总的输入大小,即Map input bytes.参数map

Hadoop技术内幕HDFS-笔记4之压缩

1.1.  压缩 减少存储空间,加快传输速率 在hadoop中,压缩应用于文件存储.Map端到Reduce端的数据交换等情景. hadoop,主要考虑压缩速率和压缩文件的可分割性 压缩算法:时间和空间的权衡 更快的压缩和解压缩效率通常压缩比较低. hadoop提供了对压缩算法的编码和解码器类 编码和解码示例(采用gzip) package test; import java.io.File; import java.io.FileInputStream; import java.io.FileO

hadoop中mapreduce的常用类(一)

云智慧(北京)科技有限公司陈鑫 写这个文章的时候才意识到新旧API是同时存在于1.1.2的hadoop中的.以前还一直纳闷儿为什么有时候是jobClient提交任务,有时是Job...不管API是否更新,下面这些类也还是存在于API中的,经过自己跟踪源码,发现原理还是这些.只不过进行了重新组织,进行了一些封装,使得扩展性更好.所以还是把这些东西从记事本贴进来吧. 关于这些类的介绍以及使用,有的是在自己debug中看到的,多数为纯翻译API的注释,但是翻译的过程受益良多. GenericOptio