概述
最近看到有位自称阿里的工程师在gitbook收费4元[12]:
DDL形式实现kafka->Flink->Hbase
于是自己琢磨了下具体的流程,流程如下:
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],群里大佬指出写法太老了.
###############################################最终整个流程完整步骤和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链接) | |
--流入hbase,sink 定义 (具体见下方gitee链接) | |
--提交任务,user_id当做row key,其他的当做列簇 (具体见下方gitee链接) |
上述 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}
#######################################################实验结果##########################################################################
##################################################附录#####################################################################
附录-依赖问题
关于依赖包问题,我首先在[10]发现了一些hbase相关的jar
jar包名字 | 是否更新到 Flink1.12版本 | 作用 |
flink-hbase_2.12-1.10.2.jar | 否 | 用于gradoop |
是 | 是一个hbase驱动基础包 | |
是 | 猜测是上面一个jar的完整版 | |
是 | 猜测是为了支持Flink SQL Client的一个依赖包 |
先说结论,上面最后一个jar必须放入$FLINK_HOME/lib下面.
这里写一个小笔记,怎么知道上面这些jar是干嘛的呢?
以flink-hbase_2.12-1.10.2.jar为例:
点开https://mvnrepository.com/search?q=flink-hbase中的上图中的4 usages
会来到新的页面,如下:
此时我们就知道这个包是被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只保留后者即可,下面是对话
其实我是看了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写法,
在阅读其他资料的时候也需要注意这点.