HBASE importtsv导入数据及lzo问题解决

用hadoop0.20版本做hbase的bulkload测试,发现importtsv的过程出现些问题,关于importtsv网上有很多资料,这里不待言表。

先大概表述出现的问题,

当使用两步的方式导入数据时,

第一步,生成hfile

hadoop jar hbase-version.jar importtsv -Dimporttsv.columns=HBASE_ROW_KEY,c1,c2 -Dimporttsv.bulk.output=tmp hbase_table hdfs_file

这一步提醒两个地方,c1,c2列是需要指明列族和列名,例如:cf:1,cf:2,

-Dimporttsv.bulk.output=tmp,tmp生成后会在hdfs的/user/hadoop/tmp中

第二步,导入hbase表,这一步其实是mv的过程,即利用生成好的hfile移到hbase中

hadoop jar hbase-version.jar completebulkload /user/hadoop/tmp/cf hbase_table

这样数据是可以正常进入hbase的

当不需要生成临时文件,直接bulkload时,

hadoop jar hbase-version.jar importtsv -Dimporttsv.columns=HBASE_ROW_KEY,c1,c2 hbase_table hdfs_file

值得注意的是,经过测试,在数据量较大时,两步处理方式比一步导入方式有效率和稳定性上的优势:

1.两步导入时,由于是先生成文件,再复制文件进入HBase表,对于HBase读取的性能影响较小,不会出现较大的读取时间波动;

2.两步导入时,时间上要节约三分之二,等于效率提高60%~70%,map的处理时间较短,只有一个reduce,一步导入时,map处理时间较长,没有reduce.由于hadoop集群在配置时,一般会有较多的最大map数设置,较少的最大reduce数设置,那么这种两步导入方式也在一定程度上提升了hadoop集群并发能力。

这时候开始报错,大概意思就是有一个ganglia31文件找不到,查了下资料,需要升级patch,需要1个hdfspatch和4个mapreducepatch,想着这样升级太麻烦,直接用了0.20的CDH2,想着这样就好了。

升级CDH2,升级过程不详细说明,基本跟安装过程一样。升级完成后,帮同事顺便解决一个问题,他想升级ganglia服务,正好少了ganglia31,但是发现importtsv还是有问题。具体如下,

升级完成后,没有ganglia31的问题了,但是出现Compressioncodeccom.hadoop.compression.lzo.LzopCodecnotfound.

上网搜了搜,原来是缺少了lzo相应的包和native文件,因为lzo是GPL协议的,hbase不能自带lzo(见我一个同事文章hbase官方文档)

开始安装lzo,折腾了两天

因为hadoop是cloudera版的,所以lzo编码/解码器就不是用google官方的,注意这一点。

下载,网上搜索提供的那个地址url:wgethttps://download.github.com/kevinweil-hadoop-lzo-2ad6654.tar.gz并不能下载到所需要的tar.gz包

无意中找到这个地址urlhttps://github.com/kevinweil/hadoop-lzo/downloads,能下载到tar.gz文件。值得注意的是wget没法用,只能用浏览器打开下载到本地后,再上传到服务器。

文件名是kevinweil-hadoop-lzo-6bb1b7f.tar.gz,跟之前比后缀变了,如果tx们还是找不到tar.gz文件,可以发信给我,我发给你们。

解包编译一样,甚至更加简单了,分析原因,估计新版本直接包含了之前版本没有依赖包

tar -zxvf kevinweil-hadoop-lzo-6bb1b7f.tar.gz
cd kevinweil-hadoop-lzo-6bb1b7f
ant compile-native tar

编译成功

没有之前所需要的还要下载两个依赖包

wgethttp://packages.sw.be/lzo/lzo-devel-2.04-1.el5.rf.i386.rpm

wgethttp://packages.sw.be/lzo/lzo-2.04-1.el5.rf.i386.rpm

rpm-ivhlzo-2.04-1.el5.rf.i386.rpm

rpm-ivhlzo-devel-2.04-1.el5.rf.i386.rpm

编译成功后,将编码/解码器jar包以及native库拷贝到$HADOOP_HOME/lib下的相应位置

cp build/hadoop-lzo-0.4.15.jar $HADOOP_HOME/lib/ 
tar -cBf - -C build/native . | tar -xBvf - -C $HADOOP_HOME/lib/native

将hadoop-lzo-0.4.15.jar及native本地库的目录拷贝同步到各节点,hbase目录下是不需要拷贝的。

配置文件

core-site.xml

<property>
  <name>io.compression.codecs</name>
<value>org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.BZip2Codec,com.hadoop.compression.lzo.LzoCodec,com.hadoop.compression.lzo.LzopCo
dec</value>
  <description>A list of the compression codec classes that can be used for compression/decompression.</description>
</property>

<property>
  <name>io.compression.codec.lzo.class</name>
  <value>com.hadoop.compression.lzo.LzoCodec</value>
</property>

mapred-site.xml

<property>
  <name>mapred.compress.map.output</name>
  <value>true</value>
</property>

<property>
  <name>mapred.map.output.compression.codec</name>
  <value>com.hadoop.compression.lzo.LzoCodec</value>
</property>

<property>
  <name>mapred.child.env</name>
  <value>JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native/Linux-amd64-64</value>
</property>

hadoop-env.sh

在HADOOP_CLASSPATH中加上hadoop-lzo-0.4.15.jar

HADOOP_CLASSPATH=$HADOOP_CLASSPATH:${HADOOP_HOME}/lib/hadoop-lzo-0.4.15.jar

注意,还可能有问题,

重新运行importtsv,还是有问题,但错误不一样了,看来之前的安装lzo起了作用,但是还有问题。

ERRORlzo.GPLNativeCodeLoader:Couldnotloadnativegpllibrary

java.lang.UnsatisfiedLinkError:nogplcompressioninjava.library.path

ERRORlzo.LzoCodec:Cannotloadnative-lzowithoutnative-hadoop

看样子是本地库安装有问题

经过检查发现lib/native/Linux-amd64-64目录下只有libgplcompression.la,而不见so文件,

将lib/native/Linux-amd64-64/lib目录中所有5个文件拷贝到lib/native/Linux-amd64-64目录

重新运行importtsv,直接导入hbase表,问题解决,时间比两步走的时间缩短30%.

相关推荐