hbase bluk loading

阅读更多
使用HBASE的BULK LOAD

一、环境的配置

1.首先配置$HADOOP_HOME下的conf/hadoop-env.sh文件,修改其中的HADOOP_CLASSPATH为如下

export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/hadoop/hbase-0.90.3.jar:/hadoop/hbase/hbase-0.90.3-

tests.jar:/hadoop/hbase/conf:/hadoop/hbase/lib/guava-r06.jar:/hadoop/hbase/lib/zookeeper-3.3.2.jar

2.配置$HBASE_HOME下的conf/hbase-env.sh文件,修改其中的HBASE_CLASSPATH为如下

export HBASE_CLASSPATH=$HBASE_CLASSPATH:/hadoop/hadoop-config

3.配置$HADOOP_HOME下的conf/core-site.xml,加入如下信息



   hbase.zookeeper.quorum

   hadoop-namenode,hadoop-datanode1,hadoop-datanode2

  



4.重启hbase和hadoop

二、bluk loading适用的场景

  这种方式有很多的优点:
     1. 如果我们一次性入库hbase巨量数据,处理速度慢不说,还特别占用Region资源, 一个比较高效便捷的方法就是使用 “Bulk Loading”方法,即HBase提供的HFileOutputFormat类。
     2. 它是利用hbase的数据信息按照特定格式存储在hdfs内这一原理,直接生成这种hdfs内存储的数据格式文件,然后上传至合适位置,即完成巨量数据快速入库的办法。配合mapreduce完成,高效便捷,而且不占用region资源,增添负载。
  这种方式也有很大的限制:
     1. 仅适合初次数据导入,即表内数据为空,或者每次入库表内都无数据的情况。
     2. HBase集群与Hadoop集群为同一集群,即HBase所基于的HDFS为生成HFile的MR的集群.

三、具体的操作
   hbase提供了现成的程序将hdfs上的文件导入hbase,即bulk-load方式。它包括两个步骤(也可以一次完成):
1 将文件包装成hfile,hadoop jar /path/to/hbase.jar importtsv -Dimporttsv.columns=a,b,c
比如:
    	hadoop dfs -cat test/1
	1       2
	3       4
	5       6
	7       8


执行

        	hadoop jar ~/hbase/hbase-0.90.2.jar importtsv -Dimporttsv.columns=HBASE_ROW_KEY,f1 t8 test


将会启动mapreduce程序在hdfs上生成t8这张表,它的rowkey分别为1 3 5 7,对应的value为2 4 6 8
注意,源文件默认以"\t"为分割符,如果需要换成其它分割符,在执行时加上-Dimporttsv.separator=",",则变成了以","分割

2 在上一步中,如果设置了输出目录,如

           hadoop jar ~/hbase/hbase-0.90.2.jar importtsv -Dimporttsv.bulk.output=tmp -Dimporttsv.columns=HBASE_ROW_KEY,f1 t8 test


那么t8表还暂时不会生成,只是将hfile输出到tmp文件夹下,我们可以查看tmp:

           	hadoop dfs -du tmp
	Found 3 items
	0           hdfs://namenode:9000/user/test/tmp/_SUCCESS
	65254       hdfs://namenode:9000/user/test/tmp/_logs
	462         hdfs://namenode:9000/user/test/tmp/f1


然后执行hadoop jar hbase-VERSION.jar completebulkload /user/todd/myoutput mytable将这个输出目录中的hfile转移到对应的region中,这一步因为只是mv,所以相当快。如:
hadoop jar ~/hbase/hbase-0.90.2.jar completebulkload tmp t8
然后

             hadoop dfs -du /hbase/t8/c408963c084d328490cc2f809ade9428
	Found 4 items
	124         hdfs://namenode:9000/hbase/t8/c408963c084d328490cc2f809ade9428/.oldlogs
	692         hdfs://namenode:9000/hbase/t8/c408963c084d328490cc2f809ade9428/.regioninfo
	0           hdfs://namenode:9000/hbase/t8/c408963c084d328490cc2f809ade9428/.tmp
	462         hdfs://namenode:9000/hbase/t8/c408963c084d328490cc2f809ade9428/f1


此时己经生成了表t8
注意,如果数据特别大,而表中原来就有region,那么会执行切分工作,查找数据对应的region并装载

        程序使用中注意:
1 因为是执行hadoop程序,不会自动查找hbase的config路径,也就找不到hbase的环境变量。因此需要将hbase-site.xml加入到hadoop-conf变量中
2 还需要将hbase/lib中的jar包放入classpath中
3 执行以上的步骤2时需要将zookeeper的配置写入core-site.xml中,因为在那一步时甚至不会读取hbase-site.xml,否则会连不上zookeeper

你可能感兴趣的:(hbase bluk loading)