- /**
- * @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下载链接
相关推荐
Lzo 压缩算法 Lzo压缩 vs2005 例子Lzo 压缩算法 Lzo压缩 vs2005 例子Lzo 压缩算法 Lzo压缩 vs2005 例子Lzo 压缩算法 Lzo压缩 vs2005 例子
LZOAccel-D是一个无损数据解压缩引擎的FPGA硬件实现,兼容LZO 2.10标准。 Core接收压缩的输入数据块,产生解压缩后的数据块。Core分析数据块的头和尾,检查输入数据块的错误,并且输出解压缩后的数据载荷,所以用户...
LZO是致力于解压速度的一种数据压缩算法,LZO是Lempel-Ziv-Oberhumer的缩写。这个算法是无损算法,参考实现程序是线程安全的。 LZO库实现了许多有下述特点的算法: • 解压简单,速度非常快。 • 解压不需要内存。 ...
Lzo压缩、解压缩安装包。包括Lzo,Lzop,hadoop-lzo的安装包。在Linux,AIX亲测可用。
本文通过对多种压缩算法作进一步研究对比后发现,LZO压缩算法是一种被称为实时无损压缩的算法,LZO压缩算法在保证实时压缩速率的优点的同时提供适中的压缩率。如图1(A)给出了Linux操作系统下常见开源压缩算法的压缩...
本文最好和MapReduce操作常见的文件文章一起阅读,因为写文件与压缩往往是结合在一起的。 相关压缩算法介绍参考文章:HDFS文件类型与压缩算法介绍。 本文介绍写文件时使用的压缩算法,包括:Gzip压缩、Snappy压缩和...
STM32移植 MINI LZO2.09压缩算法 编译通过 可以直接烧录运行 使用STM32F103VET6
lzo压缩算法源码,比较全面!!
lzo压缩算法 例子 可运行 可查看 很方便 文件是网上下的
配置hadoop支持LZO和snappy压缩
(5)、允许在压缩部分以损失压缩速度为代价提高压缩率,解压速度不会降低。 (6)、包括生成预先压缩数据的压缩级别,这样可以得到相当有竞争力的压缩比。 (7)、另外还有一个只需要8 kB内存的压缩级别。 ...
LZO 压缩算法 纯pascal 语言 压缩速度应该很不错
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 - 生成LZOP文件兼容LZO压缩库
图形图像压缩资料(LZO+LZSS+LZW) 有代码 有例子 有文档 !无损压缩算法C、C++源代码,好资料,共享下!
前面传的出现解包不全的现象,现在这个经过测试 工作是正常的 , 支持64位编译器
1 LZO压缩算法基本原理分析 1.1 LZO压缩算法压缩原理 LZO压缩算法采用(重复长度L,指回距离D)代替当前已经在历史字符串中出现过的字符串,其中,重复长度是指,后出现的字符串与先出现的字符串中