gitweixin
  • 首页
  • 小程序代码
    • 资讯读书
    • 工具类
    • O2O
    • 地图定位
    • 社交
    • 行业软件
    • 电商类
    • 互联网类
    • 企业类
    • UI控件
  • 大数据开发
    • Hadoop
    • Spark
    • Hbase
    • Elasticsearch
    • Kafka
    • Flink
    • 数据仓库
    • 数据挖掘
    • flume
    • Kafka
    • Hive
    • shardingsphere
    • solr
  • 开发博客
    • Android
    • php
    • python
    • 运维
    • 技术架构
    • 数据库
  • 程序员网赚
  • bug清单
  • 量化投资
  • 在线查询工具
    • 去行号
    • 在线时间戳转换工具
    • 免费图片批量修改尺寸在线工具
    • SVG转JPG在线工具

分类归档大数据开发

精品微信小程序开发门户,代码全部亲测可用

  • 首页   /  
  • 分类归档: "大数据开发"
  • ( 页面3 )
Java, 大数据开发 1月 22,2025

手撕代码刷题秘籍,小白到Offer收割机的进阶之路

​

 要准备面试,无非就是要准备熟背八股文,做有深度的项目,好好学习数据结构和算法,刷题准备手撕面试题。

其中手撕面试题的准备时间是比较长的。八股文和大厂手撕面试题可以看下面专栏,花了半个月时间从上千份大厂面经分类整理出面试题及手撕面试题。

嵌入式最全面试题-Offer直通车

大数据最全面试题-Offer直通车

Java开发及前端最全面试题-Offer直通车

Android最全面试题-Offer直通车

C++后端开发最全面试题-从入门到Offer

线上笔试

不少公司面试的第一关就是线上笔试题📃。咱得自己在家对着电脑做,就像考试一样,限定时间内完成题目。这种时候,环境相对熟悉,压力可能没那么大,但也得注意别因为在家就放松警惕,一定要严格按照考试要求来,提前调试好设备,保证网络稳定,别到时候因为这些小问题影响发挥。

现场手撕代码

等过了笔试,到了现场面试,这可就刺激了🤯。面试官会给你一台电脑,让你当场敲代码,有时候甚至直接给你一张纸,让你手写代码。这种情况对咱的心理素质和编程能力要求更高。在面试官眼皮子底下写代码,紧张是肯定的,但越这时候越得稳住,千万别慌了神。咱平时刷题练的就是这时候的底气💪。

入门指南:选对资料,开启刷题第一步

刚接触手撕代码刷题,选对入门资料太重要了📚,除了学校的数据结构和算法教科书,公认是推荐《剑指 Offer》。这本书对数据结构和算法的讲解特别详细,还有对应的 Java 代码示例,很适合新手。你可以先从基础的数据结构,像数组、链表这些开始看,把基础打牢。网上也有不少相关的在线教程,比如慕课网、网易云课堂上都有优质课程,跟着视频一步步学,理解起来更容易。

手撕面试题很多,下面这些是大厂高频的手撕面试题:

从上千份大厂面经呕心沥血整理:大厂高频手撕面试题(数据结构和算法篇 ,Java实现亲试可跑)

 从上千份大厂面经呕心沥血整理:大厂高频手撕面试题(数据结构和算法篇 ,C++实现亲试可跑)

循序渐进:从易到难,稳步提升

刷题就像爬山,得一步一个脚印👣。先从简单的题目入手,比如求数组的和、判断一个数是否为素数这类基础题。把这些简单题做熟了,不仅能建立自信,还能让咱熟悉编程的基本语法和逻辑。等简单题得心应手了,再慢慢增加难度,比如做一些涉及排序算法优化、查找算法应用的题目。面对难题别害怕,就像拆解乐高积木一样,把问题拆分成一个个小问题,逐个击破。每次成功解决一道难题,你会发现自己的编程能力又上了一个台阶。

实战演练:参加竞赛,提升实战能力

如果是在校生,参加算法竞赛对提升大数据刷题能力简直太有帮助了🎉。像 ACM 国际大学生程序设计竞赛、蓝桥杯这些,都是很不错的平台。在竞赛中,你会遇到来自各地的高手,和他们同场竞技,能让你见识到各种巧妙的解题思路和编程技巧。而且竞赛的时间压力很大,能锻炼你在紧张环境下快速思考和编写代码的能力。就像我认识一个学长,参加了几次 ACM 竞赛后,再去面试大数据岗位,那些手撕代码的题目对他来说轻松多了。

合理规划:把握刷题节奏和时间

刷题可不是一蹴而就的事儿,得合理安排时间和节奏🕙。每天刷几道题,这个得根据自己的情况来。要是你时间比较充裕,每天刷 3 – 5 道题也没问题;要是平时学业或者工作忙,每天保证 1 – 2 道题的练习量。别一开始就猛刷,把自己累到了,后面反而坚持不下去。一般来说,先把基础的算法和数据结构题目刷完,再去刷一些综合应用的题目。刷完一本书或者一个阶段的题目后,可以去力扣、牛客网这些平台上找一些大数据专项题目来巩固,刷个 80 – 150 道,基本就差不多了。

效果检验:判断刷题能力是否提升

怎么知道自己刷题有没有效果呢🧐?首先就是看刷题的数量,量变引起质变,刷的题多了,自然会有感觉。但光数量可不够,还得看质量。比如你能不能用多种方法解决同一道题,这说明你对知识点理解得很透彻。还有就是尝试挑战一些难度更高的题目,如果能顺利解决,那能力肯定提升了。另外,刷题平台一般都会给出代码的时间复杂度和空间复杂度分析,看看自己的代码效率有没有提高,这也是检验能力的重要标准。 ​

作者 east
Flink 1月 22,2025

Flink1.7官方文档中文翻译:及时流处理

简介#

及时流处理是有状态流处理的一种扩展,其中时间在计算中发挥一定作用。例如,在进行时间序列分析、基于特定时间段(通常称为窗口)进行聚合,或者在处理事件时事件发生的时间很关键等情况时,都会涉及到及时流处理。
在接下来的章节中,我们将重点介绍在使用 Flink 进行及时流处理应用开发时,需要考虑的一些主题。
返回顶部

时间概念:事件时间与处理时间#

在流处理程序中提及时间(例如定义窗口时),可以涉及不同的时间概念:

  • 处理时间:处理时间指的是执行相应操作的机器的系统时间。

当一个流处理程序基于处理时间运行时,所有基于时间的操作(如时间窗口)将使用运行相应操作符的机器的系统时钟。一个按小时划分的处理时间窗口将包含在系统时钟显示整点之间到达特定操作符的所有记录。例如,如果一个应用程序在上午 9:15 开始运行,第一个按小时划分的处理时间窗口将包含上午 9:15 到 10:00 之间处理的事件,下一个窗口将包含上午 10:00 到 11:00 之间处理的事件,依此类推。
处理时间是最简单的时间概念,无需在流和机器之间进行协调。它能提供最佳性能和最低延迟。然而,在分布式和异步环境中,处理时间不具备确定性,因为它易受记录进入系统的速度(例如从消息队列进入)、记录在系统内操作符之间流动的速度以及中断(计划内或其他情况)的影响。

  • 事件时间:事件时间是每个事件在其产生设备上发生的时间。这个时间通常在记录进入 Flink 之前就嵌入其中,并且可以从每条记录中提取出事件时间戳。在事件时间中,时间的推进取决于数据,而非任何物理时钟。基于事件时间的程序必须指定如何生成事件时间水印,这是一种在事件时间中标记时间推进的机制。这种水印机制将在后续章节中介绍。

在理想情况下,无论事件何时到达或其顺序如何,基于事件时间的处理都能产生完全一致且确定的结果。然而,除非已知事件按时间戳顺序到达,否则事件时间处理在等待乱序事件时会产生一定延迟。由于只能等待有限的时间,这就限制了基于事件时间的应用程序的确定性程度。
假设所有数据都已到达,即使处理乱序或迟到的事件,或者重新处理历史数据,基于事件时间的操作也会按预期执行,并产生正确且一致的结果。例如,一个按小时划分的事件时间窗口将包含所有携带的事件时间戳属于该小时的记录,无论它们到达的顺序如何,也无论它们何时被处理。(有关更多信息,请参阅 “延迟” 部分。)
请注意,有时基于事件时间的程序在实时处理实时数据时,会使用一些基于处理时间的操作,以确保它们能够及时推进。
事件时间与处理时间

Event Time and Processing Time


事件时间与水印#

注意:Flink 实现了数据流模型中的许多技术。若要深入了解事件时间和水印,可查看以下文章。

  • Tyler Akidau 的《Streaming 101》
  • 《数据流模型》论文

一个支持事件时间的流处理器需要一种方式来衡量事件时间的推进。例如,一个构建按小时划分窗口的窗口操作符,需要在事件时间超过一小时结束时得到通知,以便该操作符能够关闭正在处理的窗口。
事件时间可以独立于处理时间(由物理时钟测量)推进。例如,在一个程序中,某个操作符的当前事件时间可能略落后于处理时间(考虑到接收事件的延迟),但两者以相同速度推进。另一方面,另一个流处理程序可能通过快速处理已经缓冲在 Kafka 主题(或其他消息队列)中的一些历史数据,在仅几秒钟的处理时间内推进数周的事件时间。
Flink 中衡量事件时间推进的机制是水印。水印作为数据流的一部分流动,并携带一个时间戳 t。Watermark (t) 声明在该流中事件时间已到达时间 t,这意味着该流中不应再有时间戳 t’ <= t 的元素(即时间戳早于或等于水印的事件)。
下图展示了带有(逻辑)时间戳的事件流以及同步流动的水印。在这个例子中,事件是按(时间戳)顺序排列的,这意味着水印只是流中的周期性标记。
有序事件流和水印
水印对于乱序流至关重要,如下图所示,其中事件并非按时间戳排序。一般来说,水印表明在流中的那个点,所有到某个时间戳的事件都应该已经到达。一旦水印到达一个操作符,该操作符可以将其内部事件时间时钟推进到水印的值。
无序事件流和水印
请注意,新创建的流元素的事件时间继承自产生它们的事件,或者触发这些元素创建的水印。

并行流中的水印#

水印在源函数处或紧随源函数之后生成。源函数的每个并行子任务通常独立生成其水印。这些水印定义了该特定并行源的事件时间。
随着水印在流处理程序中流动,它们会推进水印到达的操作符处的事件时间。每当一个操作符推进其事件时间时,它会为下游的后续操作符生成一个新的水印。
有些操作符会消费多个输入流,例如 union 操作符,或者在 keyBy (…) 或 partition (…) 函数之后的操作符。这样的操作符的当前事件时间是其输入流事件时间的最小值。随着其输入流更新它们的事件时间,该操作符的事件时间也会更新。
下图展示了事件和水印在并行流中流动,以及操作符跟踪事件时间的示例。
并行数据流、操作符与事件和水印

延迟#

有可能某些元素会违反水印条件,即即使在 Watermark (t) 出现之后,仍会出现更多时间戳 t’ <= t 的元素。实际上,在许多实际场景中,某些元素可能会被任意延迟,使得无法指定一个时间,保证在该时间之前具有特定事件时间戳的所有元素都已到达。此外,即使延迟可以界定,将水印延迟太多通常也不可取,因为这会导致事件时间窗口的评估出现过多延迟。
因此,流处理程序可能会明确预期一些延迟元素。延迟元素是指在系统的事件时间时钟(由水印指示)已经超过延迟元素的时间戳之后才到达的元素。有关如何在事件时间窗口中处理延迟元素的更多信息,请参阅 “允许的延迟”。

窗口化#

对流中的事件进行聚合(例如计数、求和)与批处理中的方式不同。例如,不可能对流中的所有元素进行计数,因为流通常是无限的(无界的)。相反,对流的聚合(计数、求和等)是通过窗口来界定范围的,例如 “过去 5 分钟的计数” 或 “过去 100 个元素的求和”。
窗口可以由时间驱动(例如:每 30 秒)或由数据驱动(例如:每 100 个元素)。通常可以区分不同类型的窗口,例如滚动窗口(无重叠)、滑动窗口(有重叠)和会话窗口(由不活动间隙分隔)。
时间窗口和计数窗口
有关窗口的更多示例,请查看此博客文章,或者查看 DataStream API 的窗口文档。介绍一下Flink的时间概念如何在Flink中使用事件时间?Flink的窗口操作符有哪些?

作者 east
Flink 1月 22,2025

Flink1.7官方文档中文翻译:有状态流处理

什么是状态?#
虽然数据流中的许多操作通常一次仅处理单个事件(例如事件解析器),但有些操作会在多个事件间记住相关信息(例如窗口操作符)。这些操作被称为有状态操作。
有状态操作的一些示例:

  • 当应用程序搜索特定的事件模式时,状态会存储到目前为止遇到的事件序列。
  • 按分钟 / 小时 / 天聚合事件时,状态保存待处理的聚合结果。
  • 在一系列数据点上训练机器学习模型时,状态保存模型参数的当前版本。
  • 当需要管理历史数据时,状态允许高效访问过去发生的事件。

Flink 需要了解状态,以便使用检查点和保存点实现容错。
了解状态还有助于对 Flink 应用程序进行重新缩放,这意味着 Flink 会负责在并行实例间重新分配状态。
可查询状态允许你在运行时从 Flink 外部访问状态。
在处理状态时,了解 Flink 的状态后端可能也会有所帮助。Flink 提供了不同的状态后端,用于指定状态的存储方式和存储位置。

键控状态 #
键控状态维护在一个可视为嵌入式键值存储的结构中。状态与有状态操作符读取的流严格分区并一起分布。因此,仅在键控流上才能访问键值状态,即在进行键控 / 分区数据交换之后,并且只能访问与当前事件的键相关联的值。将流的键与状态的键对齐,可确保所有状态更新都是本地操作,无需事务开销即可保证一致性。这种对齐还使 Flink 能够透明地重新分配状态并调整流分区。

状态与分区

键控状态进一步组织为所谓的键组。键组是 Flink 重新分配键控状态的基本单元;键组的数量与定义的最大并行度完全相同。在执行过程中,键控操作符的每个并行实例处理一个或多个键组的键。

State and Partitioning

状态持久性#

Flink 通过流重放和检查点相结合的方式实现容错。一个检查点标记每个输入流中的特定点,以及每个操作符的相应状态。通过恢复操作符的状态并从检查点处重新播放记录,流数据流可以从检查点恢复,同时保持一致性(精确一次处理语义)。
检查点间隔是在执行期间容错开销与恢复时间(需要重新播放的记录数)之间进行权衡的一种方式。
容错机制持续对分布式流数据流进行快照。对于状态较小的流应用程序,这些快照非常轻量级,可以频繁进行,而对性能影响不大。流应用程序的状态存储在可配置的位置,通常是分布式文件系统中。
如果程序发生故障(由于机器、网络或软件故障),Flink 会停止分布式流数据流。然后系统重新启动操作符,并将它们重置到最近一次成功的检查点。输入流被重置到状态快照的位置。作为重新启动的并行数据流一部分处理的任何记录,都保证不会影响先前检查点的状态。
默认情况下,检查点功能是禁用的。有关如何启用和配置检查点的详细信息,请参阅 “检查点”。
为使此机制充分发挥其保证作用,数据流源(如消息队列或代理)需要能够将流倒回到最近定义的点。Apache Kafka 具备此能力,Flink 与 Kafka 的连接器利用了这一点。有关 Flink 连接器提供的保证的更多信息,请参阅 “数据源和接收器的容错保证”。
由于 Flink 的检查点是通过分布式快照实现的,我们可互换使用 “快照” 和 “检查点” 这两个词。通常我们也用 “快照” 一词来指代检查点或保存点。

检查点#

Flink 容错机制的核心部分是对分布式数据流和操作符状态进行一致性快照。这些快照作为一致性检查点,系统在发生故障时可以回退到这些检查点。Flink 进行这些快照的机制在《分布式数据流的轻量级异步快照》中有描述。它受标准的 Chandy – Lamport 分布式快照算法启发,并专门针对 Flink 的执行模型进行了定制。
请记住,与检查点相关的所有操作都可以异步完成。检查点屏障不会同步移动,操作可以异步对其状态进行快照。
自 Flink 1.11 起,检查点可以在有对齐或无对齐的情况下进行。在本节中,我们先描述对齐检查点。

屏障#

Flink 分布式快照中的一个核心元素是流屏障。这些屏障被注入到数据流中,并作为数据流的一部分与记录一起流动。屏障永远不会超过记录,它们严格按顺序流动。一个屏障将数据流中的记录分为进入当前快照的记录集和进入下一个快照的记录集。每个屏障携带它前面推送的快照的 ID。屏障不会中断流的流动,因此非常轻量级。来自不同快照的多个屏障可以同时存在于流中,这意味着各种快照可以并发发生。
数据流中的检查点屏障:流屏障在流源处被注入到并行数据流中。注入快照 n 的屏障的点(我们称之为 Sn)是源流中快照覆盖数据的位置。例如,在 Apache Kafka 中,这个位置将是分区中最后一条记录的偏移量。这个位置 Sn 会报告给检查点协调器(Flink 的 JobManager)。

Checkpoint barriers in data streams


然后屏障向下游流动。当一个中间操作符从其所有输入流接收到快照 n 的屏障时,它会向其所有输出流发送一个快照 n 的屏障。一旦一个接收器操作符(流 DAG 的末端)从其所有输入流接收到屏障 n,它就会向检查点协调器确认快照 n。在所有接收器都确认一个快照后,该快照被视为完成。

Aligning data streams at operators with multiple inputs


一旦快照 n 完成,作业将不再要求源提供 Sn 之前的记录,因为此时这些记录(及其衍生记录)将已经通过整个数据流拓扑。
在具有多个输入的操作符处对齐数据流:接收多个输入流的操作符需要在快照屏障上对齐输入流。上图说明了这一点:

  • 一旦操作符从传入流接收到快照屏障 n,在它也从其他输入接收到屏障 n 之前,它不能处理来自该流的任何更多记录。否则,它会将属于快照 n 的记录与属于快照 n + 1 的记录混合。
  • 一旦最后一个流接收到屏障 n,操作符会发出所有挂起的输出记录,然后自己发出快照 n 屏障。
  • 它对状态进行快照,并从所有输入流恢复处理记录,在处理来自流的记录之前先处理输入缓冲区中的记录。
  • 最后,操作符将状态异步写入状态后端。

请注意,所有具有多个输入的操作符以及在洗牌后消耗多个上游子任务输出流的操作符都需要进行对齐。

操作符状态快照#

当操作符包含任何形式的状态时,此状态也必须是快照的一部分。
操作符在从其输入流接收到所有快照屏障的时间点,并且在向其输出流发送屏障之前,对其状态进行快照。在该时间点,已经对屏障之前的记录进行了所有状态更新,并且尚未应用依赖于屏障之后记录的更新。由于快照的状态可能很大,它存储在可配置的状态后端中。默认情况下,这是 JobManager 的内存,但对于生产使用,应配置分布式可靠存储(如 HDFS)。在状态存储之后,操作符确认检查点,向输出流发送快照屏障,然后继续执行。
生成的快照现在包含:

  • 对于每个并行流数据源,启动快照时流中的偏移量 / 位置。
  • 对于每个操作符,指向作为快照一部分存储的状态的指针。

检查点机制图示

Illustration of the Checkpointing Mechanism

恢复#

在此机制下的恢复很简单:发生故障时,Flink 选择最新完成的检查点 k。然后系统重新部署整个分布式数据流,并为每个操作符提供作为检查点 k 一部分进行快照的状态。源被设置为从位置 Sk 开始读取流。例如在 Apache Kafka 中,这意味着告诉消费者从偏移量 Sk 开始获取数据。
如果状态是增量快照的,操作符从最新的完整快照状态开始,然后对该状态应用一系列增量快照更新。
有关更多信息,请参阅 “重启策略”。

非对齐检查点#

检查点也可以以非对齐方式执行。基本思想是,只要飞行中的数据成为操作符状态的一部分,检查点就可以超过所有飞行中的数据。
请注意,这种方法实际上更接近 Chandy – Lamport 算法,但 Flink 仍然在源中插入屏障,以避免使检查点协调器过载。
非对齐检查点:该图展示了一个操作符如何处理非对齐检查点屏障:

  • 操作符对存储在其输入缓冲区中的第一个屏障做出反应。
  • 它立即通过将屏障添加到输出缓冲区的末尾,将其转发到下游操作符。
  • 操作符标记所有被超过的记录以异步存储,并创建自己状态的快照。
  • 因此,操作符仅短暂停止输入处理以标记缓冲区、转发屏障并创建其他状态的快照。

非对齐检查点确保屏障尽快到达接收器。它特别适用于至少有一个缓慢移动数据路径的应用程序,在这种情况下对齐时间可能长达数小时。但是,由于它会增加额外的 I/O 压力,当到状态后端的 I/O 成为瓶颈时,它并无帮助。有关其他限制,请参阅操作中的更深入讨论。
请注意,保存点始终是对齐的。

非对齐恢复#

在非对齐检查点中,操作符在开始处理来自上游操作符的任何数据之前,首先恢复飞行中的数据。除此之外,它执行与对齐检查点恢复期间相同的步骤。

状态后端#

键 / 值索引存储的确切数据结构取决于所选的状态后端。一种状态后端将数据存储在内存哈希表中,另一种状态后端使用 RocksDB 作为键值存储。除了定义保存状态的数据结构之外,状态后端还实现了对键值状态进行时间点快照并将该快照作为检查点一部分存储的逻辑。可以在不更改应用程序逻辑的情况下配置状态后端。
检查点和快照

checkpoints and snapshots

保存点#

所有使用检查点的程序都可以从保存点恢复执行。保存点允许在不丢失任何状态的情况下更新程序和 Flink 集群。
保存点是手动触发的检查点,它对程序进行快照并将其写入状态后端。它们依赖于常规的检查点机制来实现这一点。
保存点与检查点类似,不同之处在于它们由用户触发,并且在新的检查点完成时不会自动过期。为了正确使用保存点,了解检查点与保存点之间的区别非常重要,“检查点与保存点” 中对此进行了描述。

精确一次与至少一次#

对齐步骤可能会给流程序增加延迟。通常,这种额外延迟在几毫秒量级,但我们也看到过一些异常值的延迟明显增加的情况。对于要求所有记录始终具有超低延迟(几毫秒)的应用程序,Flink 提供了一个开关,可在检查点期间跳过流对齐。一旦操作符从每个输入看到检查点屏障,仍会立即进行检查点快照。
当跳过对齐时,即使在检查点 n 的一些检查点屏障到达后,操作符仍会继续处理所有输入。这样,在为检查点 n 拍摄状态快照之前,操作符也会处理属于检查点 n + 1 的元素。在恢复时,这些记录将作为重复项出现,因为它们既包含在检查点 n 的状态快照中,又将作为检查点 n 之后的数据的一部分被重新播放。
仅对于具有多个前驱(连接)的操作符以及具有多个发送者(在流重新分区 / 洗牌之后)的操作符才会发生对齐。因此,仅包含易于并行的流操作(map ()、flatMap ()、filter () 等)的数据流实际上即使在至少一次模式下也能提供精确一次的保证。

批处理程序中的状态与容错#

Flink 将批处理程序作为流程序的一种特殊情况执行,其中流是有界的(元素数量有限)。DataSet 在内部被视为数据流。因此,上述概念同样适用于批处理程序,与适用于流程序的方式相同,但有一些小的例外:

  • 批处理程序的容错不使用检查点。恢复通过完全重放流来实现。这是可行的,因为输入是有界的。这将成本更多地推向恢复阶段,但使常规处理更便宜,因为它避免了检查点。
  • DataSet API 中的有状态操作使用简化的内存 / 外存数据结构,而不是键 / 值索引。
  • DataSet API 引入了特殊的同步(基于超步)迭代,这仅在有界流上才可行。有关详细信息,请查看迭代文档。
作者 east
Flink 1月 22,2025

Flink1.7文档 时间表函数

时间表函数提供了在特定时间点访问时间表版本的功能。为了访问时间表中的数据,必须传递一个时间属性,该属性确定返回的表的版本。Flink 使用表函数的 SQL 语法来提供这种访问方式。

与版本化表不同,时间表函数只能在追加-only 流上定义——它不支持变更日志输入。此外,时间表函数不能通过纯 SQL DDL 来定义。

定义时间表函数

时间表函数可以使用 Table API 在追加-only 流上定义。表会注册一个或多个键列,以及用于版本控制的时间属性。

假设我们有一个追加-only 的货币汇率表,我们希望将其注册为时间表函数。

SELECT * FROM currency_rates; 
update_timecurrencyrate
09:00:00Yen102
09:00:00Euro114
09:00:00USD1
11:15:00Euro119
11:49:00Pounds108

使用 Table API,我们可以使用 currency 作为键,并将 update_time 作为版本时间属性来注册该流。

Java 示例:

TemporalTableFunction rates = tEnv
    .from("currency_rates")
    .createTemporalTableFunction("update_time", "currency");
 
tEnv.createTemporarySystemFunction("rates", rates);      

时间表函数连接

定义时间表函数后,它可以作为标准表函数使用。追加-only 表(左输入/探测方)可以与时间表(右输入/构建方)连接,即一个随着时间变化并跟踪其变化的表,用于在特定时间点获取某个键的值。

考虑一个追加-only 表 orders,它跟踪客户的订单并使用不同的货币。

SELECT * FROM orders; 
order_timeamountcurrency
10:152Euro
10:301USD
10:3250Yen
10:523Euro
11:045USD

给定这些表,我们希望将订单转换为一种统一的货币——美元(USD)。

SQL 查询:

SELECT
  SUM(amount * rate) AS amount
FROM
  orders,
  LATERAL TABLE (rates(order_time))
WHERE
  rates.currency = orders.currency
作者 east
运维 1月 17,2025

selenium自动化测试,谷歌驱动器chromedriver最新版本下载(亲试有效)

在用selenium做自动化测试,用的电脑后台自动更新chrome,导致chromedriver版本跟 chrome 版本不一致。

还好官方有更新最新版,可以通过下面的地址进行下载,如果没有chrome也可以在下面一起下载。

https://googlechromelabs.github.io/chrome-for-testing/

作者 east
doris 1月 14,2025

解决Navicat查看导入运行任务ROUTINE:1105 – errCode = 2, detailMessage = Please check your sql, we meet an error when parsing.

第一次 通过 Doris Routine Load 导入方式持续消费 Kafka Topic 中的数据。 按官方文档
Routine Load – Apache Doris

在navicat按照官方示例查看导入任务:

mysql> SHOW ROUTINE LOAD FOR testdb.example_routine_load\G

发现报错:

1105 – errCode = 2, detailMessage = Please check your sql, we meet an error when parsing.

刚开始很郁闷,以为doris官方团队开发的功能很敷衍,没具体提示具体是什么错误。

反复试验之后,才发现是\G 导致报错,修改为下面这样就正常了

mysql> SHOW ROUTINE LOAD FOR testdb.example_routine_load
作者 east
Flink 1月 8,2025

解决flink Caused by: java.lang.NoClassDefFoundError: org/apache/flink/table/delegation/ExtendedOperationExecutor

运行flink代码报错:

运行报错:Exception in thread "main" org.apache.flink.table.api.TableException: Unexpected error when trying to load service provider.
	at org.apache.flink.table.factories.FactoryUtil.discoverFactories(FactoryUtil.java:826)
	at org.apache.flink.table.factories.FactoryUtil.discoverFactory(FactoryUtil.java:525)
	at org.apache.flink.table.api.internal.TableEnvironmentImpl.create(TableEnvironmentImpl.java:295)
	at org.apache.flink.table.api.internal.TableEnvironmentImpl.create(TableEnvironmentImpl.java:266)
	at org.apache.flink.table.api.TableEnvironment.create(TableEnvironment.java:95)
	at com.xxx.a_jobs.FlinkBatchHiveJob$.main(FlinkBatchHiveJob.scala:35)
	at com.xxx.a_jobs.FlinkBatchHiveJob.main(FlinkBatchHiveJob.scala)
Caused by: java.util.ServiceConfigurationError: org.apache.flink.table.factories.Factory: Provider org.apache.flink.table.planner.delegation.DefaultDialectFactory could not be instantiated
	at java.util.ServiceLoader.fail(ServiceLoader.java:232)
	at java.util.ServiceLoader.access$100(ServiceLoader.java:185)
	at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:384)
	at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:404)
	at java.util.ServiceLoader$1.next(ServiceLoader.java:480)
	at org.apache.flink.table.factories.FactoryUtil.discoverFactories(FactoryUtil.java:817)
	... 6 more
Caused by: java.lang.NoClassDefFoundError: org/apache/flink/table/delegation/ExtendedOperationExecutor
	at java.lang.Class.getDeclaredConstructors0(Native Method)
	at java.lang.Class.privateGetDeclaredConstructors(Class.java:2671)
	at java.lang.Class.getConstructor0(Class.java:3075)
	at java.lang.Class.newInstance(Class.java:412)
	at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:380)
	... 9 more
Caused by: java.lang.ClassNotFoundException: org.apache.flink.table.delegation.ExtendedOperationExecutor

报错的核心问题是在加载 Flink 的服务提供程序时出现了异常。具体的错误信息是 java.lang.NoClassDefFoundError: org/apache/flink/table/delegation/ExtendedOperationExecutor 和 java.lang.ClassNotFoundException: org.apache.flink.table.delegation.ExtendedOperationExecutor。这通常是由于类缺失或者缺少相应的依赖库导致的。

解析错误信息

  1. 错误描述:Copy CodeCaused by: java.lang.NoClassDefFoundError: org/apache/flink/table/delegation/ExtendedOperationExecutor 这是因为 org.apache.flink.table.delegation.ExtendedOperationExecutor 类未找到。Flink 在尝试加载这个类时,发现它不存在。这通常意味着某个必需的类库没有被正确包含在项目的依赖中。
  2. 原因分析:
    • Flink 依赖的类库中缺少了某些必需的 JAR 文件,或者你的项目中缺少某些必要的依赖。
    • 可能是因为缺少了 Hive 相关的依赖,或者使用的 Flink 版本与 Hive 连接的依赖不兼容。
    • 另外,org.apache.flink.table.planner.delegation.DefaultDialectFactory 类在创建时也无法实例化,这表明整个 Flink SQL 引擎的配置或者依赖加载出现了问题。

解决方案

1. 检查依赖:

确保你的项目中包含了 Flink 和 Hive 的相关依赖,特别是你使用的 Flink 版本与 Hive 相关的 JAR 文件。

对于 Flink 1.17.1 和 Hive,你应该确保以下依赖被正确添加到项目中:

  • Flink和hive 依赖:
<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-table-planner_2.11</artifactId>
    <version>1.17.1</version>
</dependency>
<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-table-api-java-bridge</artifactId>
    <version>1.17.1</version>
</dependency>
<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-hive_2.11</artifactId>
    <version>1.17.1</version>
</dependency>

2. 检查兼容性:

确保你所使用的 Flink 版本与 Hive 连接器的版本兼容。在 Flink 1.17.x 中,某些老旧的 Hive 连接器可能会出现兼容性问题。你可以查阅 Flink 官方文档 查看兼容的版本。

作者 east
Flink 1月 6,2025

解决flink toAppendStream doesn’t support consuming update changes which is produced by node GroupAggregate

下面的flink代码:

String sqlQuery = “SELECT MAX(val) AS max_val, MIN(val) AS min_val FROM dataT GROUP BY pid”;

Table resultTable = tableEnv.sqlQuery(sqlQuery);

DataStream resultStream = tableEnv.toAppendStream(resultTable, Row.class);

运行报错:

org.apache.flink.table.api.TableException: toAppendStream doesn’t support consuming update changes which is produced by node GroupAggregate(groupBy=[pid], select=[pid, MAX(val) AS max_val, MIN(val) AS min_val])

原因分析

报错信息提示 toAppendStream doesn't support consuming update changes which is produced by node GroupAggregate,这意味着在当前代码中使用 toAppendStream 方法去转换结果表为 DataStream 时出现了不兼容的情况。
在 Flink 中,当执行包含聚合操作(比如这里的 GROUP BY 以及 MAX、MIN 聚合函数计算)的 SQL 查询时,查询结果可能会产生更新(update)类型的变更,而 toAppendStream 方法只适用于那种仅追加(append-only)类型的结果,也就是结果表中数据只会新增而不会有更新、删除等变更的情况。这里的聚合操作导致了结果存在更新变化,所以调用 toAppendStream 就抛出了异常,它无法处理这种带有更新的数据变更情况。

正确代码修改思路及示例

要解决这个问题,可以使用 toRetractStream 方法来替代 toAppendStream 方法,toRetractStream 方法可以处理包含更新、删除等多种变更类型的数据,它返回的 DataStream 中元素是包含了一个布尔值标志(表示是新增还是撤回操作)以及实际的数据行(对应查询结果行)的二元组形式。
以下是修改后的代码示例:



        // 2. 添加 Source
        DataStream<RunData> dataSource = env.addSource(new TDengineSourceFunction(jdbcUrl, user, password, query));

        // 3. 注册临时表
        tableEnv.createTemporaryView("rundata", dataSource, "pid, val"); // 根据实际字段调整

        // 4. 执行 SQL 查询以计算最大值和最小值
        String sqlQuery = "SELECT MAX(val) AS max_val, MIN(val) AS min_val FROM dataT GROUP BY pid";
        Table resultTable = tableEnv.sqlQuery(sqlQuery);

        // 5. 将结果转换为 DataStream 并打印,这里使用 toRetractStream 替代 toAppendStream
        DataStream<Tuple2<Boolean, Row>> resultStream = tableEnv.toRetractStream(resultTable, Row.class);
        resultStream.print();

        // 6. 触发执行
        env.execute("Flink SQL Max and Min Calculation");
    }
}
作者 east
Java, 面试 1月 5,2025

《Java开发及前端最全面试题-Offer直通车》目录

​

 Java开发是需求最广,工资高的细分领域,同时也是会的人最多,有的公司招1个Java开发,要面试几十甚至上百面试者,同时要求很高,要求通晓技术栈很多及很深深度。

如果你正准备面试,想要脱颖而出,那么《Java开发及前端最全面试题-Offer直通车》是你的不二选择。

本书汇集了多篇超过1万字的精华内容,无论是Java基础、数据库、SpringBoot和SpringCloud等必问的,还是前端、k8s等容器和虚拟化和大数据各类技术面试,本书都为你提供了最全面的试题和参考答案。

无论你是Java开发的新手还是有一定经验的老手,本书都能为你提供宝贵的参考和指导。无论你是准备面试还是想要提升自己的技能,本书都能帮助你更好地应对挑战。

现在就加入我们,开启你的大数据面试之旅吧!让《Java开发及前端最全面试题-Offer直通车》成为你的得力助手,助你顺利通过面试,迈向大数据领域的成功之路!

本书共分为以下几个部分:

一、Java语言篇

在Java领域,掌握扎实的Java基础和虚拟机知识是必不可少的。本专栏将为您提供Java虚拟机最全面试题及参考答案,助您轻松应对各种面试挑战。同时,我们还将为您呈现通往大厂Java面试题及参考答案2万字长文,让您在激烈的求职竞争中脱颖而出。

二、数据库及SQL篇

数据库作为软件开发的核心组件,其重要性不言而喻。本专栏将为您带来MySQL、SQL Server、Oracle、PostgreSQL等主流数据库的面试题及参考答案,让您在数据库领域的面试中游刃有余。此外,我们还将提供最全手写SQL面试题及代码实现,让您在SQL技能上更上一层楼。

三、框架篇

在Java开发中,SpringBoot和SpringCloud等框架的使用已成为标配。本专栏将为您带来互联网大厂Spring Cloud面试题及参考答案、Nacos高频面试题及参考答案、Seata面试宝典等一系列精彩内容,助您在框架领域的面试中轻松过关。

四、综合素质篇

除了专业技能外,综合素质也是面试官关注的重点。本专栏将为您提供程序员入职新公司如何快速上手项目的实用建议,让您在试用期也能表现出色。

五、NoSQL篇

随着大数据时代的到来,NoSQL数据库在数据处理中的应用越来越广泛。本专栏将为您带来Elasticsearch、Redis、Pulsar等NoSQL数据库的高频面试题及参考答案,助您在NoSQL领域大展拳脚。

六、容器和虚拟化篇

容器化和虚拟化技术已经成为现代软件开发的重要组成部分。本专栏将为您带来k8s(Kubernetes)、Docker等容器和虚拟化技术的最新面试题及参考答案,让您在这一领域更具竞争力。

七、消息队列篇

消息队列作为异步处理的关键组件,在大型系统中发挥着重要作用。本专栏将为您提供RocketMQ等消息队列的最全面试题详解,助您在消息队列领域的面试中取得成功。

八、前端篇

在前端领域,Angular、React、Vue等框架的使用日益普及。本专栏将为您带来这些框架的必问面试题及参考答案,让您在前端领域的面试中更加自信。

九、其他语言网页开发篇

除了Java外,Python、Django等其他语言和框架也在网页开发中占据一席之地。本专栏将为您带来这些语言和框架的面试题及参考答案,让您在多元化的网页开发领域更具竞争力。

十、大数据篇

在大数据时代背景下,掌握Kafka、Zookeeper等大数据处理技术已成为必备技能。本专栏将为您带来这些技术的面试题及参考答案,助您在大数据领域的面试中脱颖而出。

经验或案例干货篇

软件产品国际化:前后端及App多语言版本解决方案(超详细实现过程)

综合技术面试篇

大厂计算机网络高频八股文面试题及参考答案(面试必问,持续更新)

后端高频考点:网站限流机制与算法详解

Java语言篇

Java虚拟机最全面试题及参考答案

通往大厂Java面试题及参考答案2万字长文

Java多线程和并发编程面试题和参考答案100多道(持续更新)

Java中的Lock、synchronize、CAS关系及其应用场景

 进阶面试题:Java反射机制最全面试题及参考答案

 大厂校招必懂:Java反射机制原理详解(2万字长文)

Java架构师必知的 JVM 调优知识

NIO和Netty保姆级5万字面试题及参考答案

Java设计模式面试题及参考答案

 Java RMI最全面试题及参考答案

 Java中的Lock、synchronize、CAS关系及其应用场景

SpringBoot和SpringCloud

互联网大厂Spring Cloud面试题及参考答案(持续更新)

Nacos高频面试题及参考答案(2万字长文)

Seata面试宝典(2万字长文)

Spring Security高频面试题及参考答案(3万字长文)

Spring Boot过百道保姆级面试题及参考答案(持续更新)

Spring MVC八股文面试题及参考答案(4万字长文)

 精通Spring Cloud: Spring Cloud Config面试题详解及参考答案(3万字长文)

 Eureka从入门到精通面试题及答案参考

Dubbo面试题甄选及参考答案

Spring框架原理面试题及参考答案

数据库及SQL篇

数据库篇

2万字长文:MySQL面试题及参考答案(持续更新)

3万字长文:SQL Server面试题和参考答案(持续更新)

DBA必备知识:Oracle面试题及参考答案(3万字长文)

大厂PostgreSQL面试题100道及参考答案(5万字长文)

MyCat面试题及参考答案(3万字长文)

关系数据库/SQL篇

最全手写SQL面试题及代码实现(万字长文持续更新)

DBA必懂选型:MySQL、PostgreSQL与Oracle对比研究

 后台开发必问题:分库分表面试题及参考答案(3万字长文)

 一文看懂ProxySQL面试题(3万字长文)

ShardingSphere面试题及参考答案(3万字长文)

Mysql海量数据经常有下面这些操作,离被开除就不远了(持续更新)

Oracle Sql查询和性能优化(持续更新)

看完不怕面试官拷打了:mysql sql优化最全总结(万字长文持续更新)

MySQL存储过程原理、实现及优化

DBA必懂选型:MySQL、PostgreSQL与Oracle对比研究

ORM框架

MyBatis-Plus 2万字面试题详解

Hibernate最新6万字面试题及参考答案

Struts2 3万字经典面试题及参考答案

JPA 3万字面试宝典

万字长文看懂MyBatis一二级缓存机制原理、使用和优化

万字长文看懂MyBatis一二级缓存机制原理、使用和优化

框架篇

RxJava最全面试题及参考答案

综合素质篇

做好这些不用担心试用期不通过:程序员入职新公司如何快速上手项目

装上大模型翅膀,程序员入职新公司如何快速上手代码(老员工如何选择大模型编程如虎添翼)

简历面试篇 

技术简历优化秘籍:迈向求职成功第一步

 外企面企必备:IT技术面试英文高频面试题

一文让你不怕Java开发英文自我介绍:英文面试保姆级教程

 如何把自己卖个好价钱:实战面试谈薪水

Nosql篇

Elasticsearch 面试题及参考答案:深入解析与实战应用

大厂Redis高频面试题及参考答案(持续更新)

Pulsar高频面试题及参考答案(持续更新)

通往大厂之路:Solr面试题及参考答案100道题

一文搞懂MongoDB面试题(2万字长文)

Cassandra面试题及答案详解(3万字长文)

时序数据库InfluxDB面试题和参考答案

Lucene最新最全面试题及参考答案

Redis 性能优化策略与实战保姆级教程

Redis如何实现高性能和高可用

万字长文详解缓存穿透、击穿、雪崩现象的原因和解决方案

Lucene最新最全面试题及参考答案

公司篇

字节跳动后端或大数据基础知识面试题及参考答案(2万字长文)

 阿里2024年Java开发最新最全面试题及参考答案(11万长文

 呕血整理4万字长文:百度Java后台开发面试题及参考答案

进BAT必懂:大厂高频八股文面试题及参考答案(6万字长文)

 阿里Java开发社会招聘面试题及参考答案

虾皮Java后台开发校园招聘面试题及参考答案

大厂面试:2024年虾皮Java开发面试题及参考答案(5万字长文)

 希音(Shein)Java后台开发面试题集锦和参考答案

大厂校招:希音(Shein)校园招聘面试题及参考答案

 大厂校招:唯品会Java面试题及参考答案

 4399 Java开发最全面试题及参考答案

 阿里Java开发校园招聘面试题及参考答案

 搜狐畅游Java后台开发面试题大全及参考答案

 搜狐2024年最新Java开发面试题及参考答案

斗鱼Java后端开发面试题及参考答案

金山云Java 开发面试题及参考答案

蔚来Java面试题及参考答案

小马智行Java开发面试题及参考答案

宁德时代Java面试题及参考答案

​​​​​​​

行业篇 

一文吃透物联网(IoT)的面试题及参考答案

物联网(IoT)及物联网网络协议面试题及参考答案(2万字长文)

大厂物联网(IoT)高频面试题及参考答案

容器和虚拟化

k8s(Kubernetes)最新100道面试题及参考答案(5万字长文)

最新5万字长文:Docker 100道面试题及参考答案

分布式篇

分布式架构最新最全面试题及参考答案

数据结构篇

数据结构高频问题:数组与链表的特点、细节及其原理详解

消息队列

最全RocketMQ面试题详解

 ZeroMQ最全面试题解读(3万字长文)

WebSocket面试常见知识点和面试题

3万字长文看透ActiveMQ面试题及参考答案

RabbitMQ 2万字面试题及参考答案

消息队列原理面试题及参考答案

消息代理工具Apollo面试宝典及参考答案

网络及协议篇

网络丢包问题分析和解决最全解析

开发和测试要懂知识:如何进行网络抓包最全宝典

前端篇

Angular必问面试题及参考答案

React常见面试题及参考答案(3万字长文)

JQuery从入门到精通2万字面试题

前端HTML5从入门到精通面试题及参考答案(2万字长文)

Ajax面试题精选及参考答案(3万字长文)

4万字长文让人看懂ElementUI面试题及参考答案

Vue面试题精选大全及参考答案(5万字长文)

前端面试高频知识点:Angular知识点精华汇总

前端Express.js面试题甄选及参考答案

前端UniApp面试题及参考答案(100道题)

Bootstrap最新最全面试题及参考答案

Linux/Shell篇

Linux Shell面试题大全及参考答案(3万字长文)

其它语言网页开发

3万字长文看懂Django面试

CGI面试题及参考答案

大数据篇

Kafka 面试题及参考答案(持续更新)

深入解析Zookeeper面试题及参考答案(超过万字精华篇)

2万字长文:ELK高频面试题及参考答案

ETL利器:Kettle 2万字长文详解面试题

自动化及调度篇

 DevOps在提升软件质量方面的作用

SVN 80道面试题及参考答案(2万字长文)

SonarQube面试题一卷到底60问及参考答案(3万字长文)

 通晓Git操作-git面试题及参考答案

 Jenkins从入门到精通面试题及参考答案(3万字长文)

分布式任务调度XXL – JOB面试题及参考答案

监控篇 

Nagios高频面试题及参考答案(2万字长文)

 Ganglia面试大全及参考答案(2万字长文)

Prometheus面试题精选及参考答案(2万字长文)

测试篇

Java单元测试面试题及参考答案

安全加密篇

 7万字详解Apache Shiro面试题、示例、参考答案

密码学与信息安全面试题及参考答案(2万字长文)

服务器和运维

JBoss面试题精要和参考答案(3万字长文)

 WebLogic面试题精要和参考答案(2万字长文)

WebSphere面试题精选和参考答案(3万字长文)

2.5万字长文吃透Tomcat面试题及参考答案

Nginx面试题精选及参考答案(3万字长文) ​

作者 east
Flink, tdengine 1月 3,2025

Flink读取TDEngine数据实例,解决com.taosdata.jdbc.rs.RestfulDatabaseMetaData@38af9828 is not serializable. The object probably contains or references non serializable fields错误

用flink读取TDEngine,运行报错:
com.taosdata.jdbc.rs.RestfulDatabaseMetaData@38af9828 is not serializable. The object probably contains or references non serializable fields

这意味着 com.taosdata.jdbc.rs.RestfulDatabaseMetaData 类的对象无法被序列化,而 Flink 的作业中涉及到的某些操作需要将对象传递到不同的任务中,这就要求对象是可序列化的(即实现了 Serializable 接口)。在 Flink 中,所有要在分布式环境中传输或持久化的对象都必须是可序列化的。

  • RestfulDatabaseMetaData 是 TDengine JDBC 驱动中的一个类,它可能没有实现 Serializable 接口,因此在需要将该类对象传输到其他机器时,Flink 无法进行序列化。

解决方法是

使用 transient 关键字避免对不可序列化对象进行传递。

通过标记 connection、preparedStatement 和 resultSet 为 transient,这些对象不会被 Flink 传递到 Task Manager。

完整可执行代码如下:


import org.apache.flink.streaming.api.functions.source.RichParallelSourceFunction;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class TDengineSourceFunction extends RichParallelSourceFunction<RunData> {

    private transient Connection connection;        // 使用 transient 避免序列化
    private transient PreparedStatement preparedStatement;
    private transient ResultSet resultSet;
    private String query;
    private volatile boolean isRunning = true;

    private String jdbcUrl;
    private String user;

    private String password;


    public TDengineSourceFunction(String jdbcUrl, String user, String password, String query) {
        this.query = query;
        this.jdbcUrl = jdbcUrl;
        this.user = user;
        this.password = password;

        // JDBC连接参数在open()方法中初始化
    }

    @Override
    public void open(org.apache.flink.configuration.Configuration parameters) throws Exception {
        super.open(parameters);
        Class.forName("com.taosdata.jdbc.rs.RestfulDriver");
        // 在这里初始化数据库连接
        this.connection = DriverManager.getConnection(jdbcUrl, user, password);
        // 准备SQL查询语句
        this.preparedStatement = connection.prepareStatement(query);
        this.resultSet = preparedStatement.executeQuery();
    }

    @Override
    public void run(SourceContext<RunData> sourceContext) throws Exception {
        while (isRunning && resultSet.next()) {
            // 从ResultSet中提取数据并转换为RunData对象
            RunData data = convertResultSetToData(resultSet);
            // 将数据发送到Flink的处理流中
            if (data != null) {
                sourceContext.collect(data);
            }
        }
    }

    @Override
    public void cancel() {
        isRunning = false;
        // 关闭资源
        try {
            if (resultSet != null) resultSet.close();
            if (preparedStatement != null) preparedStatement.close();
            if (connection != null) connection.close();
        } catch (SQLException e) {
            // 处理关闭资源时的异常
            e.printStackTrace();
        }
    }

    private RunData convertResultSetToData(ResultSet resultSet) throws SQLException {
        // 提取单行数据
      
        // 将数据转换为 RunData 对象


      //  return new RunData(......);
        return null;
    }
}
作者 east
Flink 1月 3,2025

解决flink读取TDEngine的数据Could not initialize class com.taosdata.jdbc.TSDBJNIConnector

需要用flink读取TDEngine的数据,用jdbc方式连接,运行报错:Could not initialize class com.taosdata.jdbc.TSDBJNIConnector

JDBC-JNI的方式需要 TDengine-client(使用JDBC-JNI时必须,使用JDBC-RESTful时非必须),所以采用JDBC-RESTful 的方式,原因是一开始想用
JDBC-JNI 的方式,想改用 JDBC-RESTful 代码没改干净。



通过指定URL获取连接,如下所示:

Class.forName("com.taosdata.jdbc.rs.RestfulDriver");
String jdbcUrl = "jdbc:TAOS-RS://taosdemo.com:6041/test?user=root&password=taosdata";
Connection conn = DriverManager.getConnection(jdbcUrl);
Class.forName("com.taosdata.jdbc.rs.RestfulDriver");String jdbcUrl = "jdbc:TAOS-RS://taosdemo.com:6041/test?user=root&password=taosdata";Connection conn = DriverManager.getConnection(jdbcUrl);

以上示例,使用 JDBC-RESTful 的 driver,建立了到 hostname 为 taosdemo.com,端口为 6041,数据库名为 test 的连接。这个 URL 中指定用户名(user)为 root,密码(password)为 taosdata。

使用 JDBC-RESTful 接口,不需要依赖本地函数库。与 JDBC-JNI 相比,仅需要:

  1. driverClass 指定为“com.taosdata.jdbc.rs.RestfulDriver”;
  2. jdbcUrl 以“jdbc:TAOS-RS://”开头;
  3. 使用 6041 作为连接端口。

按上面的方式修改,果然没有再报上面的错误。

作者 east
Flink 1月 3,2025

flink运行报错:java.lang.IllegalStateException: No ExecutorFactory found to execute the application

在本地运行flink代码,报错“
java.lang.IllegalStateException: No ExecutorFactory found to execute the application ”

通常是由于缺少必要的 Flink 依赖项导致的。具体来说,Flink 需要特定的执行器工厂来运行应用程序,而这些依赖项可能未正确包含在您的项目中。

原因分析

  1. 缺少 Flink 运行时依赖:
    • 您的代码片段看起来是基于 Flink 的流处理 API 编写的。如果项目缺少 Flink 运行时的相关依赖(例如 flink-java, flink-streaming-java, 和 flink-clients),Flink 将无法找到执行器工厂来启动作业。
  2. 依赖版本不匹配:
    • 如果您使用的 Flink 版本与代码不兼容,也可能导致类似的问题。确保所有 Flink 相关依赖的版本一致。
  3. 缺少必要的插件或扩展:
    • 某些情况下,特定的 Flink 插件或扩展可能缺失,导致执行器工厂无法加载。

解决方案

确保您的项目中包含了所有必要的 Flink 依赖项。以下是使用 Maven 的示例 pom.xml 配置,确保包含了 Flink 的核心和流处理依赖:

<dependencies>
    <!-- Flink 核心依赖 -->
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-java</artifactId>
        <version>1.16.2</version> <!-- 请根据需要替换为合适的版本 -->
    </dependency>

    <!-- Flink 流处理依赖 -->
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-streaming-java_2.12</artifactId>
        <version>1.16.2</version> <!-- 版本需与 flink-java 一致 -->
    </dependency>

    <!-- Flink 客户端依赖(如果需要远程提交作业) -->
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-clients_2.12</artifactId>
        <version>1.16.2</version>
    </dependency>



    <!-- 如果使用自定义 Source 和 Sink,确保它们所在的依赖已添加 -->
</dependencies>
作者 east

上一 1 2 3 4 … 41 下一个

关注公众号“大模型全栈程序员”回复“小程序”获取1000个小程序打包源码。回复”chatgpt”获取免注册可用chatgpt。回复“大数据”获取多本大数据电子书

标签

AIGC AI创作 bert chatgpt github GPT-3 gpt3 GTP-3 hive mysql O2O tensorflow UI控件 不含后台 交流 共享经济 出行 图像 地图定位 外卖 多媒体 娱乐 小程序 布局 带后台完整项目 开源项目 搜索 支付 效率 教育 日历 机器学习 深度学习 物流 用户系统 电商 画图 画布(canvas) 社交 签到 联网 读书 资讯 阅读 预订

官方QQ群

小程序开发群:74052405

大数据开发群: 952493060

近期文章

  • 如何在Chrome中设置启动时自动打开多个默认网页
  • spark内存溢出怎样区分是软件还是代码原因
  • MQTT完全解析和实践
  • 解决运行Selenium报错:self.driver = webdriver.Chrome(service=service) TypeError: __init__() got an unexpected keyword argument ‘service’
  • python 3.6使用mysql-connector-python报错:SyntaxError: future feature annotations is not defined
  • 详解Python当中的pip常用命令
  • AUTOSAR如何在多个供应商交付的配置中避免ARXML不兼容?
  • C++thread pool(线程池)设计应关注哪些扩展性问题?
  • 各类MCAL(Microcontroller Abstraction Layer)如何与AUTOSAR工具链解耦?
  • 如何设计AUTOSAR中的“域控制器”以支持未来扩展?

文章归档

  • 2025年7月
  • 2025年6月
  • 2025年5月
  • 2025年4月
  • 2025年3月
  • 2025年2月
  • 2025年1月
  • 2024年12月
  • 2024年11月
  • 2024年10月
  • 2024年9月
  • 2024年8月
  • 2024年7月
  • 2024年6月
  • 2024年5月
  • 2024年4月
  • 2024年3月
  • 2023年11月
  • 2023年10月
  • 2023年9月
  • 2023年8月
  • 2023年7月
  • 2023年6月
  • 2023年5月
  • 2023年4月
  • 2023年3月
  • 2023年1月
  • 2022年11月
  • 2022年10月
  • 2022年9月
  • 2022年8月
  • 2022年7月
  • 2022年6月
  • 2022年5月
  • 2022年4月
  • 2022年3月
  • 2022年2月
  • 2022年1月
  • 2021年12月
  • 2021年11月
  • 2021年9月
  • 2021年8月
  • 2021年7月
  • 2021年6月
  • 2021年5月
  • 2021年4月
  • 2021年3月
  • 2021年2月
  • 2021年1月
  • 2020年12月
  • 2020年11月
  • 2020年10月
  • 2020年9月
  • 2020年8月
  • 2020年7月
  • 2020年6月
  • 2020年5月
  • 2020年4月
  • 2020年3月
  • 2020年2月
  • 2020年1月
  • 2019年7月
  • 2019年6月
  • 2019年5月
  • 2019年4月
  • 2019年3月
  • 2019年2月
  • 2019年1月
  • 2018年12月
  • 2018年7月
  • 2018年6月

分类目录

  • Android (73)
  • bug清单 (79)
  • C++ (34)
  • Fuchsia (15)
  • php (4)
  • python (45)
  • sklearn (1)
  • 云计算 (20)
  • 人工智能 (61)
    • chatgpt (21)
      • 提示词 (6)
    • Keras (1)
    • Tensorflow (3)
    • 大模型 (1)
    • 智能体 (4)
    • 深度学习 (14)
  • 储能 (44)
  • 前端 (5)
  • 大数据开发 (491)
    • CDH (6)
    • datax (4)
    • doris (31)
    • Elasticsearch (15)
    • Flink (78)
    • flume (7)
    • Hadoop (19)
    • Hbase (23)
    • Hive (41)
    • Impala (2)
    • Java (71)
    • Kafka (10)
    • neo4j (5)
    • shardingsphere (6)
    • solr (5)
    • Spark (100)
    • spring (11)
    • 数据仓库 (9)
    • 数据挖掘 (7)
    • 海豚调度器 (10)
    • 运维 (34)
      • Docker (3)
  • 小游戏代码 (1)
  • 小程序代码 (139)
    • O2O (16)
    • UI控件 (5)
    • 互联网类 (23)
    • 企业类 (6)
    • 地图定位 (9)
    • 多媒体 (6)
    • 工具类 (25)
    • 电商类 (22)
    • 社交 (7)
    • 行业软件 (7)
    • 资讯读书 (11)
  • 嵌入式 (71)
    • autosar (63)
    • RTOS (1)
    • 总线 (1)
  • 开发博客 (16)
    • Harmony (9)
  • 技术架构 (6)
  • 数据库 (32)
    • mongodb (1)
    • mysql (13)
    • pgsql (2)
    • redis (1)
    • tdengine (4)
  • 未分类 (7)
  • 程序员网赚 (20)
    • 广告联盟 (3)
    • 私域流量 (5)
    • 自媒体 (5)
  • 量化投资 (4)
  • 面试 (14)

功能

  • 登录
  • 文章RSS
  • 评论RSS
  • WordPress.org

All Rights Reserved by Gitweixin.本站收集网友上传代码, 如有侵犯版权,请发邮件联系yiyuyos@gmail.com删除.