HBase的bulkLoad

摘要:
HBase的BulkLoad有两种方式:thinrow的机制是平面映射单元信息;适用于小于10000列的数据集;细线意味着更少的行和更多的列;散装货物的机制是,平面图是一条线,将线分割成单元是在地图中完成的。BulkLoad将比put模式更快地插入数据:这是因为put模式需要一些元数据,而BulkLoad模式避免了写入元数据,这是通过添加HFile直接实现的。
HBase的BulkLoad有两种方式:
thinrow的机制是flatmap把cell的信息进行flatmap;适合少于1万列的数据集;thinrow的涵义就是少行多列;
bulkload的机制则是flatmap的是行,把行在拆分为cell是在map里面做的。适合多余1万列的数据集。
Basic和ThinRows的机制其实类似,但是接收的数据格式不一样,前者接受的是一个二元组ListSeq((keyFamilyQualifier, value));其中KeyFamilyQualifier(包括rowKey, family, qualifier)以及value,后者是一个二元组List(new ByteArrayWrapper(Bytes.toBytes(rowKey)), familyQualifiersValues) familyQualifiersValues中包含family, qualifier, value。
Basic是一个平行结构,ThinRow其实是一个层级结构;
Basic和thin之间的差别在于入口的数据结构;basic入口的是(rowkey-famil-quantity,cellvalue),说白了就是一个cellvalue;thinrow的入口参数则是一行数据(rowkey,columnValues),注意,columnValues是一个数组;这种差别直接导致了两者处理的差异性,下面将会讲到;
bulkload在map一下row信息之后,将会进行一次repartitionAndSortWithinPartitions,这个repartion将会导致shuffle,最后是hbaseForeachPartition,这个是一个action;在这个action中将会遍历shuffle的数据,进行处理,好的,basic和thinrow的性能差别就在这里,因为basic的入口是cellvalue,那么在shuffle过程中(RPC),传输的粒度就是一个cellvalue;处理完毕一个相应了,再来一个;对于thinrow而言,一次是一行数据,RPC一次传输的粒度就是一行数据,明显吞吐量要高于basic;
basic的hbaseForeachPartition(it代表一个分区)
 it.foreach{ case (keyFamilyQualifier, cellValue:Array[Byte]) => ... 
thinrow的hbaseForeachPartition
 it.foreach{ case (rowKey:ByteArrayWrapper, familiesQualifiersValues:FamiliesQualifiersValues) => ... 
那么为什么对于多于1万列的场景要使用basic呢?就是因为可能会超过RPC的上限,即使没有超过,一次传输一个超大数据对于网络来讲压力也很大。
注意这里有一个Roll的动作,就是bulk/thinrow入口参数有一个max_size,代表多大小对HFile文件进行拆分,Basic默认是HConstants.DEFAULT_MAX_FILE_SIZE,ThinRow其实也是一样的,但是官网坑爹的写了个20,所以导致的每个记录都会单独成为一个HFile,结果爆了一个异常:HFileLoad的大小超过了32。
这个异常本质还是因为Roll Size设置的太小了,采用默认值即可。
   BulkLoad插入数据的速度将会比采用put方式要快很多:这是因为PUT方式需要些metadata,采用bulkload方式避免了写入metadata,直接通过HFile的添加来实现。但是bulkLoad需要对数据进行组合,这里又要耗费一些时间,所以优势更多的体现在大量数据,分布比较多的设备的场景下。
shuffle指的是各个节点在为reduce准备数据,比如检索,排序同时对数据进行打包;repartion这是对数据进行分区,正常情况下每个分区将会对应一个CPU核,repartition这是通过指定分区规则(指定分区数量或者指定按照某种规则分区)来对数据进行重新分区,重新分区应该只是针对可重用数据才有价值,否则数据重新分区本身就是一件比较耗费性能的事情。
备注:bulkload是在hbase-spark-2.0.0-alpha3.jar下面的orgapachehadoophbasesparkHBaseContext.scala中定义的。
参考:
https://hbase.apache.org/book.html(Chapter 102. Bulk Load)
 

免责声明:文章转载自《HBase的bulkLoad》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇编译预处理命令--define和ifdef的使用C#集合与泛型集合下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

一、Hbase的安装

一、Hbase配置 这个是我从网上找的一个版本,网上说配置成功。 先决条件: (1)hadoop的版本与hbase的版本要对应,主要是hadoop目录下的hadoop-core-1.0.4.jar的版本与hbase的lib目录下的hadoop-core-1.0.4.jar一致。 做法:将hadoop中lib下的hadoop-core-1.0.2.jar...

HBase统计表行数(RowCount)的四种方法

背景:对于其他数据存储系统来说,统计表的行数是再基本不过的操作了,一般实现都非常简单;但对于HBase这种key-value存储结构的列式数据库,统计 RowCount 的方法却有好几种不同的花样,并且执行效率差别巨大!下面来研究下吧~ 测试集群:HBase1.2.0 - CDH5.13.0 四台服务器 注:以下4种方法效率依次提高 一、hbase-s...

大数据技术-spark+hive+hbase研究

大数据 spark 研究(0基础入门)一 背景 1 基础 Scala 语言基础:Scala详细总结(精辟版++) spark 介绍    :  spark介绍     二 环境 1 部署spark   <![if !supportLists]>1、<![endif]>环境准备(1)配套软件版本要求: Java 6+  Python...

HBase的Write Ahead Log (WAL) —— 整体架构、线程模型

解决的问题 HBase的Write Ahead Log (WAL)提供了一种高并发、持久化的日志保存与回放机制。每一个业务数据的写入操作(PUT / DELETE)执行前,都会记账在WAL中。 如果出现HBase服务器宕机,则可以从WAL中回放执行之前没有完成的操作。 本文主要探讨HBase的WAL机制,如何从线程模型、消息机制的层面上,解决这些问题: 1...

HBase中的时间维度

HBase是一个类Bigtable系统,按照Google的论文对 Bigtable的定义是“一种稀疏的,分布式的,持久的多为维度的有序Map。这个Map由row key,column key和timestamp做为索引,Map中的值是连续的byte数组”。HBase的多维度,包括table和column family等。 不是所有维度都是等同的,不同的维度...

快速搭建Hadoop及HBase分布式环境

本文旨在快速搭建一套Hadoop及HBase的分布式环境,自己测试玩玩的话ok,如果真的要搭一套集群建议还是参考下ambari吧,目前正在摸索该项目中。下面先来看看怎么快速搭建一套分布式环境。 准备 三台虚拟机:1台作为NameNode和HMaster 两台作为DataNode和HRegionServer。同时三台都安装zookeeper。 Hadoop...