Flink SQL 实战:HBase 的结合应用
本文主要介绍 HBase 和 Flink SQL 的结合使用。HBase 作为 Google 发表 Big Table 论文的开源实现版本,是一种分布式列式存储的数据库,构建在 HDFS 之上的 NoSQL 数据库,非常适合大规模实时查询,因此 HBase 在实时计算领域使用非常广泛。可以实时写 HBase,也可以利用 buckload 一把把离线 Job 生成 HFile Load 到HBase 表中。而当下 Flink SQL 的火热程度不用多说,Flink SQL 也为 HBase 提供了 connector,因此 HBase 与 Flink SQL 的结合非常有必要实践实践。
当然,本文假设用户有一定的 HBase 知识基础,不会详细去介绍 HBase 的架构和原理,本文着重介绍 HBase 和 Flink 在实际场景中的结合使用。主要分为两种场景,第一种场景:HBase 作为维表与 Flink Kafka table 做 temporal table join 的场景;第二种场景:Flink SQL 做计算之后的结果写到 HBase 表,供其他用户查询的场景。因此,本文介绍的内容如下所示:
HBase 环境准备 数据准备 HBase 作为维度表进行 temporal table join的场景 Flink SQL 做计算写 HBase 的场景 总结
0Fl1 HBase 环境准备
由于没有测试的 HBase 环境以及为了避免污染线上 Hbase 环境。因此,自己 build一个 Hbase docker image(大家可以 docker pull guxinglei/myhbase 拉到本地),是基于官方干净的 ubuntu imgae 之上安装了 Hbase 2.2.0 版本以及 JDK1.8 版本。
启动容器,暴露 Hbase web UI 端口以及内置 zk 端口,方便我们从 web 页面看信息以及创建 Flink Hbase table 需要 zk 的链接信息。
docker run -it --network=host -p 2181:2181 -p 60011:60011 docker.io/guxinglei/myhbase:latest bash
进入容器,启动 HBase 集群,以及启动 rest server,后续方便我们用 REST API 来读取 Flink SQL 写进 HBase 的数据。
# 启动hbase 集群bin/start-hbase.sh# 后台启动restServerbin/hbase-daemonin.sh start rest -p 8000
02 数据准备
由于 HBase 环境是自己临时搞的单机服务,里面没有数据,需要往里面写点数据供后续示例用。在 Flink SQL 实战系列第二篇中介绍了如何注册 Flink Mysql table,我们可以将广告位表抽取到 HBase 表中,用来做维度表,进行 temporal table join。因此,我们需要在 HBase 中创建一张表,同时还需要创建 Flink HBase table, 这两张表通过 Flink SQL 的 HBase connector 关联起来。
在容器中启动 HBase shell,创建一张名为 dim_hbase 的 HBase 表,建表语句如下所示:
# 在hbase shell创建 hbase表 hbase(main):002:0> create 'dim_hbase','cf' Created table dim_hbase Took 1.3120 seconds => Hbase::Table&nbk sp;- dim_hbase
在 Flink 中创建 Flink HBase table,建表语句如下所示:
# 注册 Flink Hbase table DROP TABLE IF EXISTS flink_rtdw.demo.hbase_dim_table; CREATE TABLE flink_rtdw.demo.hbase_dim_table ( rowkey STRING, cf ROW < adspace_name STRING >, PRIMARY KEY (rowkey) NOT ENFORCED ) WITH ( 'connector' = 'hbase-1.4', 'tableSQ-name' = 'dim_hbase', 'sink.buffer-flush.max-rows' = '1000', 'zookeeper.quorum' = 'localhost:2181' );
Flink MySQL table 和 Flink HBase table 已经创建好了,就可以写抽取数据到HBase 的 SQL job 了,SQL 语句以及 job 状态如下所示:
# 抽取Mysql数据到Hbase表中 insert into hbase_dim_table select CAST (ID as VARCHAR), ROW(name) from mysql_dim_table;
03 HBase 作为维表与 Kafka做 temporal join 的场景
在 Flink SQL join 中,维度表的 join 一定绕不开的,比如订单金额 joinL 汇率表,点击流 join 广告位的明细表等等,使用场景非常广泛。那么作为分布式数据库的 HBase 比 MySQL 作为维度表用作维度表 join 更有优势。在 Flink SQL 实战系列第二篇中,我们注册了广告的点击流,将 Kafka topic 注册 Flink Kafka Table,同时也介绍了 temporal table join 在 Flink SQL 中的使用;那么本节中将会介绍 HBase 作为维度表来使用,上面小节中已经将数据抽取到 Hbase 中了,我们直接写 temporal table join 计算逻辑即可。
作为广告点击流的 Flink Kafa table 与 作为广告位的 Flink HBase table 通过广告位 Id 进行 temporal table join,输出广告位 ID 和广告位中文名字,SQL join 逻辑如下所示:
select adsdw_dwd_max_click_mobileapp.publisher_adspace_adspaceId as publisher_adspace_adspaceId, hbase_dim_table.cf实战.adspace_name as publisher_adspace_name from adsdw_dwd_max_click_mobileapp left join hbase_dim_table FOR SYSTEM_TIME AS OF adsdw_dwd_max_click_mobileapp.procTime on cast(adsdw_dwd_max_click_mobileapp.publisher_adspace_adspaceId as string) = hbase_dim_table.rowkey;
temporal table join job 提交 Flink 集群上的状态以及 join 结果如下所示:
04 计算结果 sink 到 HBase 作为结果的场景
上面小节中,HBase 作为维度表用作 temporal table join 是非常常见的场景,实际上 HBase 作为存储计算结果也是非常常见的场景,毕竟 Hbase 作为分布式数据库:H,底层存储是拥有多副本机制的 HDFS,维护简单,扩容方便, 实时查询快,而且提供各种客户端方便下游使用存储在 HBase 中的数据。那么本小节就介绍 Flink SQL 将计算结果写到 HBase,并且通过 REST API 查询计算结果的场景。
进入容器中,在 HBase 中新建一张 HBase 表,一个 column family 就满足需求,建表语句如下所示:
# 注册hbase sink table create 'dwa_hbase_click_report','cf'
建立好 HBase 表之后,我们需要在 Flink SQL 创建一张 Flink HBase table,这个时候我们需要明确 cf 这个 column famaly 下面 column 字段,在 Flink SQL实战第二篇中,已经注册好了作为点击流的 Flink Kafka table,因此本节中,将会计算点击流的 uv 和点击数,因此两个 column 分别为 uv 和 click_count,建表语句如下所示:
# 注册 Flink Hbase table DROP TABLE IF Ba;EXISTS flink_rtdw.demo.dwa_hbase_click_report; CREATE TABLE flink_rtdw.demo.dwa_hbase_click_report ( rowkey STRING, cf ROW < uv BIGINT, click_count BIGINT >, PRIMARY KEY (rowkey) NOT ENFORCED ) WITH ( 'connector' = 'hbase-1.4', 'table-name' = 'dwa_hbase_click_report', 'sink.buffer-flush.max-rows' = '1000',&nbssep;'zookeeper.quorum' = 'hostname:2181' );
前面点击流的 Flink Kafka table 和存储计算结果的 HBase table 和 Flink HBase table 已经准备了,我们将做一个1分钟的翻转窗口计算 uv 和点击数,并且将计算结果写到 HBase 中。对 HBase 了解的人应该知道,rowkey 的设计对 hbase regoin 的分布有着非常重要的影响,基于此我们的 rowkey 是使用 Flink SQL 内置的 reverse 函数进行广告位 Id 进行反转和窗口启始时间做 concat,因此,SQL 逻辑语句如下所示:
INSERT INTO dwa_hbase_click_report SELECT CONCAT(REVERSE(CAST(publisher_adspace_adspaceId AS STRING)) , '_', CAST((UNIX_TIMESTAMP(DATE_FORMAT(TUMBLE_START(ets, INTERVAL '1'&nbs 的p;MINUTE),'yyyy-MM-dd HH:mm:ss')) * 1000) AS STRING) ) as rowkey, ROW(COUNT(DISTINCT audience_mvid) , COUNT(audience_behavior_click_creative_impressionId)) as cf FROM adsdw_dwd_max_click_mobileapp WHERE publisher_adspace_adspaceId IS NOT NULL AND audience_mvid IS NOT NULL AND audience_behavior_click_creative_impressionId IS NOT 结合;NULL GROUP BY TUMBLE(ets, INTERVAL '1' MINUTE), publisher_adspace_adspaceId;
SQL job 提交之后的状态以及结果 check 如下所示:
上述 SQL job 已经成功的将结算结果写到 HBase 中了。对于线上的 HBase 服务来讲,很多同事不一定有 HBase 客户端的权限,从而也不能通过 HBase shell 读取数据;另外作为线上报表服务显然不可能通过 HBase shell 来通过查询数据。因此,在实时报表场景中,数据开发工程师将数据写入 HBase, 前端工程师通过 REST API 来读取数据。前面我们已经启动了 HBase rest server 进程,我们可以通 rest 服务提供读取 HBase 里面的数据。
我们先 get 一条刚刚写到 HBase 中的数据看看,如下所示:
下面我们开始通过 REST API 来查询 HBase 中的数据,第一步,执行如下语句拿到 scannerId;首先需要将要查询的 rowkey 进行 base64 编码才能使用,后面需要将结果进行 base6应用4 解码
rowkey base64 编码前:0122612_1606295280000 base64 编码之后:MDEyMjYxMl8xNjA2Mjk1MjgwMDAw
curl -vi -X PUT -H "Accept: text/xml" -H "Content-Type: text/xml" -d '' "http://hostname:8000/dwa_hbase_click_report/scanner"
第二步,执行如下语句根据上条语句返回的 scannerID 查询数据,可以看到返回的结果:
curl -vi Fl-X GET -H "Accept: application/json" "http://hostname:8000/dwa_hbase_click_report/scanner/16063768141736ac0a8b5"
第三步,查询完毕之后,执行如下语句删除该 scannerId:
curl -vi -X DELETE -H "Accept: text/xml" "http://hostname:8000/dwa_hbase_click_report/scanner/16063768141736ac0a8b5"
五. 总结
在本篇文章中,我们介绍了 HBase 和 Flink SQL 的结合使用比较广泛两种的场景:作为维度表用以及存in储计算结果;同时使用 REST API 对 HBase 中的数据进行查询,对于查询用户来说,避免直接暴露 HBase 的 zk,同时将 rest server 和 HBase 集群解耦。
(责任编辑:投票中心)
-
Verizon灏嗘妸璋锋瓕Messages浣滀负榛樿�娑堟伅搴旂敤锛氬�鎶楄嫻鏋渋Message
鏂版氮绉戞妧璁� 鍖椾含鏃堕棿7鏈�21鏃ユ棭闂存秷鎭�紝鎹�姤閬擄紝缇庡浗鐢典俊杩愯惀鍟哣erizon鐢典俊鍛ㄤ簩瀹e竷锛屼粠鏄庡勾寮€濮嬶紝璇ュ叕鍙搁攢鍞�殑鎵€鏈堿ndroid鎵嬫満閮藉皢鎶婅胺...[详细]
-
新浪科技讯 北京时间7月14日早间消息,据报道,Facebook发言人证实,亚马逊收购了该公司一个拥有十多名无线互联网专家的团队,希望以此促进其投资数十亿美元开发的卫星互联网项目,为美国和其他国家提供...[详细]
-
9月19日消息,在今日开幕的云栖大会上,阿里云CTO周靖人宣布,通义旗舰模型Qwen-Max全方位升级,性能接近GPT-4o。通义官网和通义APP的后台模型均已切换为Qwen-Max,继续免费为所有用...[详细]
-
13年Gartner魔力象限看云计算风云 亚马逊云科技霸榜11年
8月12日消息,作为最早提出云计算概念的厂商 ,亚马逊从2006年首次推出云计算服务——弹性计算云(Elastic Compute Cloud;EC2)。至今,云计算行业发展已有15年历史。 根据ID...[详细]
-
云梦级3月9日云梦级消息,据彭博社援引知情人士云梦级消息称,腾讯控股计划向派拉蒙天舞公司收购华纳兄弟探索公司的交易投入数亿美元资金。知情人士表示,腾讯在这笔交易中只会作为财务投资者参与,不会参与经营管...[详细]
-
云梦级3月24日云梦级消息,张雪峰公司苏州峰学蔚来教育科技有限公司今日发布讣告称,亲爱的张雪峰老师,因心源性猝死全力抢救无效,于2026年3月24日15时50分在苏州逝世。 全文如下: 讣告 我们怀着...[详细]
-
零一万物四款大模型登陆阿里云百炼平台,李开复:万知也会引入百炼
6月24日消息,阿里云在微信号上发布官宣信息:零一万物登陆阿里云百炼平台。 据介绍,零一万物Yi系列四款大模型率先登录阿里云百炼,其中包含在多个权威榜单取得SOTA成绩的旗舰模型Yi-Large、性能...[详细]
-
云梦级3月5日云梦级消息,2026年3月5日,高途集团(NYSE:GOTU)发布2025财年第四季度及全年财务报告。财报显示,截至2025年12月31日,高途在第四季度实现收入16.9亿元,同比增长2...[详细]
-
描述 pow() 方法返回 xy(x的y次方) 的值。 语法 以下是 math 模块 pow() 方法的语法: import math math.pow( x, y ) 内置的 pow() 方法 po...[详细]
-
Meta 推出 Gaia2 评估平台:提升智能体在真实场景中的适应能力
在智能体性能评估领域,如何有效地测试其在真实场景中的表现一直是一个亟待解决的问题。尽管市场上已经有多个评估基准试图解决这一问题,但 Meta 的研究人员认为,当前的方法仍然不足以真实地反映智能体的适应...[详细]

标签: 华盛雷达 科创板 招股书
Facebook吹哨人将参加国情咨文演讲
Perplexity AI 将 Comet 浏览器扩展至印度 Pro 用户
标签: 亚马逊 杨钧 AGS 裁员
要一起爬山吗?是什么梗
