HBase数据写入方式 与 BulkLoad

cookie和session都是用来跟踪浏览器用户身份的会话方式。SessionCookieSession与Cookie区别Session  session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识(称为session id...
摘要由CSDN通过智能技术生成

HBase数据写入方式

  HBase一般的插入过程都使用HTable对象,将数据封装在Put对象中,Put在new创建的时候需要传入rowkey,并将列族,列名,列值add进去。然后HTable调用put方法,通过RPC请求提交到Regionserver端。写入的方式可以分为以下几种:

  • 单条put
  • 批量put
  • 使用Mapreduce
  • bluckload

HTable
  HTable负责向一张HBase表中读或者写数据,HTable对象是非线程安全的。多线程使用时需要注意,创建HTable对象时需要指定表名参数,HTable内部有一个LinkedList< Row >的队列writeAsyncBuffer ,负责对写入到HBase的数据在客户端缓存,开启缓存使用参数 table.setAutoFlushTo(false); 默认情况不开启每次put一条数据时,HTable对象就会调用flushCommits方法向regserver中提交,开启缓存则会比较队列的大小,如果大于某个值则调用flushCommits,这个值默认是2m,可以通过在hbase-site.xml中设置参数"hbase.client.write.buffer"来调整,默认是2097152, 在关闭HTable连接时,会隐式的调用flushCommits方法,保证数据完全提交。提交时会根据rowkey定位该put应该提交到哪个reginserver,然后每个regionserver一组action发送出去。

单条put
  一般应用场景是线上业务运行时,记录单条插入,如报文记录,处理记录,写入后HTable对象即释放。每次提交就是一次RPC请求。

多条put
  使用List< Put >,这种方式操作时和单条put没有区别,将put对象add到list中,然后调用put(List< Put >)方法,过程和单条put基本一致,应用场景一般在数据量稍多的环境下,通过批量提交减少请求次数。

使用Mapreduce
  以上两种方式一般用来处理小批量的数据,那么在面对数据量多的时候使用MapReduce。HBase本身就是运行在HDFS上的数据库,因此和MapReduce有很好的融合。使用MapReduce来向HBase中写入数据时,将输入文件拆分成一个个的块,然后交给集群,分布式的去读取块,然后数据写入到HBase中。使用HBase官方提供的HBase和MapReduce整合的工具类TableMapReduceUtil,在map端读入数据,然后直接写HBase的情景,这种方式一般用于Hive或者文件数据入HBase,不需要业务逻辑处理,保持原有的数据入库,rowkey一般时某个字段或者若干个字段拼接而成。

bulkload
  上述几种方式虽然实现的方式涉及到的东西不同,但是本质是一样的,都是使用HTable对象调用put方法,然后HTable通过rpc提交到reginserver上,然后通过LSM过程之后最终写入到磁盘上。HBase的数据最终会变成hfile文件落到磁盘上,那么有没有一种方式可以绕过前面的这些过程,直接生成最终的hfile文件呢。答案是有的,bulkload写入hbase的原理正是基于此。使用mapreduce来生成hbase的hfile文件,然后将文件塞到hbase存储数据的目录下,这样做可以减少了海量的数据请求时间,也完全避免了regionserver的处理数据的压力。由于涉及到hbase存储架构的原理,在map端生成put对象,reduce使用hbase提供的KeyValueSortReducer即可,reduce端会将数据按照rowkey做排序,生成hfile文件,然后按照region的分布对hfile做分割,将分割的hfile文件放到相应的region目录下。

BulkLoad

  在第一次建立HBase表的时候,可能需要往里面一次性导入大量的初始化数据。HBase本身提供了非常多种数据导入的方式,通常有两种经常使用方式:【1】使用HBase提供的TableOutputFormat,原理是通过一个Mapreduce作业将数据导入HBase;【2】使用HBase原生Client API 。这两种方式因为须要频繁的与数据所存储的RegionServer通信。一次性入库大量数据时,特别占用资源,所以都不是最有效的。
  HBase在HDFS中是以HFile文件结构存储的,一个比较高效便捷的方法就是使用 “Bulk Loading”方法直接生成HFile,即HBase提供的HFileOutputFormat类。Bulk Load 的实现原理是通过一个 MapReduce Job 来实现的,通过 Job 直接生成一个 HBase 的内部 HFile 格式文件,用来形成一个特殊的 HBase 数据表,然后直接将数据文件加载到运行的集群中。与使用HBase API相比,使用Bulkload导入数据占用更少的CPU和网络资源。

实现原理

  根据HDFS上的数据或者外部的数据生成Hbase的底层Hfile数据。根据生成的目标Hfile,利用Hbase提供的BulkLoad工具将Hfile Load到Hbase目录下面
Bulkload过程主要包括三部分:

  1. 从数据源提取数据并上传到HDFS
  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,将文件在HDFS上的位置传递给它,它就会利用RegionServer将数据导入到相应的区域

整个过程图如下:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值