- /**
- * @author HJX
- * @version 1.0,2013-01-16
- * @since JDK1.7,Ubuntu-12.04-64bit
- * 在hadoop环境下运行
- * 将一个String写入到本地lzo文件中(不是hadoop的hdfs上)
- * 再从该lzo文件中读取出来并与原String进行校对
- */
- import java.io.BufferedReader;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import java.io.OutputStream;
- import java.util.ArrayList;
- import java.util.List;
- import org.apache.hadoop.conf.Configuration;
- import com.hadoop.compression.lzo.LzopCodec;
- public class LzoCompress {
- /**
- * @param args
- */
- public static void main(String[] args) {
- //生成数据
- String dataSource = "abcdefghijklmnopqrstuvwxyz0123456789~!%#^@*#*%$(\n";
- dataSource = dataSource.concat(dataSource);
- dataSource = dataSource.concat(dataSource);
- dataSource = dataSource.concat(dataSource);
- /* System.out.println("dataSource = " + dataSource);*/
- String lzoFilePath = "/home/hadoop/LzoCompressTest.lzo";
- //写入到lzo文件,即lzo压缩
- write2LzoFile(lzoFilePath, getDefaultConf(),dataSource.getBytes());
- StringBuilder sb = new StringBuilder();
- //读取lzo文件,即lzo解压缩
- List<String> lines = readLzoFile(lzoFilePath, getDefaultConf());
- for(String line : lines) {
- sb.append(line);
- //LINUX/UNIX 下添加一个换行符
- sb.append("\n");
- /* //Windows 下添加一个换行符
- sb.append("\r\n");*/
- }
- if (sb.toString().equals(dataSource)) {
- System.out.println(sb.toString());
- } else {
- System.err.println("Error line : " + sb.toString());
- }
- }
- private static Configuration getDefaultConf(){
- Configuration conf = new Configuration();
- conf.set("mapred.job.tracker", "local");
- conf.set("fs.default.name", "file:///");
- conf.set("io.compression.codecs", "com.hadoop.compression.lzo.LzoCodec");
- return conf;
- }
- /**
- * 写数据到lzo文件,即lzo压缩
- * @param destLzoFilePath
- * @param conf
- * @param datas
- * @return void
- */
- public static void write2LzoFile(String destLzoFilePath,Configuration conf,byte[] datas) {
- LzopCodec lzo = null;
- OutputStream out = null;
- try {
- /* System.setProperty("java.library.path", "/usr/local/hadoop/lib/native/Linux-amd64-64/lib");*/
- lzo = new LzopCodec();
- lzo.setConf(conf);
- out = lzo.createOutputStream(new FileOutputStream(destLzoFilePath));
- out.write(datas);
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- try {
- if(out != null) {
- out.close();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- /**
- * 从lzo文件中读取数据,即lzo解压缩
- * @param lzoFilePath
- * @param conf
- * @return void
- */
- public static List<String> readLzoFile(String lzoFilePath,Configuration conf) {
- LzopCodec lzo = null;
- InputStream is = null;
- InputStreamReader isr = null;
- BufferedReader reader = null;
- List<String> result = null;
- String line = null;
- try {
- /* System.setProperty("java.library.path", "/usr/local/hadoop/lib/native/Linux-amd64-64/lib");*/
- lzo = new LzopCodec();
- lzo.setConf(conf);
- is = lzo.createInputStream(new FileInputStream(lzoFilePath));
- isr = new InputStreamReader(is);
- reader = new BufferedReader(isr);
- result = new ArrayList<String>();
- while((line = reader.readLine()) != null) {
- result.add(line);
- }
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- try {
- if (reader != null) {
- reader.close();
- }
- if (isr != null) {
- isr.close();
- }
- if (is != null) {
- is.close();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- return result;
- }
- }
程序是没有错的,但是一开始运行的时候总会提示无法读取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的 内容是这样的:
- package com.hadoop.compression.lzo;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- public class GPLNativeCodeLoader {
- private static final Log LOG = LogFactory.getLog(GPLNativeCodeLoader.class);
- private static boolean nativeLibraryLoaded = false;
- static {
- try {
- //try to load the lib
- System.loadLibrary("gplcompression");
- nativeLibraryLoaded = true;
- LOG.info("Loaded native gpl library");
- } catch (Throwable t) {
- LOG.error("Could not load native gpl library", t);
- nativeLibraryLoaded = false;
- }
- }
- /**
- * Are the native gpl libraries loaded?
- * @return true if loaded, otherwise false
- */
- public static boolean isNativeCodeLoaded() {
- return nativeLibraryLoaded;
- }
- }
这里跟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下载链接
相关推荐
3. **接口调用:** LZO库提供了一系列的函数,如`lzo1x_1_compress`用于压缩数据,`lzo1x_decompress`用于解压缩数据。在项目中,你需要调用这些函数并传递适当的参数,例如原始数据缓冲区、目标压缩缓冲区和工作...
《LZO压缩与解压缩——以minilzo库为例》 在信息技术领域,数据压缩是一项重要的技术,它能够有效地减少存储空间,加快数据传输速度。LZO(Lempel-Ziv-Oberhumer)是一种快速的无损数据压缩算法,而minilzo是LZO的...
4. **预处理和后处理**:在某些情况下,LZO压缩前可能需要对数据进行预处理(如去除字节对齐、添加结束标记),解压缩后可能需要进行后处理(如恢复原始字节对齐)。 5. **优化和变体**:虽然基础的LZO算法已经很...
3. `lzo1y.c` 和 `lzo1y.h`:可能包含LZO1Y压缩算法的实现,这是一种与LZO1X相似但略有不同的压缩方法。 4. `lzodefs.h`:定义了LZO的各种常量、宏和数据结构,是理解LZO实现的关键。 5. `test-lzo.c`:测试程序,...
STM32移植MINI LZO 2.09压缩算法是一项在嵌入式系统中实现高效数据压缩的技术。STM32是意法半导体(STMicroelectronics)推出的一种基于ARM Cortex-M内核的微控制器系列,广泛应用在各种嵌入式设计中,而LZO(Lempel...
LZOAccel-D是一款专为无损数据解压缩设计的FPGA硬件实现方案,它基于LZO 2.10标准,能够高效地处理压缩数据块,并生成解压缩后的数据流。该核心具有强大的错误检测与恢复能力,能够在遇到压缩数据中的错误时仍保持...
LZO是致力于解压速度的一种数据压缩算法,LZO是Lempel-Ziv-Oberhumer的缩写。这个算法是无损算法,参考实现程序是线程安全的。 LZO库实现了许多有下述特点的算法: • 解压简单,速度非常快。 • 解压不需要内存。 ...
Lzo压缩技术是一种高效的数据压缩算法,主要应用于大数据处理和存储场景。它的全称为"Lossless Data Compression...在大数据领域,Lzo及其相关工具是不可或缺的组成部分,尤其是在需要平衡压缩效率与压缩比的场景下。
Lzo压缩速度快,但解压缩速度较慢,通常在需要快速写入数据而不太关心读取性能的场景下使用。 压缩算法的选择取决于具体的应用需求,如压缩效率、解压速度以及对压缩比的需求。在实际应用中,可能还需要考虑其他...
(5)、允许在压缩部分以损失压缩速度为代价提高压缩率,解压速度不会降低。 (6)、包括生成预先压缩数据的压缩级别,这样可以得到相当有竞争力的压缩比。 (7)、另外还有一个只需要8 kB内存的压缩级别。 ...
7. **API 设计**:一个完整的LZO库通常会提供一系列函数,如初始化、压缩、解压缩和清理等。在Pascal实现中,这些函数的接口设计和错误处理机制是关键,应确保易于使用且健壮。 8. **性能测试**:描述中提到“压缩...
本文将深入探讨三种常见的无损压缩算法:LZO(Lempel-Ziv-Oberhumer)、LZSS(Lempel-Ziv-Storer-Szymanski)以及LZW(Lempel-Ziv-Welch)。这些算法广泛应用于图像、文本和其他数据类型的压缩,以减少存储需求和...
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-lzop是一个开源项目,专门用于生成与LZO压缩库兼容的LZOP文件。在Go编程语言中,这个工具提供了一种高效且便捷的方式来处理数据压缩,特别是在需要快速存档和传输大量数据时。LZOP(Lempel-Ziv-Oberhumer ...
1. `lzo1x.c` 和 `lzo1y.c`:这是LZO的主要压缩函数实现,有不同的速度与压缩率平衡选项。 2. `lzo1x_1.c` 和 `lzo1y_1.c`:这是优化过的压缩函数,适用于单线程环境。 3. `lzo1x_decompress_safe.c` 和 `lzo1y_...
GZIP、LZO、Zippy/Snappy是三种广泛使用的数据压缩算法,每种算法都有其特定的应用场景和性能特点,合理选择压缩算法对于提升系统性能和节约资源至关重要。 首先,GZIP是一种广泛使用的文件压缩工具,它基于DEFLATE...