Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >HBase BulkLoad 原理及批量写入数据实战

HBase BulkLoad 原理及批量写入数据实战

作者头像
大数据真好玩
发布于 2022-12-05 01:11:30
发布于 2022-12-05 01:11:30
2.4K00
代码可运行
举报
文章被收录于专栏:暴走大数据暴走大数据
运行总次数:0
代码可运行

目录

一、HBase BulkLoad介绍

  1. 前言
  2. 为什么要用bulkload方式导入?
  3. bulkload的实现原理

二、HBase BulkLoad批量写入数据实战

  1. 开发生成HFile文件的代码
  2. 打成jar包提交到集群中运行
  3. 观察HDFS上输出的结果
  4. 加载HFile文件到hbase表中
  5. 总结

一、HBase BulkLoad介绍

1. 前言

之前我们介绍了HBASE的存储机制,HBASE存储数据其底层使用的是HDFS来作为存储介质,HBASE的每一张表对应的HDFS目录上的一个文件夹,文件夹名是以HBASE表的名字来命名(如果没有使用命名空间,那么默认是在default目录下)。在表文件夹下存放着若干个region命名的文件夹,而region文件夹中的每个列族也是用文件夹进行存储的,每个列族中存储的就是实际的数据,以HFile的形式存在。

路径格式: /hbase/data/default/<tbl_name>/<region_id>//<hfile_id>

2. 为什么要用bulkload方式导入?

在进行数据传输中,批量加载数据到HBase集群有多种方式,比如通过HBase API进行批量写入数据、使用Sqoop工具批量导数到HBase集群、使用MapReduce批量导入等。这些方式,在导入数据的过程中,如果数据量过大,可能耗时会比较严重或者占用HBase集群资源较多(如磁盘IO、HBase Handler数等)。

3. bulkload的实现原理

按照HBase存储数据按照HFile格式存储在HDFS的原理,使用MapReduce直接生成HFile格式的数据文件,然后再通过RegionServer将HFile数据文件移动到相应的Region上去。

  • HBase数据正常写流程
  • bulkload方式的处理示意图
  • bulkload的好处
  1. 导入过程不占用Region资源
  2. 能快速导入海量的数据
  3. 节省内存

二、HBase BulkLoad批量写入数据实战

需求

通过bulkload的方式,将我们放在HDFS上面的这个路径/hbase/input/user.txt的数据文件,转换成HFile格式,然后load到myuser2这张Hbase表里面去。

1. 开发生成HFile文件的代码

自定义map类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package xsluo.hbase;
 
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;
 
//四个泛型中后两个,分别对应rowkey及put
public class BulkLoadMapper extends Mapper<LongWritable, Text, ImmutableBytesWritable, Put> {
    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        String[] split = value.toString().split("\t");
 
        //封装输出的rowkey类型
        ImmutableBytesWritable immutableBytesWritable = new ImmutableBytesWritable(split[0].getBytes());
        //构建Put对象
        Put put = new Put(split[0].getBytes());
        put.addColumn("f1".getBytes(), "name".getBytes(), split[1].getBytes());
        put.addColumn("f1".getBytes(), "age".getBytes(), split[2].getBytes());
 
        context.write(immutableBytesWritable, put);
    }
}

程序main

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package xsluo.hbase;
 
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.mapreduce.HFileOutputFormat2;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
 
public class HBaseBulkLoad extends Configured implements Tool {
    public static void main(String[] args) throws Exception {
        Configuration configuration = HBaseConfiguration.create();
        //设置ZK集群
        configuration.set("hbase.zookeeper.quorum", "node01:2181,node02:2181,node03:2181");
 
        int run = ToolRunner.run(configuration, new HBaseBulkLoad(), args);
        System.exit(run);
    }
 
    @Override
    public int run(String[] strings) throws Exception {
        Configuration conf = super.getConf();
        Job job = Job.getInstance(conf);
        job.setJarByClass(HBaseBulkLoad.class);
 
        FileInputFormat.addInputPath(job, new Path("hdfs://node01:8020/hbase/input"));
        job.setMapperClass(BulkLoadMapper.class);
        job.setMapOutputKeyClass(ImmutableBytesWritable.class);
        job.setMapOutputValueClass(Put.class);
 
        //获取数据库连接
        Connection connection = ConnectionFactory.createConnection(conf);
        Table table = connection.getTable(TableName.valueOf("myuser2"));
 
        //使MR可以向myuser2表中,增量增加数据
        HFileOutputFormat2.configureIncrementalLoad(job, table, connection.getRegionLocator(TableName.valueOf("myuser2")));
        //数据写回到HDFS,写成HFile -> 所以指定输出格式为HFileOutputFormat2
        job.setOutputFormatClass(HFileOutputFormat2.class);
        HFileOutputFormat2.setOutputPath(job, new Path("hdfs://node01:8020/hbase/out_hfile"));
 
        //开始执行
        boolean b = job.waitForCompletion(true);
 
        return b?0:1;
    }
}
2. 打成jar包提交到集群中运行
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
hadoop jar hbase_demo-1.0-SNAPSHOT.jar xsluo.hbase.HBaseBulkLoad
3. 观察HDFS上输出的结果
4. 加载HFile文件到hbase表中

方式一:代码加载

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package xsluo.hbase;
 
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles;
 
public class LoadData {
    public static void main(String[] args) throws Exception {
        Configuration configuration = HBaseConfiguration.create();
        configuration.set("hbase.zookeeper.quorum", "node01,node02,node03");
        //获取数据库连接
        Connection connection =  ConnectionFactory.createConnection(configuration);
        //获取表的管理器对象
        Admin admin = connection.getAdmin();
        //获取table对象
        TableName tableName = TableName.valueOf("myuser2");
        Table table = connection.getTable(tableName);
        //构建LoadIncrementalHFiles加载HFile文件
        LoadIncrementalHFiles load = new LoadIncrementalHFiles(configuration);
        load.doBulkLoad(new Path("hdfs://node01:8020/hbase/out_hfile"), admin,table,connection.getRegionLocator(tableName));
    }
}

方式二:命令加载

先将hbase的jar包添加到hadoop的classpath路径下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export HBASE_HOME=/xsluo/install/hbase-1.2.0-cdh5.14.2/
export HADOOP_HOME=/xsluo/install/hadoop-2.6.0-cdh5.14.2/
export HADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbase mapredcp`
  • 运行命令
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
yarn jar /xsluo/install/hbase-1.2.0-cdh5.14.2/lib/hbase-server-1.2.0-cdh5.14.2.jar   completebulkload /hbase/out_hfile myuser2

加载完后,原文件会被移动到hdfs中此表对应的region的列族的目录下

5. 总结

本文为了演示实战效果,将生成HFile文件和使用BulkLoad方式导入HFile到HBase集群的步骤进行了分解,实际情况中,可以将这两个步骤合并为一个,实现自动化生成与HFile自动导入。如果在执行的过程中出现RpcRetryingCaller的异常,可以到对应RegionServer节点查看日志信息,这里面记录了出现这种异常的详细原因。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-10-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大数据真好玩 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Win11 桌面快捷方式未全部显示的诡异现象及解决方法
最近在使用我的电脑时,开机后,桌面的快捷方式总感觉少了很多,怀疑是之前使用了 360 桌面助手导致的,但是我没有证据。现在已经没有使用了,还是这样,所以也不太确定。先来看看现在出现问题的情况,现在桌面上总共有 38 个项目(一列 14 个):
独立观察员
2023/03/08
3K0
Win11 桌面快捷方式未全部显示的诡异现象及解决方法
【Windows】Windows11、Windows10完美去除快捷方式小箭头的方法
Windows桌面图标右下角的小箭头对于一些用户来说可能会显得多余,现在,我想和大家分享一下在Windows 11和Windows 10中如何去除这些快捷方式小箭头的方法,希望能够帮助到同样有这个困扰的朋友们。
LuckiBit
2024/12/11
12.2K1
【Windows】Windows11、Windows10完美去除快捷方式小箭头的方法
C#——安装包制作 [桌面快捷图标 右键属性 打开文件位置,更改图标]问题解决
软件打包工具有很多种,让人不知道选那个方便自己使用,Tiger Installer是一个在强大的功能和简单易用两个特性中寻找平衡的安装制作软件【此处不是广告】.
vv彭
2021/03/16
1.8K0
C#——安装包制作 [桌面快捷图标 右键属性 打开文件位置,更改图标]问题解决
Windows系统网站-KMS
在重装系统的时候,一个干净安全可信任的Windows原版系统镜像是必不可少的,不过对于很多人来说,在茫茫的网络资源库里,想找到一个自己想要的东西,却有点困难,搞不好就被盗版 网站骗了,下载了一个流氓的系统镜像,装上之后一堆第三方推广应用,甚至可能会暗藏病毒、泄露隐私。今天就给大家介绍几个可以免费下载 Windows 原版镜像的网站。
小城故事
2023/03/10
7.6K0
Windows系统网站-KMS
Win11新版本来了
3 月 20 日消息,Windows 11 太阳谷 2(Sun Valley 2,SV2)是微软即将公布的 Win11 22H2 版本的代号,最近官方发布的一些预览版展示了该版本一些潜在的新功能。
谭庆波
2022/04/11
1.3K0
Win11新版本来了
Win11安装基于WSL2的Ubuntu
趁着还没有完全忘记,详细记录一下在Win11下安装基于WSL2的Ubuntu的详细过程。不得不说WSL2现在被微软开发的比较强大了,还是很值得安装和使用的,笔者就通过WSL2安装的Ubuntu成功搭建了ROS环境。
charlee44
2024/12/14
6020
Win11安装基于WSL2的Ubuntu
Office 2019软件安装包下载及安装教程
Microsoft office 2019简体中文版是一款非常受人欢迎的办公软件,包含了Word、Excel、PowerPoint、OneNote、Lync、Publisher和Access等等多款组件,且每个功能都支持独立打开使用,满足用户的所有使用需求。新版本还支持用户直接预览PDF并对其进行编辑,功能强大。
肉肉软件安装
2022/10/16
4.3K1
Office 2019软件安装包下载及安装教程
Win11多任务功能重磅升级!生产力飙升!
在 Windows 11 系统中,微软引入了 Snap 布局和 Alt+Tab 快捷方式等功能,使你很容易组织桌面上的窗口。
逆锋起笔
2022/03/28
7730
Win11多任务功能重磅升级!生产力飙升!
office软件安装包全版本(win+mac),office2019 windows版本安装教程详解
如何安装office办公软件呢?首先获取到office全版本的安装包:ruanjianduo.top
用户8187027
2023/03/11
1.1K0
6步傻瓜式点击在树莓派上安好Win11
丰色 发自 凹非寺 量子位 报道 | 公众号 QbitAI 给树莓派安装Windows 11系统时麻烦吗? 先要去官网下载arm版系统,然后进行镜像烧录;烧好后,还要在树莓派上进行一些配置? 现在,有一个脚本可以把以上操作都自动化了,还是图形界面的——你只需要傻瓜式地点几下就OK! 并且也不用担心微软许可证的问题,此脚本完全合法! (也可以用来装Windows 10。) 6步傻瓜式安装 首先,去GitHub上找到这个叫做WoR-flasher的项目,clone下来。 注意,现在这个脚本只有linux版。
量子位
2023/03/01
6500
6步傻瓜式点击在树莓派上安好Win11
制作Win11PE用于云服务器
制作winpe的软件很多,我自己已经习惯用WimBuilder2,网上制作Win11PE的资料很少很少,这个完全是我摸索出来的,分享给有缘人。
Windows技术交流
2022/11/19
4K1
懒猿福利:自动安装 Windows 10 开发环境
程序员最讨厌的事情之一可能就是装电脑了。因为程序员的电脑环境配置和正常人的很不一样。通常,人工安装一台新开发机得花上几个小时。得让这个过程自动化,毕竟编程的精髓就在于让复杂事情简单化,想办法偷懒!
Edi Wang
2019/07/15
1.8K0
懒猿福利:自动安装 Windows 10 开发环境
md是什么?如何打开md类型的文件?假如使用Typora打开,如何免费激活Typora?
推荐一个网站给想要了解或者学习人工智能知识的读者,这个网站里内容讲解通俗易懂且风趣幽默,对我帮助很大。我想与大家分享这个宝藏网站,请点击下方链接查看。 https://www.captainbed.cn/f1
鲜于言悠
2024/05/30
3.7K0
md是什么?如何打开md类型的文件?假如使用Typora打开,如何免费激活Typora?
Win11快捷键
尽管Windows 10中支持的几乎所有快捷键在 Windows 11 中都保持不变,但微软古老操作系统的新版本也带来了许多新的快捷组合键。以下是Windows 11键盘快捷键列表,可帮助你快速导航桌面、命令提示符、文件资源管理器、辅助功能等。
用户8711264
2023/03/13
2K0
IE浏览器主页被劫持,如何解决主页被篡改问题?
前几天号主的电脑的指纹解锁功能突然不能用了,号主以为是驱动没更新到最新版导致的,去官网下载最新的驱动都安装上了也是不行,后面找Dell客服两个小时也没有找到最终的问题,后面个人怀疑是因为号主研究虚拟化技术导致一些冲突从而指纹识别不能用了,最后一不做二不休直接重置了系统后就恢复了【建议大家把桌面文件属性修改为存到别的盘符,这样就算你重置了系统,桌面的资料都不会丢失。
FreeRonin
2020/09/23
20.2K0
IE浏览器主页被劫持,如何解决主页被篡改问题?
andrioid 桌面
Android被认为是新一代的移动操作系统,它与传统的移动操作系统存在很大的区别。传统的移动操作系统无论在功能还是外观上,都与PC操作系统有很大的区别,而Android是目前比较接近PC操作系统的移动操作系统。Android最吸引人的功能恐怕就是可以直接显示在屏幕上的“小玩意”:窗口小部件、快捷方式、实时文件夹。这些组件都充分体现了新一代移动操作系统的特征。在本节中,我们将结合具体的案例深入学习Android中这些与桌面组件相关的知识。
张哥编程
2024/12/17
1650
andrioid 桌面
24H2 Win11PE的制作和使用
微软原版24H2WinPE没有图形界面,只有简单的cmd命令行,不适用普通用户,这版定制化的24H2WinPE集成了powershell和图形界面,并且软件兼容性较高,导致2G内存使用率高达98%左右,此时打开cmd命令行OK,如果再干点别的,比如打开powershell或者打开图形界面的东西比如任务管理器,就内存不足而异常了。建议≥2.5G内存的机器使用。
Windows技术交流
2025/02/10
1.1K0
VsCode安装
进入VS Code官网:https://code.visualstudio.com,点击 DownLoad for Windows下载windows版本
捞月亮的小北
2024/05/23
3440
VsCode安装
Windows Copilot抢先上手!GPT-4全线接入Win11,重新定义操作系统
5月底,微软在开发者大会上,向全世界宣布:从6月开始,一打开Windows,你的GPT助手就会立马蹦出,任你吩咐。
新智元
2023/08/07
7060
Windows Copilot抢先上手!GPT-4全线接入Win11,重新定义操作系统
第1天:Python 环境搭建
其实 Python 已经是一个很老的编程语言了,到现在(2019年) Python 已经高龄 28 岁,比很多程序员的年龄都大。现在之所以这么流行和社区、人工智能的发展,有很大的关系。
纯洁的微笑
2019/10/30
1.1K0
第1天:Python 环境搭建
推荐阅读
相关推荐
Win11 桌面快捷方式未全部显示的诡异现象及解决方法
更多 >
LV.1
新浪网技术(中国)有限公司软件开发工程师
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验