Hadoop2.7.1和Hbase0.98添加LZO压缩

来源:互联网 发布:vue双向数据绑定面试 编辑:程序博客网 时间:2024/04/28 05:20


1,执行命令安装一些依赖组件 
yum install -y hadoop-lzo lzo lzo-devel hadoop-lzo-native  lzop 
2, 下载lzo的源码包并解压 

tar -zxvf lzo-2.09.tar.gz 

3,在当前目录新建一个lzo目录,存储编译后的lzo文件 
进入lzo-2.09目录 
依次执行命令: 
export CFLAGS=-64m 
./configure --enable-shared --prefix=/home/search/lzo 
make && make install 

4,下载twitter的hadoop-lzo源码进行编译: 

伦理片 http://www.dotdy.com/

进入hadoop-lzo目录,修改pom中hadoop的版本为2.7.1 
然后依次执行如下命令,配置环境变量: 
export CFLAGS=-64m 
export CXXFLAGS=-64m 
export C_INCLUDE_PATH=/home/search/lzo/include 
export LIBRARY_PATH=/home/search/lzo/lib 
然后执行mvn clean test构建 
mvn clean test 
确认success后,即可执行: 
mvn clean package -Dmaven.test.skip=true 
进行打包构建,构建成功后, 

拷贝编译文件 cp -a hado* 到hadoop/lib/native/ 和 hbase/lib/ 下面 

拷贝lzo的jar包doop/share/hadoop/common/lib下面和hbase/lib下面 

//测试hbase是否支持snappy 
hbase org.apache.hadoop.hbase.utilt /user/webmaster/word/in/tt2  snappy     
//测试hbase是否支持lzo 
hbase org.apache.hadoop.hbase.ut /user/webmaster/word/in/tt2   lzo 

//压缩lzop,解压缩lzop -d 
//执行一个MR任务,给lzo相关数据,建索引, 
bin/hadoop jar share/hadoop/coop-lzo-0n.lzoer /user/webmaster/rand 

//执行一个单机任务,给lzo相关数据,建索引 
bin/hadoop jar shb/hadoop-lzo-0.4.20-SNAPSHOT.jar 
com.hadoop.compreexer  /user/webmaster/rand 

经过测试同样的数据: 

不设置任何压缩的hbase表,所占存储空间最大 
经过snappy压缩的表,存储空间明显变小 
经过lzo压缩的表,存储空间最小 

遇到的问题: 

一个hbase中,如果同时有两种压缩表,一个是lzo压缩的表,一个是snappy压缩的表,那么在使用java client去scan数据时,可能会有regionserver会挂掉,经过查看log,发现hbase中并无明显异常,但是同节点的hadoop的datanode的log中会抛出了如下异常: 
影音先锋电影 http://www.iskdy.com/

Java代码  收藏代码
  1. java.io.IOException: Premature EOF from inputStream  
  2.         at org.apache.hadoop.io.IOUtils.readFully(IOUtils.java:201)  
  3.         at org.apache.hadoop.hdfs.protocol.datatransfer.PacketReceiver.doReadFully(PacketReceiver.java:213)  
  4.         at org.apache.hadoop.hdfs.protocol.datatransfer.PacketReceiver.doRead(PacketReceiver.java:134)  
  5.         at org.apache.hadoop.hdfs.protocol.datatransfer.PacketReceiver.receiveNextPacket(PacketReceiver.java:109)  
  6.         at org.apache.hadoop.hdfs.server.datanode.BlockReceiver.receivePacket(BlockReceiver.java:472)  
  7.         at org.apache.hadoop.hdfs.server.datanode.BlockReceiver.receiveBlock(BlockReceiver.java:849)  
  8.         at org.apache.hadoop.hdfs.server.datanode.DataXceiver.writeBlock(DataXceiver.java:804)  
  9.         at org.apache.hadoop.hdfs.protocol.datatransfer.Receiver.opWriteBlock(Receiver.java:137)  
  10.         at org.apache.hadoop.hdfs.protocol.datatransfer.Receiver.processOp(Receiver.java:74)  
  11.         at org.apache.hadoop.hdfs.server.datanode.DataXceiver.run(DataXceiver.java:251)  
  12.         at java.lang.Thread.run(Thread.java:745)  


经过查资料,发现说的都是hbase的客户端租约超时,或者是linux的句柄数太少,等等,经过验证,发现跟这些处理方法没关系,删除了一个snappy压缩的表,继续测试,这下能正常运行了, 至于具体的原理,还没搞清楚,可能与hbase的hfile的底层存储有关系,一个region下面不能同时存储在两种压缩数据结构,这个坑得记住。 

0 0
原创粉丝点击