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%.