1.适合计算机专业学生的论坛有哪些?
2.Flink深入浅出:JDBC Connector源码分析
3.详解flink中Look up维表的使用
4.Apache Hudi X Apache Kyuubi,中国移动云湖仓一体的探索与实践
适合计算机专业学生的论坛有哪些?
硬核推荐!技术社区、开源项目及经典书籍,三大领域,为计算机专业学生量身打造学习资源,百度OCR表单源码助你技术之路更上一层楼。
一、技术社区推荐
1、Github
网址:github.com
Github,程序员的天堂,国内知名大厂如阿里、腾讯、字节跳动、美团、Google、Microsoft等均在这里分享其宝贵的开源项目。这里不仅是一个代码仓库,更是学习交流的宝地。通过参与阅读优秀开源项目的代码和文档,甚至主动提出代码贡献,能极大提升你的编程技能和团队协作能力。
2、Stack Overflow
网址:stackoverflow.com
Stack Overflow,程序员的问答社区。区别于知乎等平台,它专注于问题解决,而非讨论。对于遇到的开发问题,只需具备一定的搜索能力,几乎都能在这里找到答案。参与回答问题,不仅能帮助他人,素材 交易 源码还能提升个人影响力,增强社区贡献感。
二、开源项目推荐
1、Redis
Redis,性能卓越、数据类型丰富、支持原子操作,具备发布/订阅、通知、键过期等特色功能。简洁的代码风格使其易于阅读与理解,是提升编程技能与代码风格的绝佳资源。
2、Apache RocketMQ
阿里开源的消息中间件,经过双大促的考验,稳定性与性能得到充分验证。适用于构建高效、可扩展的消息系统。
3、Apache Flink
Flink,流处理框架,支持批处理与流处理程序的执行,提供高吞吐量、低延迟的数据处理能力。适用于实时数据处理与分析场景。
4、Google guava
Google提供的Java库,包含丰富的函数与功能,如缓存与限流实现,是深入理解Java库与设计模式的宝贵资源。
5、tc辅助源码sharding-jdbc
数据库分库分表、读写分离的中间件,适用于复杂数据库架构的设计与优化。
6、RxJava
Java平台上的响应式扩展,提供异步编程的强大工具,适用于构建响应式UI与复杂事件驱动系统。
7、Spring
无需多言,Spring框架是Java开发的基石,掌握Spring有助于构建高效、可维护的应用程序。
三、多阅读经典书籍
阅读经典书籍是构建坚实知识基础的关键。博客虽能提供学习思路,但真正的知识来源于经典书籍的阅读。推荐纸质版书籍,尊重作者劳动成果,提升阅读体验。电子书也应充分利用,避免遗忘,有条件时购买实体书。
四、总结与资源推荐
掌握经典编程语言的学习路径,如C语言、C++、Java等。阅读计算机必读经典书籍,系统性地提升专业能力。利用资源平台如GitHub、Stack Overflow等参与开源项目,提升实战技能。网psd源码关注计算机专业书籍推荐,规划个人学习路径。学习计算机之路,需耐心与毅力,经典书籍、源码阅读与实践是通往成功的必经之路。
Flink深入浅出:JDBC Connector源码分析
大数据开发中,数据分析与报表制作是日常工作中最常遇到的任务。通常,我们通过读取Hive数据来进行计算,并将结果保存到数据库中,然后通过前端读取数据库来进行报表展示。然而,使用FlinkSQL可以简化这一过程,通过一个SQL语句即可完成整个ETL流程。
在Flink中,读取Hive数据并将数据写入数据库是常见的需求。本文将重点讲解数据如何写入数据库的过程,包括刷写数据库的机制和原理。
以下是本文将讲解的几个部分,以解答在使用过程中可能产生的疑问:
1. 表的定义
2. 定义的表如何找到具体的实现类(如何自定义第三方sink)
3. 写入数据的机制原理
(本篇基于1..0源码整理而成)
1. 表的定义
Flink官网提供了SQL中定义表的示例,以下以oracle为例:
定义好这样的表后,就可以使用insert into student执行插入操作了。接下来,我们将探讨其中的技术细节。
2. 如何找到实现类
实际上,这一过程涉及到之前分享过的SPI(服务提供者接口),即DriverManager去寻找Driver的过程。在Flink SQL执行时,会通过translate方法将SQL语句转换为对应的Operation,例如insert into xxx中的xxx会转换为CatalogSinkModifyOperation。这个操作会获取表的经典骨牌源码信息,从而得到Table对象。如果这个Table对象是CatalogTable,则会进入TableFactoryService.find()方法找到对应的实现类。
寻找实现类的过程就是SPI的过程。即通过查找路径下所有TableFactory.class的实现类,加载到内存中。这个SPI的定义位于resources下面的META-INFO下,定义接口以及实现类。
加载到内存后,首先判断是否是TableFactory的实现类,然后检查必要的参数是否满足(如果不满足会抛出异常,很多人在第一次使用Flink SQL注册表时,都会遇到NoMatchingTableFactoryException异常,其实都是因为配置的属性不全或者Jar报不满足找不到对应的TableFactory实现类造成的)。
找到对应的实现类后,调用对应的createTableSink方法就能创建具体的实现类了。
3. 工厂模式+创建者模式,创建TableSink
JDBCTableSourceSinkFactory是JDBC表的具体实现工厂,它实现了stream的sinkfactory。在1..0版本中,它不能在batch模式下使用,但在1.版本中据说会支持。这个类使用了经典的工厂模式,其中createStreamTableSink负责创建真正的Table,基于创建者模式构建JDBCUpsertTableSink。
创建出TableSink之后,就可以使用Flink API,基于DataStream创建一个Sink,并配置对应的并行度。
4. 消费数据写入数据库
在消费数据的过程中,底层基于PreparedStatement进行批量提交。需要注意的是提交的时机和机制。
控制刷写触发的最大数量 'connector.write.flush.max-rows' = ''
控制定时刷写的时间 'connector.write.flush.interval' = '2s'
这两个条件先到先触发,这两个参数都是可以通过with()属性配置的。
JDBCUpsertFunction很简单,主要的工作是包装对应的Format,执行它的open和invoke方法。其中open负责开启连接,invoke方法负责消费每条数据提交。
接下来,我们来看看关键的format.open()方法:
接下来就是消费数据,执行提交了
AppendWriter很简单,只是对PreparedStatement的封装而已
5. 总结
通过研究代码,我们应该了解了以下关键问题:
1. JDBC Sink执行的机制,比如依赖哪些包?(flink-jdbc.jar,这个包提供了JDBCTableSinkFactory的实现)
2. 如何找到对应的实现?基于SPI服务发现,扫描接口实现类,通过属性过滤,最终确定对应的实现类。
3. 底层如何提交记录?目前只支持append模式,底层基于PreparedStatement的addbatch+executeBatch批量提交
4. 数据写入数据库的时机和机制?一方面定时任务定时刷新,另一方面数量超过限制也会触发刷新。
更多Flink内容参考:
详解flink中Look up维表的使用
背景
在流式计算领域,维表是一种常用概念,主要用于SQL的JOIN操作,以实现对流数据的补充。比如,我们的数据源stream是订单日志,日志中仅记录了订单商品的ID,缺乏其他信息。但在数据分析时,我们需要商品名称、价格等详细信息,这时可以通过查询维表对数据进行补充。
维表通常存储在外部存储中,如MySQL、HBase、Redis等。本文以MySQL为例,介绍Flink中维表的使用。
LookupableTableSource
Flink提供LookupableTableSource接口,用于实现维表功能。通过特定的key列查询外部存储,获取相关信息,以补充stream数据。
LookupableTableSource有三个方法
在Flink中,实现LookupableTableSource接口的主要有四个类:JdbcTableSource、HBaseTableSource、CsvTableSource和HiveTableSource。本文以JDBC为例,讲解如何进行维表查询。
实例讲解
以下是一个示例,首先定义stream source,使用Flink 1.提供的datagen生成数据。
我们模拟生成用户数据,范围在1-之间。
datagen具体的使用方法请参考:
聊聊Flink 1.中的随机数据生成器-DataGen connector
然后创建一个MySQL维表信息:
该MySQL表中样例数据如下:
最后执行SQL查询,流表关联维表:
结果示例如下:
对于维表中存在的数据,已关联出来,对于维表中不存在的数据,显示为null。
完整代码请参考:github.com/zhangjun0x...
源码解析JdbcTableSource
以JDBC为例,看看Flink底层是如何实现的。
JdbcTableSource#isAsyncEnabled方法返回false,即不支持异步查询,因此进入JdbcTableSource#getLookupFunction方法。
最终构造一个JdbcLookupFunction对象。
JdbcLookupFunction
接下来看看JdbcLookupFunction类,它是TableFunction的子类,具体使用可参考以下文章:
Flink实战教程-自定义函数之TableFunction
TableFunction的核心是eval方法,在该方法中,主要工作是使用多个keys拼接成SQL查询数据,首先查询缓存,缓存有数据则直接返回,缓存无数据则查询数据库,并将查询结果返回并放入缓存。下次查询时,直接查询缓存。
为什么要加缓存?默认情况下不开启缓存,每次查询都会向维表发送请求,如果数据量较大,会给存储维表的系统造成压力。因此,Flink提供了LRU缓存,查询维表时,先查询缓存,缓存无数据则查询外部系统。如果某个数据查询频率较高,一直被命中,则无法获取新数据。因此,缓存需要设置超时时间,超过这个时间则强制删除该数据,查询外部系统获取新数据。
如何开启缓存?请参考JdbcLookupFunction#open方法:
即cacheMaxSize和cacheExpireMs需要同时设置,构造缓存对象cache来缓存数据。这两个参数对应的DDL属性为lookup.cache.max-rows和lookup.cache.ttl。
对于具体的缓存大小和超时时间的设置,用户需要根据自身情况自行定义,在数据准确性和系统吞吐量之间进行权衡。
Apache Hudi X Apache Kyuubi,中国移动云湖仓一体的探索与实践
湖仓一体概述
“湖仓一体”是一个结合了数据湖的灵活性与生态丰富性及数据仓库的成长性概念,这一架构通过计算和存储分离,为数据管理提供了开放的技术架构范例。随着业务数据量的爆炸式增长和对高时效性的需求,湖仓一体架构在数据湖与数据仓库之间实现了动态转换,以满足不同业务场景的需求。
移动云 LakeHouse 实践
移动云采用云原生大数据分析 LakeHouse 架构,它基于移动云对象存储 EOS 和内置 HDFS,提供支持 Hudi 存储机制的湖仓一体方案。内置 Spark 引擎支持交互式查询,快速洞察业务数据变化。
核心功能包括存储和计算分离、一键入湖、智能元数据发现和按量计算等。在基于 RBF 的逻辑视图中,移动云借鉴 RBF 的统一视图隔离能力,实现存储资源的多租户隔离,通过 Zookeeper 和 RBF 服务容器化部署,用户可以快速创建、扩展和回收资源。
公有云场景下,移动云通过修改 Hive 源码在表属性中添加 s3 认证参数,实现多租户效果,无需重启 Hive 服务。在大数据生态中,多种计算引擎通过 Metastore 服务访问 Hive 数据,移动云基于 Hive 表属性实现获取对象存储认证参数插件,简化业务开发流程。
Serverless 实现中,移动云通过 RBF 的多租户实现,将 Spark 进程运行在安全隔离的 K8S Namespace 中,根据资源规格对应不同的计算单元,实现微批和即席 ad-hoc 场景的高效计算资源管理。
元数据管理与发现模块通过智能识别结构化、半结构化文件的元数据构建数据目录,并提供类 Hive Metastore 的 API 供计算引擎直接访问。
移动云引入 FlinkX 实现高效数据迁移,支持多种异构数据源之间的数据同步。Kyuubi 支持多租户、多种计算引擎的 JDBC 连接服务,提供高可用性和负载均衡,同时优化和改造了相应的模块以适应移动云的账号体系及 LakeHouse 架构。
在构建云原生大数据分析平台时,LakeHouse 支持多样化数据来源,并提供离线批处理、实时计算、交互式查询能力,节省了传统大数据平台所需的软硬件资源、研发成本和运维成本。
在私有云场景下,引入 Lakehouse 能力,统一数据存储和管理,形成湖仓一体的元数据视图,适应多种数据统一存储和管理的需求。