Flink 使用(一)——从kafka中读取数据写入到HBASE中
1、前言
本文是在《如何计算实时热门商品》[1]一文上做的扩展,仅在功能上验证了利用Flink消费Kafka数据,把处理后的数据写入到HBase的流程,其具体性能未做调优。此外,文中并未就Flink处理逻辑做过多的分析,只因引文(若不特殊说明,文中引文皆指《如何计算实时热门商品》一文)中写的很详细了,故仅给出博主调试犯下的错。文中若有错误,欢迎大伙留言指出,谢谢!
源码在GitHub上,地址:https://github.com/L-Wg/flinkExample;
环境:Flink 1.6+Kafka 1.1+HBase 1.2
OpenJDK 1.8+Maven 3.5.2
2、获取数据
本文是将Kafka作为数据源(目前业界比较流行的做法),数据的格式和引文的格式一致,数据类型为POJO。为添加源,一般是实现接口SourceFunction<T>,但是Flink与Kafka的链接器(connector),Flink社区已经做好了,我们只需在pom文件中加入相应的依赖即可。这里有值得注意的一点是:flink-connector-kafka-*.jar是有版本要求的,其具体的要求可以参加Flink官网connector一节[2]。代码如下:
DataStream<UserBehaviorSchema> dataStream=env.addSource(new FlinkKafkaConsumer010<UserBehaviorSchema>(
topic,
new UserBehaviorSerial(),
properties
).setStartFromEarliest());
其中,在代码中需指定的有:要消费的topic、数据序列化的对象以及配置,其中,配置可指定bootstrap.servers即可,其他配置按需设置。调用setStarFromEarliest()是为让Flink从头消费指定topic中数据,这样写的好处是:只要你Kafka topic中存在数据,测试时就不用重新往kafka里写数据了。当然调用该方法不仅仅是这个作用,其在业务上的使用需根据需求。此外,Flink中还有诸多指定消费kafka的方法,详情请见官网[2]。
这里值得说的一点是获取数据后,dataStream的值是不变的,不会因为做过flatmap等操作后就会改变。
3、数据转换
对Flink 代码的分析过程见引文,此处仅有以下几点需说明的:
1. 若是kafka中的数据是自己按照因为数据格式随机生成的,请不要按照博主代码中customWaterExtractor()类的写法去定义watermark和timestamp,因为代码中的currentTimeStamp的值可能也是随机的,所以就会造成程序不报错但是卡死等待的情况。
2. timestamp的值要和数据源中数据保持相同的数据级。
public static class customWaterExtractor implements AssignerWithPeriodicWatermarks<UserBehaviorSchema>{
private static final long serialVersionUID = 298015256202705122L;
private final long maxOutOrderness=3500;
private long currentTimeStamp=Long.MIN_VALUE;
@Nullable
@Override
public Watermark getCurrentWatermark() {
return new Watermark(currentTimeStamp-maxOutOrderness);
}
@Override
public long extractTimestamp(UserBehaviorSchema element, long previousElementTimestamp) {
// 此处需要注意的点:timestamp得到的值是否乘以1000转换为毫秒,需要根据消息中被指定为timestamp字段的单位。
long timeStamp=element.timestamp*1000;
currentTimeStamp=Math.max(timeStamp,currentTimeStamp);
return timeStamp;
}
}
3. 在返回的结果类ResultEvent中,使用sinking字段去保存HotTopN的名次,其默认值为0。
4、数据存储
本文中是通过extends RichSinkFunction来实现将数据写入HBase中,其中,@Override的invoke()方法是针对每条数据都会调用的,其余的open()、close()方法,从日志上看是不是针对每条数据都会调用。对open()方法用于打开链接,最好实现连接池避免链接过多,此处HBase的connection已自身实现不用单独实现。
数据写入HBase时,有两点建议:
1. 将数据写入HBase的表中时,最好先做好表的预分区工作,避免后期因为表的split造成性能下降以及维护上的困难;
2. 为加快HBase的查询速度,可以将制定字段作为HBase表的rowkey,文中是指定时间戳和排名作为表的rowkey,至于二级索引等暂不在此处讨论。
5、参考文献链接:
[1]http://wuchong.me/blog/2018/11/07/use-flink-calculate-hot-items/
[2]https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/connectors/kafka.html
Flink 使用(一)——从kafka中读取数据写入到HBASE中的更多相关文章
- hbase使用MapReduce操作4(实现将 HDFS 中的数据写入到 HBase 表中)
实现将 HDFS 中的数据写入到 HBase 表中 Runner类 package com.yjsj.hbase_mr2; import com.yjsj.hbase_mr2.ReadFruitFro ...
- 通过jquery,从json中读取数据追加到html中
1.下载安装jquery 可通过下面的方法引入在线版本的js: <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jque ...
- Python学习笔记_从CSV读取数据写入Excel文件中
本示例特点: 1.读取CSV,写入Excel 2.读取CSV里具体行.具体列,具体行列的值 一.系统环境 1. OS:Win10 64位英文版 2. Python 3.7 3. 使用第三方库:csv. ...
- 从JSON中读取数据追加到HTML中
本文来自https://www.jianshu.com/p/04127d74d88c,并非本人原创,只是作为自己学习使用的资料,如有浏览者请点击地址自行到原作者页面浏览 有时候我们需要将json数据直 ...
- Jmeter从数据库中读取数据
Jmeter从数据库中读取数据 1.测试计划中添加Mysql Jar包 2.添加线程组 3.添加 jdbc connection configuration 4.添加JDBC Request,从数据库 ...
- c和c++中读取数据的方式总结
目录 c 输出 printf() 输入 scanf getchar(), putchar() gets(), puts() c++ 输入 cin() getline() get() 输出 cout 最 ...
- Kafka消费者 从Kafka中读取数据并写入文件
Kafka消费者 从Kafka中读取数据 最近有需求要从kafak上消费读取实时数据,并将数据中的key输出到文件中,用于发布端的原始点进行比对,以此来确定是否传输过程中有遗漏数据. 不废话,直接上代 ...
- flink04 -----1 kafkaSource 2. kafkaSource的偏移量的存储位置 3 将kafka中的数据写入redis中去 4 将kafka中的数据写入mysql中去
1. kafkaSource 见官方文档 2. kafkaSource的偏移量的存储位置 默认存在kafka的特殊topic中,但也可以设置参数让其不存在kafka的特殊topic中 3 将k ...
- 从多个XML文档中读取数据用于显示webapi帮助文档
前言: 你先得知道HelpPageConfig文件,不知道说明你现在不需要这个,所以下文就不用看了,等知道了再看也不急.当然如果你很知道这个,下文也不用看了,因为你会了. 方法一: new XmlDo ...
随机推荐
- 【WebSocket】WebSocket快速入门
WebSocket介绍 WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议. WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动 ...
- oracle的jdbc 的maven配置
oracle的jdbc是需要收费,因此在maven的中心库是无法下载.有两个办法引入到工程中,一个是手工,另外一个是加入oracle自己的maven库 一.手工配置(本地依赖) 首先要下载到想要的版本 ...
- NI MAX中缺少串口(转)
Software Measurement & Automation Explorer (MAX) Driver NI-VISA 问题详述 在NI MAX中,设备和接口中的串口不可用或缺 ...
- HTML-头部
HTML <head> 元素 <head> 元素是所有头部元素的容器.<head> 内的元素可包含脚本,指示浏览器在何处可以找到样式表,提供元信息,等等. 以下标签 ...
- SQL Server导入Excel文件报错
目录 文本被截断,或者一个或多个字符在目标代码页中没有匹配项 原因 解决方法 该值违反了该列的完整性约束 空行 没有设置为允许为NULL 我以前也导入过数据,也没报错,今天再次导入数据的时候,发现了两 ...
- 安裝TA-Lib到想要罵髒話
收集下載股票交易指數的歷史數據,並計算主要的幾個指標來進行技術分析. 查找網上的資料,發現大家都在用TA-Lib來計算指標,於是在下載並匯入了數據後開始安裝這個庫. pip install TA-Li ...
- [LeetCode] 568. Maximum Vacation Days 最大化休假日
LeetCode wants to give one of its best employees the option to travel among N cities to collect algo ...
- .Net Core 2.0发布到 CentOS
上一篇 在CentOS 7中 使用 Nginx 反代 .Net Core 中创建的项目是创建的默认项目,现在我们来将我们开发的项目发布到 CentOs 中,反代还是使用 Nginx 1.创建一个 .N ...
- 【VS开发】Visual C++内存泄露检测—VLD工具使用说明
Visual C++内存泄露检测-VLD工具使用说明 一. VLD工具概述 Visual Leak Detector(VLD)是一款用于Visual C++的免费的内存泄露检测工具.他的 ...
- 手贱重置了mysql密码,导致登陆不进去的解决办法
上午手残,重置了下MySQL的密码,导致用命令登陆不进去 由于版本的问题,导致网上的方法都不可用 折腾了一上午,摸索+参考官方文档,终于搞定 利用--init-file 第一步,关掉系统服务 ...