`
zhousheng29
  • 浏览: 149825 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

阅读更多
用hadoop0.20版本做hbase的bulk load测试,发现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的

当不需要生成临时文件,直接bulk load时,
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个hdfs patch和4个mapreduce patch,想着这样升级太麻烦,直接用了0.20的CDH2,想着这样就好了。

升级CDH2,升级过程不详细说明,基本跟安装过程一样。升级完成后,帮同事顺便解决一个问题,他想升级ganglia服务,正好少了ganglia31,但是发现importtsv还是有问题。具体如下,
升级完成后,没有ganglia31的问题了,但是出现Compression codec com.hadoop.compression.lzo.LzopCodec not found.
上网搜了搜,原来是缺少了lzo相应的包和native文件,因为lzo是GPL协议的,hbase不能自带lzo(见我一个同事文章hbase官方文档)

开始安装lzo,折腾了两天
因为hadoop是cloudera版的,所以lzo编码/解码器就不是用google官方的,注意这一点。
下载,网上搜索提供的那个地址url: wget https://download.github.com/kevinweil-hadoop-lzo-2ad6654.tar.gz 并不能下载到所需要的tar.gz包

无意中找到这个地址url https://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

编译成功
没有之前所需要的还要下载两个依赖包
wget http://packages.sw.be/lzo/lzo-devel-2.04-1.el5.rf.i386.rpm
wget http://packages.sw.be/lzo/lzo-2.04-1.el5.rf.i386.rpm
rpm -ivh lzo-2.04-1.el5.rf.i386.rpm
rpm -ivh lzo-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起了作用,但是还有问题。
ERROR lzo.GPLNativeCodeLoader: Could not load native gpl library
java.lang.UnsatisfiedLinkError: no gplcompression in java.library.path
ERROR lzo.LzoCodec: Cannot load native-lzo without native-hadoop
看样子是本地库安装有问题
经过检查发现lib/native/Linux-amd64-64目录下只有libgplcompression.la,而不见so文件,
将lib/native/Linux-amd64-64/lib目录中所有5个文件拷贝到lib/native/Linux-amd64-64目录
重新运行importtsv,直接导入hbase 表,问题解决,时间比两步走的时间缩短30%.
0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics