目录
[1. 代码结构](#1. 代码结构)
[(1) 主程序入口](#(1) 主程序入口)
[(2) 定义数据流](#(2) 定义数据流)
[(3) 自定义 HBase Sink](#(3) 自定义 HBase Sink)
[(4) 初始化 HBase 连接](#(4) 初始化 HBase 连接)
[(5) 写入数据到 HBase](#(5) 写入数据到 HBase)
[(6) 关闭 HBase 连接](#(6) 关闭 HBase 连接)
[(7) 执行任务](#(7) 执行任务)

这段代码展示了如何使用 Apache Flink 将数据流写入 HBase,并使用了 RichSinkFunction 来实现自定义的 Sink 逻辑。以下是对代码的详细解析和说明:
1. 代码结构
-
包声明 :
package sink定义了代码所在的包。
-
导入依赖 :
导入了必要的 Flink 和 HBase 相关类库,包括:
org.apache.flink.configuration.Configuration:Flink 配置类。org.apache.flink.streaming.api.functions.sink.{RichSinkFunction, SinkFunction}:Flink 的 Sink 相关类。org.apache.flink.streaming.api.scala._:Flink 流处理 API。org.apache.hadoop.hbase:HBase 相关类库。
-
sinkToHbase对象 :主程序入口,包含 Flink 流处理逻辑和 HBase Sink 的配置。
Scala
package sink
import java.nio.charset.StandardCharsets
import org.apache.flink.configuration.Configuration
import org.apache.flink.streaming.api.functions.sink.{RichSinkFunction, SinkFunction}
import org.apache.flink.streaming.api.scala._
import org.apache.hadoop.conf
import org.apache.hadoop.hbase.{HBaseConfiguration, TableName}
import org.apache.hadoop.hbase.client.{Connection, ConnectionFactory, Put}
/**
*
* @PROJECT_NAME: flink1.13
* @PACKAGE_NAME: sink
* @author: 赵嘉盟-HONOR
* @data: 2023-11-20 15:37
* @DESCRIPTION
*
*/
object sinkToHbase {
def main(args: Array[String]): Unit = {
val env = StreamExecutionEnvironment.getExecutionEnvironment
val data = env.fromElements(
Event("Mary", "./home", 100L),
Event("Sum", "./cart", 500L),
Event("King", "./prod", 1000L),
Event("King", "./root", 200L)
)
data.addSink(new RichSinkFunction[Event] {
var conn:Connection=null
override def open(parameters: Configuration): Unit = {
val conf = HBaseConfiguration.create()
conf.set("","")
conn=ConnectionFactory.createConnection(conf)
}
override def invoke(value: Event, context: SinkFunction.Context): Unit = {
val table=conn.getTable(TableName.valueOf("test"))
val put = new Put("rowkey".getBytes(StandardCharsets.UTF_8))
put.addColumn(
"info".getBytes(StandardCharsets.UTF_8),
"username".getBytes(StandardCharsets.UTF_8),
value.user.getBytes(StandardCharsets.UTF_8))
table.put(put)
table.close()
}
override def close(): Unit = conn.close()
})
env.execute("sinkToHbase")
}
}
getTable:指定命名空间与写入表名,用分号分割
Put:指定rowkey
addColumn:指定列族,列名,值
代码解析
(1) 主程序入口
Scala
def main(args: Array[String]): Unit = {
val env = StreamExecutionEnvironment.getExecutionEnvironment
- 创建 Flink 流处理环境
StreamExecutionEnvironment。
(2) 定义数据流
Scala
val data = env.fromElements(
Event("Mary", "./home", 100L),
Event("Sum", "./cart", 500L),
Event("King", "./prod", 1000L),
Event("King", "./root", 200L)
)
- 使用
fromElements方法生成一个包含 4 个Event对象的流。
(3) 自定义 HBase Sink
Scala
data.addSink(new RichSinkFunction[Event] {
var conn: Connection = null
- 使用
RichSinkFunction实现自定义的 Sink 逻辑。 - 定义
conn变量用于存储 HBase 连接。
(4) 初始化 HBase 连接
Scala
override def open(parameters: Configuration): Unit = {
val conf = HBaseConfiguration.create()
conf.set("", "") // 设置 HBase 配置
conn = ConnectionFactory.createConnection(conf)
}
- 在
open方法中初始化 HBase 连接:- 创建 HBase 配置对象
HBaseConfiguration。 - 设置 HBase 配置(未填写具体配置)。
- 创建 HBase 连接
Connection。
- 创建 HBase 配置对象
(5) 写入数据到 HBase
Scala
override def invoke(value: Event, context: SinkFunction.Context): Unit = {
val table = conn.getTable(TableName.valueOf("test"))
val put = new Put("rowkey".getBytes(StandardCharsets.UTF_8))
put.addColumn(
"info".getBytes(StandardCharsets.UTF_8),
"username".getBytes(StandardCharsets.UTF_8),
value.user.getBytes(StandardCharsets.UTF_8))
table.put(put)
table.close()
}
- 在
invoke方法中将数据写入 HBase:- 获取 HBase 表
test。 - 创建
Put对象,设置行键为rowkey。 - 添加列族
info和列username,值为Event对象的user字段。 - 将数据写入 HBase 表。
- 关闭表连接。
- 获取 HBase 表
(6) 关闭 HBase 连接
Scala
override def close(): Unit = conn.close()
- 在
close方法中关闭 HBase 连接。
(7) 执行任务
Scala
env.execute("sinkToHbase")
- 启动 Flink 流处理任务,任务名称为
sinkToHbase。