通过BulkLoad快速将海量数据导入到Hbase[Hadoop篇] – 过往记忆
hbase应用案例      在第一次建立Hbase表的时候,我们可能需要往里面一次性导入大量的初始化数据。我们很自然地想到将数据一条条插入到Hbase中,或者通过MR方式等。但是这些方式不是慢就是在导入的过程的占用Region资源导致效率低下,所以很不适合一次性导入大量数据。本文将针对这个问题介绍如何通过Hbase的BulkLoad方法来快速将海量数据导入到Hbase中。  总的来说,使用 Bulk Load 方式由于利用了 HBase 的数据信息是按照特定格式存储在 HDFS 里的这一特性,直接在 HDFS 中生成持久化的 HFile 数据格式文件,然后完成巨量数据快速入库的操作,配合 MapReduce 完成这样的操作,不占用 Region 资源,不会产生巨量的写入 I/O,所以需要较少的 CPU 和网络资源。Bulk Load 的实现原理是通过一个 MapReduce Job 来实现的,通过 Job 直接生成一个 HBase 的内部 HFile 格式文件,用来形成一个特殊的 HBase 数据表,然后直接将数据文件加载到运行的集中。与使用HBase API相比,使用Bulkload导入数据占用更少的CPU和网络资源。 文章目录1 实现原理2 代码实现2.1 使用MapReduce生成HFile文件2.2 驱动程序2.3 通过BlukLoad方式加载HFile文件3 BulkLoad的使用案例实现原理  Bulkload过程主要包括三部分:   1、从数据源(通常是文本文件或其他的数据库)提取数据并上传到HDFS。抽取数据到HDFS和Hbase并没有关系,所以大家可以选用自己擅长的方式进
行,本文就不介绍了。   2、利用MapReduce作业处理实现准备的数据 。这一步需要一个MapReduce作业,并且大多数情况下还需要我们自己编写Map函数,而Reduce函数不需要我们考虑,由HBase提供。该作业需要使用rowkey(行键)作为输出Key;KeyValue、Put或者Delete作为输出Value。MapReduce作业需要使用HFileOutputFormat2来生成HBase数据文件。为了有效的导入数据,需要配置HFileOutputFormat2使得每一个输出文件都在一个合适的区域中。为了达到这个目的,MapReduce作业会使用Hadoop的TotalOrderPartitioner类根据表的key值将输出分割开来。HFileOutputFormat2的方法configureIncrementalLoad()会自动的完成上面的工作。   3、告诉RegionServers数据的位置并导入数据。这一步是最简单的,通常需要使用LoadIncrementalHFiles(更为人所熟知是completebulkload工具),将文件在HDFS上的位置传递给它,它就会利用RegionServer将数据导入到相应的区域。整个过程图如下:
如果想及时了解Spark、Hadoop或者Hbase相关的文章,欢迎关注公共帐号:iteblog_hadoop代码实现上面我们已经介绍了Hbase的BulkLoad方法的原理,我们需要写个Mapper和驱动程序,实现如下:使用MapReduce生成HFile文件 public class IteblogBulkLoadMapper extends Mapper<LongWritable, Text, ImmutableBytesWritable, Put
>{        protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {            String line = String();            String[] items = line.split("\t");              ImmutableBytesWritable rowKey = new ImmutableBytesWritable(items[0].getBytes());            Put put = new Bytes(items[0]));  //ROWKEY            put.addColumn("f1".getBytes(), "url".getBytes(), items[1].getBytes());            put.addColumn("f1".getBytes(), "name".getBytes(), items[2].getBytes());                        context.write(rowkey, put);        }}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。