java代码将mysql表数据导入HBase

Java代码将Mysql表数据导入HBase表

目录
一、项目目录介绍
二、主要接口方法与调用
三、全局配置文件
四、难点
1、面向对象OOP的设计理念
2、数据格式转化
3、依赖的需求与使用
五、执行方式和输出介绍
六、项目依赖
七、拓展

一、项目目录介绍

主要包含四个接口:Com、RDB、HBase、RDBToHBase和其实现类xxxImpl。

两个配置文件:log4j日志配置文件log4j.properties和全局配置文件tranfer.properties(具体见下面展示)

备注:这里用的关系型数据库是Mysql。即:RDB为Mysql

二、主要接口方法与调用

1、Com接口

一些通用方法

1
2
3
4
5
void close()   	// 释放资源
void init() // 初始化资源
Properties config() // 获取properties文件配置对象,为方法checkAndGetConfig服务
default String checkAndGetConfig(String key){} // 检查transfer.properties中是否有key这个配置项并放回其值,含默认实现
default void closeAll(AutoCloseable...acs){} // 统一资源释放调用,含默认实现

2、RDB接口:继承Com接口

其实现类主要实现:关系型数据库连接,执行sql语句将返回的结果集转化为Put对象

1
2
boolean hashNextBatch() throws SQLException; // 是否还有下一批次数据要传输
List<Put> nextBatch() throws SQLException; // 获取下一批数据

3、HBase接口:继承Com接口

其实现类主要实现:连接HBase,获取HBase表,上传数据

1
void putBatch(List<Put> batch) throws IOException;	//将Put对象数据批量上传到HBase

4、RDBToHBase接口

其实现类主要实现:将RDB数据导入HBase主体逻辑

1
2
3
void setRDB(RDB rdb);		// 配置RDB对象
void setHBase(HBase base); // 配置HBase对象
void startTransfer(); // 迁移数据

5、主要调用逻辑

  1. 最终调用逻辑 start 方法
1
2
3
4
5
6
7
8
9
10
11
12
// 创建一个RDB接口的实现对象rdb,传入配置参数config  
RDB rdb = new RDBImpl(config);
// 创建一个HBase接口的实现对象hBase,传入配置参数config
HBase hBase = new HBaseImpl(config);
// 创建一个RDBToHBase接口的实现对象rdbToHBase,该对象用于将RDB中的数据迁移到HBase
RDBToHBase rdbToHBase = new RDBToHBaseImpl();
// 将之前创建的rdb对象设置为rdbToHBase对象的RDB实例
rdbToHBase.setRDB(rdb);
// 将之前创建的hBase对象设置为rdbToHBase对象的HBase实例
rdbToHBase.setHBase(hBase);
// 调用rdbToHBase对象的startTransfer方法,开始数据迁移过程
rdbToHBase.startTransfer();
  1. rdbToHBase对象的startTransfer(迁移数据)方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@Override
public void startTransfer() {
try {
rdb.init(); //调用RDB接口的实现对象rdb的初始化方法
loggerRH.info("RDB 初始化成功");
hbase.init(); //调用HBase接口的实现对象hbase的初始化方法
loggerRH.info("HBase 初始化成功");

loggerRH.info("数据从 RDB 迁移至 HBase 开始...");
int count = 0; // 记录批次
// 如果还有下一个批次
while (rdb.hashNextBatch()){
final List<Put> batch = rdb.nextBatch();//调用rdb对象的nextBatch()方法获取下一个批次的数据
hbase.putBatch(batch); //调用hbase对象的putBatch(List<Put> batch)方法将数据推送上HBase数据库
loggerRH.info(String.format("第 %d 批:%d 条数据插入成功", ++count, batch.size()));
}
loggerRH.info("数据从 RDB 迁移至 HBase 结束...");
}catch (Exception e){
loggerRH.error("将 RDB 数据批量迁移至 HBase 异常:",e);
} finally {
// 先开的后释放后开的先释放
hbase.close();
rdb.close();
}
}

三、全局配置文件

transfer.properties配置文件按需求设置如下参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# JDBC驱动类名,指定了连接MySQL所使用的JDBC驱动  
rdb.driver=com.mysql.cj.jdbc.Driver

# JDBC连接URL,用于连接MySQL数据库,包括IP地址、端口号和数据库名
rdb.url=jdbc:mysql://192.168.146.130:3306/test_db_for_bigdata

# 连接MySQL的用户名
rdb.username=root

# 连接MySQL的密码
rdb.password=123456

# 批量操作的记录数,即每次从MySQL读取的数据条数
rdb.batchSize=100

# SQL查询语句,用于从MySQL的test_table1_for_hbase_import表中读取数据
rdb.sql=select test_id,test_name,test_age,test_gender,test_phone from test_table1_for_hbase_import

# HBase列映射关系,指定了MySQL的列与HBase的列族和列之间的映射关系
# ROWKEY->test_id 表示MySQL的test_id列映射为HBase的ROWKEY
# baseInfo:name->test_name 表示MySQL的test_name列映射为HBase的baseInfo列族的name列
# 以此类推,其他列也有类似的映射关系,代码中按如下样例格式解析的
rdb.hbase.columns.mapping=ROWKEY->test_id,baseInfo:name->test_name,baseInfo:age->test_age,baseInfo:gender->test_gender,baseInfo:phone->test_phone

# HBase表名,数据将导入到这个HBase表中
hbase.table.name=hbase_test:tranfer_from_mysql

# HBase的ZooKeeper地址和端口,用于连接HBase集群
hbase.zk=192.168.146.130:2181

备注:可以按需求配置不同的mysql表导入hbase表

四、难点

1、面向对象OOP的设计理念

代码中不存在重复代码块,整体逻辑可以调用思路清晰

解决方式:提前总体的设计好接口继承关系等

实现方式

2、数据格式转化

关系型数据库数据格式转化为HBase行键,列族,列,值的格式

解决方式:配置文件按一定格式配置映射关系,在写相应的代码逻辑解析

实现方式:用Map的方式存储映射关系,方便后续使用

1
2
3
4
5
6
7
/**
*设计格式:ROWKEY->test_id,baseInfo:name->test_name,baseInfo:age->test_age,baseInfo:gender->test_gender,baseInfo:phone->test_phone
* 转化为hbase列族和列与rdb中列的映射关系
* hbase列族 列 rdb表的列
* @return Map<String, Map<String, String>配置
* 行键单独存储
*/

3、依赖的需求与使用

依赖需求见:五、项目依赖
使用hbase,mysql连接对象操作mysql,hbase。hadoop上传数据的Put格式的参数与使用。zookeeper配置。

解决方式:了解每个对象的方法的作用和其参数

实现方式

  • 创建一个HBase连接对象需要设置ZooKeeper的地址
  • 通过HBase连接对象获取HBase的Admin对象,用于执行DDL操作
  • 数据库连接对象创建并返回一个PreparedStatement对象,用于执行预编译的SQL语句
  • 等等…

备注:代码里含大量注释,感兴趣的可以下载代码查看

五、执行方式和输出介绍

1、运行项目配置

点击右上角编辑配置,添加Application配置好如下区域,点击Apply (应用)然后点击OK

2、运行结果输出

  1. 代码中含有详细日志信息可以在运行日志中查看报错信息,以及执行情况 在这里插入图片描述在这里插入图片描述
  2. 在项目同路径下生成日志文件(可更改log4j.properties配置文件改变路径以及输出格式)
    在这里插入图片描述

3、验证是否HBase表中数据是否正确添加

进入hbase命令行模式执行命令查看

1
hbase shell  # 进入hbase命令行模式

使用scan命令

1
2
truncate 'hbase_test:tranfer_from_mysql'  # 清空hbase_test命名空间下的tranfer_from_mysql表
scan 'hbase_test:tranfer_from_mysql' # 查看表

**加粗样式**

六、项目依赖

maven项目pom.xml文件依赖配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<dependencies>
<!-- MySql 驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
<!-- HBase 驱动 -->
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>2.3.5</version>
</dependency>
<!-- Hadoop -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>3.1.3</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-auth</artifactId>
<version>3.1.3</version>
</dependency>
<!-- zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.6.3</version>
</dependency>
<!-- log4j 系统日志 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>

七、拓展

1、增加数据源

类似RDB接口的设计与实现增加其他数据源

  1. 文件作为数据源

  2. 从提供的接口抓取每天的数据作为数据源

2、持续更新中


java代码将mysql表数据导入HBase
https://leaf-domain.gitee.io/2024/03/13/hbaseData/
作者
叶域
发布于
2024年3月13日
许可协议