`

[转] lzo本地压缩与解压缩实例

阅读更多
  1. /** 
  2.  * @author HJX 
  3.  * @version 1.0,2013-01-16 
  4.  * @since JDK1.7,Ubuntu-12.04-64bit 
  5.  * 在hadoop环境下运行 
  6.  * 将一个String写入到本地lzo文件中(不是hadoop的hdfs上) 
  7.  * 再从该lzo文件中读取出来并与原String进行校对 
  8.  */  
  9.   
  10. import java.io.BufferedReader;  
  11. import java.io.FileInputStream;  
  12. import java.io.FileNotFoundException;  
  13. import java.io.FileOutputStream;  
  14. import java.io.IOException;  
  15. import java.io.InputStream;  
  16. import java.io.InputStreamReader;  
  17. import java.io.OutputStream;  
  18. import java.util.ArrayList;  
  19. import java.util.List;  
  20.   
  21. import org.apache.hadoop.conf.Configuration;  
  22.   
  23. import com.hadoop.compression.lzo.LzopCodec;  
  24.   
  25. public class LzoCompress {  
  26.   
  27.     /** 
  28.      * @param args 
  29.      */  
  30.     public static void main(String[] args) {  
  31.         //生成数据  
  32.         String dataSource = "abcdefghijklmnopqrstuvwxyz0123456789~!%#^@*#*%$(\n";  
  33.         dataSource = dataSource.concat(dataSource);  
  34.         dataSource = dataSource.concat(dataSource);  
  35.         dataSource = dataSource.concat(dataSource);  
  36. /*        System.out.println("dataSource = " + dataSource);*/  
  37.         String lzoFilePath = "/home/hadoop/LzoCompressTest.lzo";  
  38.           
  39.         //写入到lzo文件,即lzo压缩  
  40.         write2LzoFile(lzoFilePath, getDefaultConf(),dataSource.getBytes());  
  41.         StringBuilder sb = new StringBuilder();  
  42.           
  43.         //读取lzo文件,即lzo解压缩  
  44.         List<String> lines = readLzoFile(lzoFilePath, getDefaultConf());  
  45.         for(String line : lines) {  
  46.             sb.append(line);  
  47.             //LINUX/UNIX 下添加一个换行符  
  48.             sb.append("\n");              
  49. /*            //Windows 下添加一个换行符 
  50.             sb.append("\r\n");*/  
  51.         }  
  52.         if (sb.toString().equals(dataSource)) {  
  53.             System.out.println(sb.toString());  
  54.         } else {  
  55.             System.err.println("Error line : " + sb.toString());  
  56.         }  
  57.     }  
  58.   
  59.     private static Configuration getDefaultConf(){  
  60.         Configuration conf = new Configuration();  
  61.         conf.set("mapred.job.tracker""local");  
  62.         conf.set("fs.default.name""file:///");  
  63.         conf.set("io.compression.codecs""com.hadoop.compression.lzo.LzoCodec");  
  64.         return conf;  
  65.     }  
  66.       
  67.     /** 
  68.      * 写数据到lzo文件,即lzo压缩 
  69.      * @param destLzoFilePath 
  70.      * @param conf 
  71.      * @param datas 
  72.      * @return void 
  73.      */  
  74.     public static void write2LzoFile(String destLzoFilePath,Configuration conf,byte[] datas) {  
  75.         LzopCodec lzo = null;  
  76.         OutputStream out = null;  
  77.           
  78.         try {  
  79. /*          System.setProperty("java.library.path", "/usr/local/hadoop/lib/native/Linux-amd64-64/lib");*/  
  80.             lzo = new LzopCodec();  
  81.             lzo.setConf(conf);  
  82.             out = lzo.createOutputStream(new FileOutputStream(destLzoFilePath));  
  83.             out.write(datas);  
  84.         } catch (FileNotFoundException e) {  
  85.             e.printStackTrace();  
  86.         } catch (IOException e) {  
  87.             e.printStackTrace();  
  88.         } finally {  
  89.             try {  
  90.                 if(out != null) {  
  91.                     out.close();  
  92.                 }  
  93.             } catch (IOException e) {  
  94.                 e.printStackTrace();  
  95.             }  
  96.         }  
  97.     }  
  98.       
  99.     /** 
  100.      * 从lzo文件中读取数据,即lzo解压缩 
  101.      * @param lzoFilePath 
  102.      * @param conf 
  103.      * @return void 
  104.      */  
  105.     public static List<String> readLzoFile(String lzoFilePath,Configuration conf) {  
  106.         LzopCodec lzo = null;  
  107.         InputStream is = null;  
  108.         InputStreamReader isr = null;  
  109.         BufferedReader reader = null;  
  110.         List<String> result = null;  
  111.         String line = null;  
  112.           
  113.         try {  
  114. /*          System.setProperty("java.library.path", "/usr/local/hadoop/lib/native/Linux-amd64-64/lib");*/  
  115.             lzo = new LzopCodec();  
  116.             lzo.setConf(conf);  
  117.             is = lzo.createInputStream(new FileInputStream(lzoFilePath));  
  118.             isr = new InputStreamReader(is);  
  119.             reader = new BufferedReader(isr);  
  120.             result = new ArrayList<String>();  
  121.             while((line = reader.readLine()) != null) {  
  122.                 result.add(line);  
  123.             }  
  124.         } catch (FileNotFoundException e) {  
  125.             e.printStackTrace();  
  126.         } catch (IOException e) {  
  127.             e.printStackTrace();  
  128.         } finally {  
  129.             try {  
  130.                 if (reader != null) {  
  131.                     reader.close();  
  132.                 }  
  133.                 if (isr != null) {  
  134.                     isr.close();  
  135.                 }  
  136.                 if (is != null) {  
  137.                     is.close();  
  138.                 }  
  139.             } catch (IOException e) {  
  140.                 e.printStackTrace();  
  141.             }  
  142.         }  
  143.           
  144.         return result;  
  145.     }  
  146. }  

 

 

 

程序是没有错的,但是一开始运行的时候总会提示无法读取libgplcompression这个库,其实我知道少了哪些库的,分别是
libgplcompression.a
libgplcompression.la
libgplcompression.so
libgplcompression.so.0
libgplcompression.so.0.0.0
可问题是把这些库放在哪里。尝试过把这几个库放在$CLASSPATH下面,但没用。于是查看了错误提示,提示缺少的这个库在 com.hadoop.compression.lzo.GPLNativeCodeLoader这个类里面被引用到,于是看了一下hadoop- lzo-0.45.jar的源文件(当时编译hadoop-lzo-0.45.jar时留下的源文件,在kevinweil-hadoop-lzo- 6bb1b7f/src/java/com/hadoop/compression/lzo/里),GPLNativeCodeLoader.java的 内容是这样的:

 

  1. package com.hadoop.compression.lzo;  
  2.   
  3. import org.apache.commons.logging.Log;  
  4. import org.apache.commons.logging.LogFactory;  
  5.   
  6. public class GPLNativeCodeLoader {  
  7.   
  8.   private static final Log LOG = LogFactory.getLog(GPLNativeCodeLoader.class);  
  9.   private static boolean nativeLibraryLoaded = false;  
  10.   
  11.   static {  
  12.     try {  
  13.       //try to load the lib  
  14.       System.loadLibrary("gplcompression");  
  15.       nativeLibraryLoaded = true;  
  16.       LOG.info("Loaded native gpl library");  
  17.     } catch (Throwable t) {  
  18.       LOG.error("Could not load native gpl library", t);  
  19.       nativeLibraryLoaded = false;  
  20.     }  
  21.   }  
  22.   
  23.   /** 
  24.    * Are the native gpl libraries loaded? 
  25.    * @return true if loaded, otherwise false 
  26.    */  
  27.   public static boolean isNativeCodeLoaded() {  
  28.     return nativeLibraryLoaded;  
  29.   }  
  30.   
  31. }  


这里跟load那个libgplcompression库 有关的语句应该是try语句块里面的那个System.loadLibrary("gplcompression");

 

于是我再查了一下这个loadLibrary的动作到底是怎样的动作。于是在这篇blog里找到了解答:http://blog.csdn.net/forandever/article/details/5983846

 

System.loadLibrary()load的是 java.library.path这一jvm变量所指向的路径中的库。那我只要把那些libgplcompression库 所在的文件夹加入到java.library.path里面不就行了~于是我查找设置java.library.path的方法,

 

方法1:命令行

 

java -Djava.library.path=/path/to/libgplcompression/ ***.class

 

方法2:java语句

 

在程序里加入这么一句,System.setProperty("java.library.path", "/path/to/libgplcompression/");

 

就找了这么2个方法,可是这2个方法都只能临时改变java.library.path的值!

 

除了这2个方法,我找不到别的方法了,累死了,不再找了,索性把libgplcompression这些库给copy到java.library.path指向的文件夹里!

 

copy完后,再次执行,OK了!

 

要获取java.library.path的值,可以用java语句

 

System.out.println(System.getProperty("java.library.path"));

 

我的是

/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
参考资料:

 

 

gpllibcompression库以及hadoop-lzo-0.4.15.jar下载链接

http://pan.baidu.com/s/1mgJQ1tQ

分享到:
评论

相关推荐

    Lzo压缩算法.例子(vs2005)

    Lzo 压缩算法 Lzo压缩 vs2005 例子Lzo 压缩算法 Lzo压缩 vs2005 例子Lzo 压缩算法 Lzo压缩 vs2005 例子Lzo 压缩算法 Lzo压缩 vs2005 例子

    无损数据解压缩LZO Decompression IP

    LZOAccel-D是一个无损数据解压缩引擎的FPGA硬件实现,兼容LZO 2.10标准。 Core接收压缩的输入数据块,产生解压缩后的数据块。Core分析数据块的头和尾,检查输入数据块的错误,并且输出解压缩后的数据载荷,所以用户...

    LZO数据压缩算法库

    LZO是致力于解压速度的一种数据压缩算法,LZO是Lempel-Ziv-Oberhumer的缩写。这个算法是无损算法,参考实现程序是线程安全的。 LZO库实现了许多有下述特点的算法: • 解压简单,速度非常快。 • 解压不需要内存。 ...

    Lzo压缩安装包

    Lzo压缩、解压缩安装包。包括Lzo,Lzop,hadoop-lzo的安装包。在Linux,AIX亲测可用。

    基于FPGA的LZO实时无损压缩的硬件设计

    本文通过对多种压缩算法作进一步研究对比后发现,LZO压缩算法是一种被称为实时无损压缩的算法,LZO压缩算法在保证实时压缩速率的优点的同时提供适中的压缩率。如图1(A)给出了Linux操作系统下常见开源压缩算法的压缩...

    22、MapReduce使用Gzip压缩、Snappy压缩和Lzo压缩算法写文件和读取相应的文件

    本文最好和MapReduce操作常见的文件文章一起阅读,因为写文件与压缩往往是结合在一起的。 相关压缩算法介绍参考文章:HDFS文件类型与压缩算法介绍。 本文介绍写文件时使用的压缩算法,包括:Gzip压缩、Snappy压缩和...

    STM32移植 MINI LZO2.09压缩算法

    STM32移植 MINI LZO2.09压缩算法 编译通过 可以直接烧录运行 使用STM32F103VET6

    lzo压缩算法源码

    lzo压缩算法源码,比较全面!!

    lzo压缩算法 例子

    lzo压缩算法 例子 可运行 可查看 很方便 文件是网上下的

    配置hadoop支持LZO和snappy压缩.pdf

    配置hadoop支持LZO和snappy压缩

    lzo2.0.9压缩工具

     (5)、允许在压缩部分以损失压缩速度为代价提高压缩率,解压速度不会降低。  (6)、包括生成预先压缩数据的压缩级别,这样可以得到相当有竞争力的压缩比。  (7)、另外还有一个只需要8 kB内存的压缩级别。  ...

    LZO 压缩算法 纯pascal 语言

    LZO 压缩算法 纯pascal 语言 压缩速度应该很不错

    lzo压缩算法

    lzo压缩算法,windows 32位。lzop is a file compressor which is very similar to gzip. lzop uses the LZO data compression library for compression services, and its main advantages over gzip are much ...

    Go-go-lzop-生成LZOP文件兼容LZO压缩库

    go-lzop - 生成LZOP文件兼容LZO压缩库

    图形图像压缩资料(LZO+LZSS+LZW)

    图形图像压缩资料(LZO+LZSS+LZW) 有代码 有例子 有文档 !无损压缩算法C、C++源代码,好资料,共享下!

    LZO 压缩算法 纯pascal 语言 支持x64

    前面传的出现解包不全的现象,现在这个经过测试 工作是正常的 , 支持64位编译器

    嵌入式系统/ARM技术中的基于FPGA的LZO实时无损压缩的硬件设计

     1 LZO压缩算法基本原理分析 1.1 LZO压缩算法压缩原理 LZO压缩算法采用(重复长度L,指回距离D)代替当前已经在历史字符串中出现过的字符串,其中,重复长度是指,后出现的字符串与先出现的字符串中

Global site tag (gtag.js) - Google Analytics