用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%.
分享到:
相关推荐
tsv格式的数据库测试文件,hbase可以通过采用importtsv导入外部数据到hbase中
独步数据导入指的是利用importtsv工具实现的HDFS数据到HBase表的直接转换。虽然名为“独步”,但实际上依然经过了HDFS到HFile的转换,以及移动HFile到HBase的过程。 独步数据导入会同时使用Map和Reduce两个阶段,这...
在HBase中,LZO是一种常用的压缩算法,用于优化数据存储和提高数据读写效率。本文将详细讲解如何在HBase环境中安装和编译LZO压缩包,以及它与HBase Master节点的关系。 首先,我们需要了解HBase。HBase是一个分布式...
博客文档链接中提到的内容可能包括使用HBase的命令行接口(HBase Shell)或编程API(如Java API)来导入数据。ORDER_INFO.txt文件很可能是我们需要导入的数据源,它可能包含了订单信息,如订单ID、用户ID、商品ID、...
总之,Java在Hive和HBase的数据交互中起到桥梁作用,通过精心设计的数据处理流程和合理的利用HBase的Bulk Load特性,可以高效地将Hive中的大量数据导入到HBase,满足实时查询的需求。在大数据场景下,这种方案具有很...
1. **预分区**:在导入数据前,根据预计的数据量创建足够的区域(region),避免数据导入过程中动态分区导致的性能损耗。 2. **使用HFileOutputFormat**:HBase提供了HFileOutputFormat类,可以将数据直接写入HFile...
在导入数据之前,需要将HDFS上的数据文件转换成HFile格式,这一步是通过importtsv命令来完成的。这个过程中,可以指定一些参数来控制导入行为,比如列映射(columns)、输出路径(bulk.output)、跳过错误行(skip....
HBase 和 Hadoop 数据块损坏是非常常见的问题,可能会导致数据丢失、集群崩溃等严重后果。因此,了解如何处理 HBase 和 Hadoop 数据块损坏是非常重要的。本文将介绍 HBase 和 Hadoop 数据块损坏的处理方法。 一、...
2. HBase到Hive:通过MapReduce任务,将HBase中的数据导入到Hive,创建Hive表并加载数据。也可以使用HBaseSerDe来解析HBase数据。 三、HBase和HDFS互导 1. HBase到HDFS:可以通过HBase的Export工具,将HBase表的...
总的来说,"基于Django LayUI HBase的文献数据挖掘系统"将Web开发、前端设计和大数据处理紧密结合起来,形成一个完整的解决方案。它不仅展示了Django的强大后端能力,LayUI的优雅前端设计,还充分利用了HBase的...
本项目是一个基于Apache HBase的工具,旨在从CSV文件中批量导入数据到HBase数据库,并提供基本的数据操作示例。HBase是一个分布式、可扩展的大数据存储系统,适用于处理海量数据。本项目利用HBase的强大功能,实现了...
标题中的“hbase导入话单数据mapreduce函数实现执行过程实例”揭示了本文将探讨如何使用MapReduce在HBase中导入大数据,特别是话单记录。HBase是一个分布式、版本化的NoSQL数据库,常用于处理大规模的数据。...
在大数据处理领域,Spark 和 HBase 以及 MySQL 都扮演着重要的角色。Spark 提供了高效的数据处理能力,HBase 是一个分布式、面向列的NoSQL数据库,而 MySQL 是广泛使用的的关系型数据库。本示例将详细介绍如何使用 ...
在Java编程环境中,操作HBase并将其数据写入HDFS(Hadoop Distributed File System)是一项常见的任务,特别是在大数据处理和分析的场景下。本篇将详细介绍如何使用Java API实现这一功能,以及涉及到的关键技术和...
### HBase热点问题及其解决方案 #### 一、热点问题概述 **热点问题**是指在HBase数据库中,由于数据分布不均匀导致某些RegionServer负载过重的现象。这会导致整个系统的性能受到影响,特别是在读写操作频繁的情况...
当尝试使用Sqoop从MySQL导入数据到HBase时,可能需要特定的JAR文件来处理MySQL的数据格式和HBase的存储模型之间的差异。 描述中提到的"报错空指针,且提示json错误",这通常是由于JSON解析问题导致的。JSON...
《HBase数据可视化系统构建详解》 在大数据领域,HBase作为一款分布式列式数据库,因其高并发、低延迟和大规模存储的特点,被广泛应用在实时数据处理和分析中。然而,对于非技术人员来说,直接操作HBase命令行进行...
Hive 数据导入 HBase 的方法 Hive 是一个基于 Hadoop 的数据仓库工具,而 HBase 是一个基于 Hadoop 的 NoSQL 数据库。它们都是大数据处理的重要组件。在数据处理过程中,经常需要将数据从 Hive 导入到 HBase 中。...
总结,通过上述步骤,我们可以成功地将MySQL中的数据导入到HBase。在实际项目中,可能需要考虑更多因素,例如数据清洗、错误处理、性能优化等。此外,为了实现大规模数据迁移,可以考虑使用批处理或MapReduce等技术...
HBase 2.x之RIT问题解决 HBase 2.x中的Region-In-Transition(RIT)机制是一种Region状态变迁机制,例如merge、split、assign、unassign等操作。在RIT过程中,可能会出现异常情况,从而导致Region的状态一直保持在...