看看HBase Bulkload 源码

HBase工具之BulkLoad 使用BulkLoad是由于实际业务的需要,每个月底都需要向HBase插入大约200G的数据,接近10亿条记录。在插入过程中需要占用大量的IO资源,极大影响了现有的实时数据入库业务的效率。因此需要寻找一种替代的方案来在不影响现有业务的基础上,不占用大量集群资源,快速高效的插入大量的数据。本文主要介绍了BulkLoad的工作机制和应用,以及在使用过程中遇到的问题,最后简要分析了BulkLoad的源码步骤 阅读详情

看看HBase Bulkload 源码

什么都别说先看代码

val regionLocator = new HRegionLocator(hbTableName, classOf[ClusterConnection].cast(conn))
val loader = new LoadIncrementalHFiles(hbaseConf)
val admin = conn.getAdmin()
loader.doBulkLoad(new Path(path),admin,realTable,regionLocator)
-- PS 我看的源码版本是 hbase-client-1.2.1

从上面可以直观的看到2个关键的信息 HRegionLocator 、**LoadIncrementalHFiles **,接下来先看看这2个类有没有说明信息。

HRegionLocator(org.apache.hadoop.hbase.client.HRegionLocator)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ddfJ4oku-1590163467306)(看看HBase Bulkload 源码.assets/1590073793607.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4pCzOzoS-1590163703542)(D:%5Cgithubcom%5CDeceasedLike%5Csrc%5Cmain%5Cmd%5C%E7%9C%8B%E7%9C%8BHBase%20Bulkload%20%E6%BA%90%E7%A0%81.assets%5C1590073793607.png#pic_center)]

翻译下上面的英文起作用:用于查看单个HBase表的区域位置信息,感觉是一些辅助性信息。再看看LoadIncrementalHFiles

LoadIncrementalHFiles (org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles)

“Tool to load the output of HFileOutputFormat into an existing table” 是一个加载HFile文件到HBase的工具,

这个工具类在构造函数中,有几个信息比较有意思:
在这里插入图片描述

  • HFILE_BLOCK_CACHE_SIZE_KEY= "hfile.block.cache.size" -- 设置块缓存大小
    -- 此处禁用了块缓存
    -- 这个块缓存与 bucket cache 有关
    
  • public static final String MAX_FILES_PER_REGION_PER_FAMILY
      = "hbase.mapreduce.bulkload.max.hfiles.perRegion.perFamily"; -- 设置最大的列族个数
    
doBulkLoad (org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles#doBulkLoad)

然后就到了关键的步骤doBulkLoad,上源码:
在这里插入图片描述

  1. 上来就是检查要导入的表,在HBase中是否存在,不存在就抛异常结束

  2. 然后根据配置hbase.loadincremental.threads.max参数,构造一个线程池,这里这个参数既然可以手动配置那么后续就可以考虑适当的增加以提高效率,可以当成后续的优化参数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sjOZLhjI-1590163467312)(看看HBase Bulkload 源码.assets/1590075957059.png)]

  1. 这里涉及另一个参数 hbase.loadincremental.validate.hfile,是否需要校验HFile,当文件个数很多时,会比较耗时,如果可以保证HFile文件时正确的时候可以考虑改为false,会提高下效率

  2. 将要加载的HFile封装成LQT,并放入到queue中,然后检查HFile中是否含有目标表中不存在列族,有则抛出异常
    在这里插入图片描述

  3. 参数hbase.bulkload.retries.number控制了hbase对一个hfile最多plit多少次 ,如果Hfile文件 跨越多个region,bulkload会自动地将Hfile文件split,但是对于每次retry只会将指定的Hfile文件split一次

  4. LQI队列转为Multimap,通过groupOrSplitPhase
    在这里插入图片描述

  5. 在 groupOrSplit 方法中尝试将HFile 逻辑上分配给对应的Region ,如果HFile跨越了Region,那么就将其分割,产生2个LQI
    在这里插入图片描述

  6. 在bulkLoadPhase方法中,利用线程池尝试原子的加载数据tryAtomicRegionLoad(conn, table.getName(), first, lqis)
    在这里插入图片描述

  7. 一系列的操作之后,终于到了加载HFile文件的地方HStore#bulkLoadHFile

bulkLoadHFile(org.apache.hadoop.hbase.regionserver.HStore#bulkLoadHFile(org.apache.hadoop.hbase.regionserver.StoreFile))

先上源码图:
在这里插入图片描述

StoreFileManager有两个实现类:DefaultStoreFileManager(标准了Not thread-safe)、StripeStoreFileManager,我们每个都看看到底都做了什么。

  1. DefaultStoreFileManager [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-benWmO9u-1590163467318)(看看HBase Bulkload 源码.assets/1590134519809.png)]

    • 维护最新的storeFiles的ImmutableList列表

    • sortAndSetStoreFiles 从名字就能看出是排序storeFile,根据SeqId、FileSize、BulkTime、PathName,然后将排序后的storeFiles放到ImmutableList列表中

      private void sortAndSetStoreFiles(List<StoreFile> storeFiles) {
        Collections.sort(storeFiles, StoreFile.Comparators.SEQ_ID);
        storefiles = ImmutableList.copyOf(storeFiles);
      }
      
       public static final Comparator<StoreFile> SEQ_ID =
            Ordering.compound(ImmutableList.of(
                Ordering.natural().onResultOf(new GetSeqId()),
                Ordering.natural().onResultOf(new GetFileSize()).reverse(),
                Ordering.natural().onResultOf(new GetBulkTime()),
                Ordering.natural().onResultOf(new GetPathName())
            ));
      
      • 看完之后发现,总结下HStore 把要加载的HFile的一些重要信息,好像没做什么其他的操作,有点怀疑是不是自己看漏了什么…
  2. StripeStoreFileManager

    • 说这Manager之前要说一下,关于StripeCompactionPolicy,它的机制是:
      • 将Region划分为多个Stripes(相当于sub region)
      • 新Flush产生的文件先放入一个L0的区域,这个区域会有多个HFile文件
      • 然后L0区域进行compaction操作时,会将HFile对应的写入Stripes中
        • 这样可以加速Region Split操作(由全局转换为局部)
    • 这个Manager需要与StripeCompactionPolicy and StripeCompactor 一起使用
      在这里插入图片描述
      大致看了下流程,具体的实现没细看。不过从目前所看到的源码来说,在使用Bulkload批量加载数据的时候:
  • 没有经过MemCache
  • 没有涉及BlockCache
  • 是Region直接加载HFile文件到对应的Store的Stripes中
过程中涉及的可优化的参数
  1. hbase.loadincremental.threads.max构造一个工作线程池
  2. hbase.loadincremental.validate.hfile,是否需要校验HFile,如果可以保证HFile文件时正确的时候可以考虑改为false,会提高下效率
  3. **hbase.bulkload.retries.number控制了hbase对一个hfile最多plit多少次 **,可以尝试增加次数,但是如果报错了代表HFile文件跨过了多个Region,是不是本身也有问题?
Hbase_shell底层源码乱砍乱伐--59 大约10个月没有更新博客了,一直在学习新的东西,忙的不可开胶,现在一边整理做过的事情,以便复习一下。白天要工作也只有后半夜才有时间看书了。------青春无悔 下面的代码是关于Hbase shell脚本的源码的改写,屏蔽了一些功能,便于理解和安全操作。 现在没时间逐一解释关键点的含义,以后有时间再改,替换掉集群中:hbase_home:/lib/ruby/shell.rb # She 阅读详情

相关推荐

结合源码分析HBase相关操作流程

1、RegionServer打开region的过程:   首先master给regionServer发出打开region的命令(AssignmentManager.assign)           RegionOpeningState regionOpenState = ServerManager.sendRegionOpen(plan             .getDestinatio

云计算、分布式架构、K8S、大数据、机器学习、搜索、推荐、广告 3037

Hbase——BulkLoad代码

HbaseBulkLoad package hbase_mr; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.hbase.TableName; i...

zgm12的博客 312

Bulk Load——Spark 批量导入多列数据到HBase(scala/Java)

一、流程 Spark加载HDFS上的数据 ——> 数据清洗 ——> 准备HBase表 ——> 数据量预估,预分裂——> 数据整理为表的格式 ——> 批量写入 ——> 优化 此文主要记录后四个步骤 未优化时,大概1200万条数据/h (10G数据) 二、准备HBase表 val table: HTable = null val tableName ...

王某的博客 5823

Hbase bulkload源代码阅读笔记

1.LoadIncrementalHFiles.doBulkLoad(Path hfofDir, HTable table) 首先用discoverLoadQueue方法扫描出hfofDir下有哪些fhile文件,再循环调用tryLoad方法把每个文件load进去,这是一个串行的过程。 Deque queue = null; queue = discoverL...

uestzengting的专栏 855

hbase源码编译、配置安装、测试

hbase源码编译、配置安装、测试

克终的博客 4594

Multisim实战:从8选1到32选1数据选择器的完整搭建指南(附常见问题解决)

本文提供了一份详尽的Multisim实战指南,手把手教你从基础的8选1数据选择器开始,逐步级联搭建16选1乃至32选1数据选择器。文章深入剖析了级联的核心逻辑、片选方案以及使用译码器的专业方法,并附带了电源连接、输出冲突、信号毛刺等常见问题的诊断与解决技巧,帮助电子工程学生和爱好者扎实掌握数字电路的系统设计与仿真调试。

dd012的博客 730

hbase bulk load相关源码简析之HFileOutputFormat、LoadIncrementalHFiles

转载请注明出处: http://blog.youkuaiyun.com/lonelytrooper/article/details/17040895 PutSortReducer: [java] view plain copy // 对map阶段传递过来的puts中的KVs做排序,并将有序的KVs写到输出流(最终写的类是HFileWriterV1或HFileWriterV2

Rocky 1065

飞书云文档API操作详细介绍

开通云文档API、python程序调用飞书api、飞书获取app_id和app_secret、

Brother_ning的博客 1万+

HBase bulkLoad源码解读

HBase bulkLoad时间都花在哪? 近期工作中使用hbase bulkload向hbase导入2TB数据(10000个hfiles),我们发现将hfiles加载到hbase 表的过程用了将近一个小时。这和我对bulk load过程的理解不太相符,在我的理解中,hbase bulkload并不会产生数据copy,数据导入通过hdfs的mv操作完成。那么, 问题1:是什么操作消耗了一个小...

Adolph的专栏 1971

STM32G030C8T6 ADC+DMA实战:同时采集外部电压和芯片温度的完整代码流程

本文详细介绍了STM32G030C8T6芯片通过ADC+DMA实现外部电压和芯片内部温度采集的完整流程。从硬件设计到CubeMX配置,再到驱动模块化实现与系统优化,提供了高精度多通道采集系统的实战指南,特别适合嵌入式开发者在工业控制和环境监测项目中应用。

weixin_42653691的博客 467

WPS Office 2026免费安装指南:AI办公与安全使用全解析

办公软件作为数字化办公的核心工具,其基本原理是通过文档处理、数据计算和演示展示等功能模块满足用户日常办公需求。随着人工智能技术的发展,现代办公软件逐步集成AI能力,通过自然语言处理和数据分析算法提升工作效率。在技术价值层面,优秀的办公软件不仅需要保持格式兼容性和跨平台同步能力,更要注重用户数据安全防护。从应用场景来看,无论是个人文档编辑、企业报表分析还是团队协作演示,办公软件都发挥着关键作用。WPS Office 2026作为国产办公软件代表,深度融合AI助手功能,支持智能写作和数据分析,同时通过官方免费策

weixin_30599769的博客 719

使用Mapreduce生成Hfile,并通过Bulkload导入到Hbase+源码解析

前缀树的构建基于键的字节表示,前缀树的每个节点表示一个字节,键的字节序列决定了它在前缀树中的路径。这种方法利用了键的二进制表示的自然顺序,能够快速定位到正确的分区。不需要,HFileOutputFormat2.configureIncrementalLoad()会根据MapTask输出的Value类型,自动设置Reducer。方法,使用二分查找算法在分区键集合中查找给定键。二分查找的时间复杂度为O(logn),其中n是分区键的数量。且配置启用了自然顺序,分区器会构建一个前缀树(Trie)。

kokkxks的博客 1267

【DDSCAT——离散偶极近似仿真程序04】参数理解和模型设计

在这一部分,我们开始理解DDSCAT程序设计中的一些参数问题。 承接第二部分内容中的ddscat.par文件,我们来聊一聊偶极子、实际体积、有效半径等关键词。 一、偶极子点阵 手册中说,我们需要设计模型(target/目标),它是有偶极子点阵组成的。偶极子,顾名思义,是由一对电荷组成的,但我们不用设计一对,我们设计一个点就行,...

XD_Yangf的博客 7552

Hbase BulkLoad Snapshot On Table

一:目的: 主从集群replication双写下,为了不影响增量数据,将全量数据snapshot导入新集群表中 二:方案: 2.1 .cdh6以下hbase版本: 方案一:clone_snapshot +copyTable(整表执行,操作次数少;操作时间长;copy Table会影响到正常读写,由于region的split) 方案二:bulkload ,但是受region个数与列族个数影响,...

奈文摩尔ST 360

rk3576 点亮 LCD(eDP)

RK3576 处理器集成了对 **eDP (Embedded DisplayPort)** 接口的支持,主要用于驱动嵌入式或笔记本电脑的内置屏幕。支持 **eDP 1.3 版本协议**, 最大可支持 ****4K@120Hz**。

weixin_35723192的博客 354

全球SAR卫星大盘点与回波数据处理专栏目录

本专栏将详细介绍各国各地区的SAR卫星的特点和性能,以及SAR回波数据的处理方法和技巧。主要介绍民用和商用SAR卫星,帮助你了解商业SAR卫星的最新动态和技术,MATLAB代码将全部开源。以下是专栏目录,持续更新中。

3161

java的for循环取出数据只是拿到最后一个_从MySQL中导数据到HBase

前言这个问题在网上已经一搜一大把了,为什么要自己亲手总结一下仅仅是因为最近自己公司新上了HBase然后使用Spark去读取MySQL的数据写入HBase的时候遇到了一些问题,也困扰了挺久现在就详细描述一下我去编写这个程序的流程,代码是如何去变化的顺带一提,现在在经营自己的知识星球,目的是为了带不了解大数据的小伙伴们入门且和已经在从事大数据的人一起进步,虽然免费,但是不代表你会没有收获一、...

weixin_39716043的博客 540

【AUTOSAR-E2E】-2.2-配置E2E:基于E2EPW配置一个TX发送的Signal Group(使用E2E Profile 2)

《共13页精讲》:此法也适用于E2E Profile 4/5/6/7/11/22 目录 1 检查CAN Matrix Arxml/DBC是否满足E2E需求 2 在DaVinci Developer中为Port添加E2E保护 3 在DaVinci Configurator settings设置 4 如何使用应用层的E2E保护 5 结尾 <--返回「Autosar_BSW高阶配置」总目录--> <--返回「Autosar_BSW高阶配置」专栏主页--> &lt.

「汽车电子助手」的博客 4218

Bulkload找不到分区文件 IllegalArgumentException: Can't read partitions file

问题 使用bulkload方式导入数据到hbase时,mapper任务可能会发生找不到分区文件错误 错误信息如下: Error: java.lang.IllegalArgumentException: Can't read partitions file at org.apache.hadoop.mapreduce.lib.partition.TotalOrderPartitio...

没有格子衬衫的程序员 2180

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

hbase

   HBase DDL(创建表) 核心流程源码分析    -HBase DML(插入数据) 核心流程源码分析 bulkloa...

okbin1991的博客 71

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Hadoop与HBase中遇到的问题(续)java.io.IOException: Non-increasing Bloom keys异常

在使用Bulkload向HBase导入数据中, 自己编写Map与使用KeyValueSortReducer生成HFile时, 出现了下面的异常: java.io.IOException: Non-increasing Bloom keys: 201301025200000000000003520000000000000500 after 20131119510000000000000001

我和我追逐的梦~~~ 5373

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

bulk load关于分隔符的问题

在查看bulk load的源码了解到,其默认的分隔符为\t,也就是说如果数据是tab键分割的,就不需要指定分隔符了,如果需要换成其它分割符,在执行时加上-Dimporttsv.separator=",",则变成了以","分割。 前两天,无意间使用bulk load导入数据,导入的数据是以“\t”分割的,我在命令中指定了-Dimporttsv.separator="\t",怪事就出现了,报出异常:

石头视角 1581

大数据开发岗面试复习30天冲刺 - 日积月累,每日五题【Day13】——Hbase7_开发岗复习

•BulkLoad是指将数据直接转换为StoreFile文件,放入Hbase中,不经过Hbase的内存,避免大量数据进入内存,又从内存进入HDFS•应用:大数据量批量写入Hbase。

2401_84182578的博客 901

2021SC@SDUSC hbase代码分析(十四)BulkLoad功能

2021SC@SDUSC hbase源码分析(十四)BulkLoad功能 2021SC@SDUSC 2021SC@SDUSC 2021SC@SDUSC 2021SC@SDUSC 目录2021SC@SDUSC hbase源码分析(十四)BulkLoad功能BulkLoad功能BulkLoad核心流程HFile生成阶段。HFile导入阶段。核心流程到此结束 BulkLoad功能 在实际生产环境中,有这样一种场景:用户数据位于HDFS中,业务需要定期将这部分海量数据导入HBase系统,以执行随机查询更新操作。这种

weixin_45785943的博客 1284

HBase源码分析(二) 2021SC@SDUSC

HBase源码分析(二) 2021SC@SDUSC 文章目录前言一、HRegionServer作用HRegionServer作用如下:二、对Client端代码分析1.put方法:2.用doput代码判断3.flushCommits方法如下:4.ConnectionImplementation的processBatch方法:过程如下:三.对Server端代码分析1.multi方法:2.batchMutate:四.总结 前言 在 HBase中,大部分的操作都是在RegionServer完成的,Client端

qq_45856546的博客 790

HBase多表 bulkLoad

hbase 中快速导入大数据量可以使用bulkload 但是官方只有单表的load的相关案例. 经过查看一些源码MultiTableHFileOutputFormat可以支持多表bulkload example package com.cc.example; import org.apache.commons.lang3.StringUtils; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSys

偶是一只小小鸟~ 709
上一篇: 我想看看Flume
下一篇: 不要错过的Redis
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值