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下面的\org\apache\hadoop\hbase\spark\HBaseContext.scala中定义的。
参考:
https://hbase.apache.org/book.html(Chapter 102. Bulk Load)
 

HBase的bulkLoad的更多相关文章

  1. [How to] HBase的bulkload使用方法

    1.简介 将数据插入HBase表中的方法很多,我们可以通过TableOutputFormat以Mapreduce on HBase的方式将数据插入,也可以单纯的使用客户端API将数据插入.但是以上方法 ...

  2. 大数据学习笔记——HBase使用bulkload导入数据

    HBase使用bulkload批量导入数据 HBase可使用put命令向一张已经建好了的表中插入数据,然而,当遇到数据量非常大的情况,一条一条的进行插入效率将会大大降低,因此本篇博客将会整理提高批量导 ...

  3. bulk-load 装载HDFS数据到HBase

    bulk-load的作用是用mapreduce的方式将hdfs上的文件装载到hbase中,对于海量数据装载入hbase非常有用,参考http://hbase.apache.org/docs/r0.89 ...

  4. 通过BulkLoad快速将海量数据导入到Hbase

    在第一次建立Hbase表的时候,我们可能需要往里面一次性导入大量的初始化数据.我们很自然地想到将数据一条条插入到Hbase中,或者通过MR方式等. 但是这些方式不是慢就是在导入的过程的占用Region ...

  5. HBase 写优化之 BulkLoad 实现数据快速入库

    在第一次建立Hbase表的时候,我们可能需要往里面一次性导入大量的初始化数据.我们很自然地想到将数据一条条插入到Hbase中,或者通过MR方式等.但是这些方式不是慢就是在导入的过程的占用Region资 ...

  6. Spark、BulkLoad Hbase、单列、多列

    背景 之前的博客:Spark:DataFrame写HFile (Hbase)一个列族.一个列扩展一个列族.多个列 用spark 1.6.0 和 hbase 1.2.0 版本实现过spark BulkL ...

  7. sqoop将关系型的数据库得数据导入到hbase中

    1.sqoop将关系数据库导入到hbase的参数说明

  8. HBase 实战(1)--HBase的数据导入方式

    前言: 作为Hadoop生态系统中重要的一员, HBase作为分布式列式存储, 在线实时处理的特性, 备受瞩目, 将来能在很多应用场景, 取代传统关系型数据库的江湖地位. 本篇博文重点讲解HBase的 ...

  9. [原创]HBase学习笔记(4)- 数据导入

    需要分别从Oracle和文本文件往HBase中导入数据,这里介绍几种数据导入方案. 1.使用importTSV导入HBase importTSV支持增量导入.新数据插入,已存在数据则修改. 1.1.首 ...

随机推荐

  1. 关于mac上的maven

    1 mac上的maven的JAVA_HOME mac上maven的JAVA_HOME不是环境变量的JAVA_HOME,而是~/.mavenrc中的JAVA_HOME. 2 彻底解决mac上使用mvn ...

  2. Java基础 - 变量转换

    在java中变量转发分为两种,隐式转换和强制转换 隐式转换: byte a = 10; int b = 20; byte c = a + b; // 该方法会报错,转换过程中字节数只能从小变大,不能从 ...

  3. Java基础 - 输出

    输出在各个开发语言中起着至关重要的作用,方便编写代码时进行调试,在java中使用 System.out.println 进行输出 public class Main { public static v ...

  4. 我的Android进阶之旅------> Android应用升级构想和要点总结

    广大博友,看过后帮忙顶顶,谢谢大家!!! 转载请注明: http://blog.csdn.net/richway2010/article/details/6408258 [博主:各位博友,网友们,大家 ...

  5. ubuntu编译内核模块报错:Required key not available 的解决

    系统为ubuntu18.04, 在编译内核模块insmod helloworld.ko的时候提示如下错误. 出现此问题的原因是,Ubuntu Kernel 使用 EFI_SECURE_BOOT_SIG ...

  6. inux c编程:记录锁

    记录锁的功能:当一个进程正在读或修改文件的某个部分是,它可以阻止其他进程修改同一文件区.对于这个功能阐述我认为有三点要解释的: 记录锁不仅仅可以用来同步不同进程对同一文件的操作,还可以通过对同一文件加 ...

  7. rails 常用方法

    bundle install --without production 不安装production中的gem ./configure && make && sudo m ...

  8. Oracle数据库体系结构(6)数据库归档重做日志文件管理

    归档重做日志文件的概念和选择 Oracle数据库能够把已经写满了的重做日志文件保存到一个或多个指定的离线位置,这种保存的文件为归档重做日志文件.通常情况下一个归档重做日志时一个被LGWR写满的重做日志 ...

  9. ios多种语言的本地化思路

    多语言在应用程序中一般有两种做法: 一.程序中提供给用户自己选择的机会: 二.根据当前用户当前移动设备的语言自动将我们的app切换对应语言. 第一种做法比较简单完全靠自己的发挥了,这里主要讲第二种做法 ...

  10. uCGUI 按键窗口切换机制

    前段时间在做一个窗口项目,这个项目菜单项过多,在管理起来比较麻烦.想做一个高效移植又方便的一个切换机制.后来在网上多方查找这方面资料,但是感觉比较少.后来自己整理出了这个结构,希望对后来朋友有所帮助. ...