概述

最近看到有位自称阿里的工程师在gitbook收费4元[12]:

DDL形式实现kafka->Flink->Hbase

于是自己琢磨了下具体的流程,流程如下:

flinkSQL关联hbase维度表 flink hbase_kafka

kafka的主题user_behavior中的内容,

通过Flink SQL Client,

传递给hbase的表venn

#########################################################################################################

开发环境

组件

版本

Flink(HA)

1.12

Zookeeper

3.6.0

Hadoop

3.1.2

Hbase(HA)

2.2.4

Kafka(HA)

2.5.0

这里解释下Hbase的版本号为什么不能再高了(最多2.2.6),因为官方文档[9]以及官方Repository[10]中Flink1.12对Hbase支持的最高版本是2.2.x

注意需要启动上述表格中的所有集群,

勿忘关闭防火墙,或者开启zookeeper/kafka集群需要的端口,否則有的尷尬的。

關閉防火牆命令:

service firewalld stop

hbase底层是hdfs,所以这里需要hadoop

###########################################################################################################

hbase常用操作

命令行

作用

hbase shell

进入命令行客户端

create 'venn','cf'

新建表格venn,其中cf是列簇

scan 'venn',{LIMIT=>1}

查看新建的表格中的数据内容

##########################################################################################################

资料调研(代码形式)

写入/读取方式

相关参考文献

继承RichSourceFunction(flink streaming)

[1][3][4]

继承RichSinkFunction重写父类方法(flink streaming)

[4][5][8][16]

重写TableInputFormat方法(flink streaming和flink dataSet)

[1][2][3][4]

重写TableOutputFormat(flink streaming和flink dataSet)

[1][2][3]

本文我们先不关心代码形式,

先设法处理DDL形式的kafka->Flink SQL Client->hbase

########################################可能用到的kafka命令##################################

 

可能用到的kafka命令

操作

命令

备注

查看topic

$KAFKA/bin/kafka-topics.sh --list --zookeeper Desktop:2181

 

 

user_behavior这个 topic发送 json 消息

 

$KAFKA/bin/kafka-console-producer.sh --broker-list Desktop:9091 --topic user_behavior

这里可能碰到[2]中的报错,注意检查命令中端口与配置文件server.properties中的listeners的端口严格保持一致

[2]中的报错还可能是某个节点的kafka挂掉导致的.

 

可能碰到[3]

注意关闭防火墙

 

 

使用kafka自带消费端测试下消费

$KAFKA/bin/kafka-console-consumer.sh --bootstrap-server Desktop:9091 --from-beginning --topic user_behavior

如果kafka自带消费者测试有问题,那么就不用继续往下面做了,

此时如果使用Flink SQL Client来消费也必然会出现问题

清除topic中所有数据[6](因为,万一你输错了呢?对吧)

$KAFKA/bin/kafka-topics.sh --zookeeper Desktop:2181 --delete --topic user_behavior

需要$KAFKA/config/server.properties设置

delete.topic.enable=true

kafka消费端用自带的上述命令行先确定能消费,先确保自己集群没有问题再往下走。

######################################一些资料调研############################################

关于DDL的写法调研

对于[14],群里大佬指出写法太老了.

flinkSQL关联hbase维度表 flink hbase_SQL_02

###############################################最终整个流程完整步骤和DDL/SQL代码###########################################

最终整个流程完整步骤和DDL/SQL代码

本文最终决定以[19]为准,从user_behavior这个topic的名字来看,这个实验其实是修改自Jark云邪的实验[20]

①往kafka的user_behavior传入数据

$KAFKA/bin/kafka-console-producer.sh --broker-list Desktop:9091 --topic user_behavior

数据示例如下(传一条按下回车):

{"user_id": "543462", "item_id":"1715", "category_id": "1464116", "behavior": "pv", "ts": "2017-11-26T01:00:00Z"}
 {"user_id": "662867", "item_id":"2244074", "category_id": "1575622", "behavior": "pv", "ts": "2017-11-26T01:00:00Z"}
 {"user_id": "561558", "item_id":"3611281", "category_id": "965809", "behavior": "pv", "ts": "2017-11-26T01:00:00Z"}
 {"user_id": "894923", "item_id":"3076029", "category_id": "1879194", "behavior": "pv", "ts": "2017-11-26T01:00:00Z"}
 {"user_id": "834377", "item_id":"4541270", "category_id": "3738615", "behavior": "pv", "ts": "2017-11-26T01:00:00Z"}
 {"user_id": "315321", "item_id":"942195", "category_id": "4339722", "behavior": "pv", "ts": "2017-11-26T01:00:00Z"}
 {"user_id": "625915", "item_id":"1162383", "category_id": "570735", "behavior": "pv", "ts": "2017-11-26T01:00:00Z"}
 {"user_id": "578814", "item_id":"176722", "category_id": "982926", "behavior": "pv", "ts": "2017-11-26T01:00:00Z"}
 {"user_id": "873335", "item_id":"1256540", "category_id": "1451783", "behavior": "pv", "ts": "2017-11-26T01:00:00Z"}
 {"user_id": "429984", "item_id":"4625350", "category_id": "2355072", "behavior": "pv", "ts": "2017-11-26T01:00:00Z"}
 {"user_id": "866796", "item_id":"534083", "category_id": "4203730", "behavior": "pv", "ts": "2017-11-26T01:00:00Z"}
 {"user_id": "937166", "item_id":"321683", "category_id": "2355072", "behavior": "pv", "ts": "2017-11-26T01:00:00Z"}

②终端输入hbase shell

建表参考[21]
hbase(main):014:0> create 'venn','cf'

③启动Flink SQL Client(注意附带要启动Flink集群,本实验室standalone模式)

Flink SQL Client中依次输入

输入后的实验效果

-- 读 kafka ,source定义

(具体见下方gitee链接)

flinkSQL关联hbase维度表 flink hbase_kafka_03

--流入hbase,sink 定义

(具体见下方gitee链接)

 

--提交任务,user_id当做row key,其他的当做列簇

(具体见下方gitee链接)

flinkSQL关联hbase维度表 flink hbase_flinkSQL关联hbase维度表_04

上述 DDL可能在粘贴复制中被网页污染导致无法运行,以下方链接为准:

https://gitee.com/appleyuchi/Flink_Code/blob/master/FLINK读写各种数据源/Kafka_Flink_Hbase.txt

提交后,终端输入hbase shell登录hbase 客户端,

这里解释下为什么上面的DDL是2.2.3,而环境版本里面是2.2.4,这是因为这篇博文采用的是老版本的DDL写法,会校对最高小版本号为2.2.3

如果采用新的DDL option写法(本文没有采用,DDL option写法会无视小版本号校对,option写法是本文附录中flink开发者提及的.)

 

查看结果:

hbase(main):002:0> scan 'venn',{LIMIT=>1}

#######################################################实验结果##########################################################################

flinkSQL关联hbase维度表 flink hbase_flinkSQL关联hbase维度表_05

##################################################附录#####################################################################

附录-依赖问题

关于依赖包问题,我首先在[10]发现了一些hbase相关的jar

jar包名字

是否更新到

Flink1.12版本

作用

flink-hbase_2.12-1.10.2.jar


用于gradoop

flink-connector-hbase-base_2.12-1.12.0.jar


是一个hbase驱动基础包

flink-connector-hbase-2.2_2.12-1.12.0.jar


猜测是上面一个jar的完整版

flink-sql-connector-hbase-2.2_2.12-1.12.0.jar


猜测是为了支持Flink SQL Client的一个依赖包

先说结论,上面最后一个jar必须放入$FLINK_HOME/lib下面.

这里写一个小笔记,怎么知道上面这些jar是干嘛的呢?

以flink-hbase_2.12-1.10.2.jar为例:

flinkSQL关联hbase维度表 flink hbase_flinkSQL关联hbase维度表_06

点开https://mvnrepository.com/search?q=flink-hbase中的上图中的4 usages

会来到新的页面,如下:

flinkSQL关联hbase维度表 flink hbase_flinkSQL关联hbase维度表_07

此时我们就知道这个包是被gradoop这个工具包调用的,和我们即将进行的实验很可能关系不大

 

最后,我决定在$FLINK_HOME/lib下面放两个依赖包:

flink-connector-hbase-2.2_2.12-1.12.0.jar

flink-sql-connector-hbase-2.2_2.12-1.12.0.jar

钉钉群里问开发者的时候时候,雲邪说上述兩個Jar只保留后者即可,下面是对话

flinkSQL关联hbase维度表 flink hbase_kafka_08

flinkSQL关联hbase维度表 flink hbase_flinkSQL关联hbase维度表_09

flinkSQL关联hbase维度表 flink hbase_flink_10

flinkSQL关联hbase维度表 flink hbase_flink_11

flinkSQL关联hbase维度表 flink hbase_flinkSQL关联hbase维度表_12

flinkSQL关联hbase维度表 flink hbase_kafka_13

flinkSQL关联hbase维度表 flink hbase_flink_14

flinkSQL关联hbase维度表 flink hbase_SQL_15

flinkSQL关联hbase维度表 flink hbase_SQL_16

其实我是看了Flink1.12的2.11的文档,去尝试2.12的实验(所以并非我搞混2.11和2.12)

发现Flink1.12并不支持Hbase2.2.6和Hbase2.2.4,于是去官方群里提问,

他们解释说由于我采用了老版本的DDL的写法,导致flink对小版本号开始校验了.

也就是说从1.11开始,DDL出了一种他们称为option的写法,

老版本的写法会校对小版本号(本文采用了老版本的DDL写法),

option写法[9]不会校对小版本号(官方推荐)

文中使用的是老版本的写法

从这里也可以看出,DDL的写法发生了不小的变化,从一开始的支持 Schema以及上述gitee中的老版本写法以及后续的option,至少有三个版本的DDL写法,

在阅读其他资料的时候也需要注意这点.