Flink数据流高效写入HBase实战

目录

[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
(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 表。
    • 关闭表连接。
(6) 关闭 HBase 连接
Scala 复制代码
override def close(): Unit = conn.close()
  • close 方法中关闭 HBase 连接。
(7) 执行任务
Scala 复制代码
env.execute("sinkToHbase")
  • 启动 Flink 流处理任务,任务名称为 sinkToHbase
相关推荐
2501_9336707913 小时前
2026 高职大数据专业考什么证书对就业有帮助?
大数据
xiaobaibai15313 小时前
营销自动化终极形态:AdAgent 自主闭环工作流全解析
大数据·人工智能·自动化
星辰_mya13 小时前
Elasticsearch更新了分词器之后
大数据·elasticsearch·搜索引擎
xiaobaibai15313 小时前
决策引擎深度拆解:AdAgent 用 CoT+RL 实现营销自主化决策
大数据·人工智能
悟纤13 小时前
学习与专注音乐流派 (Study & Focus Music):AI 音乐创作终极指南 | Suno高级篇 | 第33篇
大数据·人工智能·深度学习·学习·suno·suno api
ESBK202513 小时前
第四届移动互联网、云计算与信息安全国际会议(MICCIS 2026)二轮征稿启动,诚邀全球学者共赴学术盛宴
大数据·网络·物联网·网络安全·云计算·密码学·信息与通信
Elastic 中国社区官方博客13 小时前
Elasticsearch:Workflows 介绍 - 9.3
大数据·数据库·人工智能·elasticsearch·ai·全文检索
B站_计算机毕业设计之家13 小时前
豆瓣电影推荐系统 | Python Django Echarts构建个性化影视推荐平台 大数据 毕业设计源码 (建议收藏)✅
大数据·python·机器学习·django·毕业设计·echarts·推荐算法
莽撞的大地瓜14 小时前
洞察,始于一目了然——让舆情数据自己“说话”
大数据·网络·数据分析
证榜样呀14 小时前
2026 中专大数据技术专业可考的证书有哪些,必看!
大数据·sql