如果让你来做一个有状态流式应用的故障恢复,你会如何来做呢?单机和多机会遇到什么不同的问题?FlinkCheckpoint是做什么用的?原理是什么? 一、什么是Checkpoint? Checkpoint是对当前运行状态的完整记录。程序重启后能从Checkpoint中恢复出输入数据读取到哪了,各个算子原来的状态是什么,并继续运行程序。即用于Flink的故障恢复。这种机制保证了实时程序运行时,即使突然遇到异常也能够进行自我恢复。 二、如何实现Checkpoint功能? 如果让你来设计,对于流式应用如何做到故障恢复?我们从最简单的单机单线程看起。 一)单机情况 同步执行,每次只处理一条数据 很简单...

  mA6vNs5hntJW   2024年04月26日   17   0   0 Java

单线程下的单例模式: publicclassSingleton{ privatestaticSingletoninstance; privateSingleton(){} publicstaticSingletongetInstance(){ if(instancenull){ instance=newSingleton() } returninstance; } } 几个关键点: static修饰:表名属于类而不是类对象,不会每生成一个新的类对象都新生成一份。并且可以在不创建类对象的情况下直接调用。 为什么构造函数是private类型?不然呢,开放了构造函数还怎么单例。 为什么不把单...

  mA6vNs5hntJW   2024年04月11日   35   0   0 Java

前面文章我们学习了编译器前端的词法和语法分析工具,本篇我们来看看如何借助Antlr工具,快速生成词法和语法分析代码。 一、安装 mac环境:1)安装 brewinstallantlr 2)配置classpath(把Antlr的JAR文件设置到CLASSPATH环境变量中,以便顺利编译所生成的Java源代码。) vi/.bash_profile 替换成你的antlrjar路径 CLASSPATH=".:/opt/homebrew/Cellar/antlr/4.13.1/antlr-4.13.1-complete.jar:$CLASSPATH" source/.bash_profile 有...

  mA6vNs5hntJW   2024年04月10日   30   0   0 Java

什么是状态?状态有什么作用? 如果你来设计,对于一个流式服务,如何根据不断输入的数据计算呢? 又如何做故障恢复呢? 一、为什么要管理状态 流计算不像批计算,数据是持续流入的,而不是一个确定的数据集。在进行计算的时候,不可能把之前已经输入的数据全都保存下来,然后再和新数据合并计算。效率低下不说,内存也扛不住。另外,如果程序出现故障重启,没有之前计算过的状态保存,那么也就无法再继续计算了。 因此,就需要一个东西来记录各个算子之前已经计算过值的结果,当有新数据来的时候,直接在这个结果上计算更新。这个就是状态。 常见的流处理状态功能如下: 数据流中的数据有重复,我们想对重复数据去重,需要记录哪些...

  mA6vNs5hntJW   2024年03月06日   53   0   0 Java

本篇文章将带大家运行Flink最简单的程序WordCount。先实践后理论,对其基本输入输出、编程代码有初步了解,后续篇章再对Flink的各种概念和架构进行介绍。下面将从创建项目开始,介绍如何创建出一个Flink项目;然后从DataStream流处理和FlinkSQL执行两种方式来带大家学习WordCount程序的开发。Flink各版本之间变化较多,之前版本的函数在后续版本可能不再支持。跟随学习时,请尽量选择和笔者同版本的Flink。本文使用的Flink版本是1.13.2。 一、创建项目 在很多其他教程中,会看到如下来创建Flink程序的方式。虽然简单方便,但对初学者来说,不知道初始化项目的时...

  mA6vNs5hntJW   2024年02月19日   93   0   0 Java

流处理和批处理是什么?什么是Flink?为什么要学习Flink?Flink有什么特点,能做什么?本文将为你解答以上问题。 一、批处理和流处理 早些年,大数据处理还主要为批处理,一般按天或小时定时处理数据,代表性的框架为MapReduce、Hive、Spark等。但是,传统批处理的问题也很快显现: 实时性低,数据一般为T-1的数据 数据存储方式,无法按行进行修改,需要按分区重写 必须等数据都到了才能开始计算 计算处理时间一般较长 为了解决批处理的问题,流处理应运而生。流处理能将实时产生的数据,实时计算。将延迟降低到秒级或者毫秒级。流处理引擎也已经经过了几代的发展,需要一个高吞吐、低延迟、高...

  mA6vNs5hntJW   2024年02月19日   75   0   0 开源研究

在后面学习Flink相关知识时,会深入源码探究其实现机制。因此,需要现在本地配置好源码阅读环境。 本文搭建环境: MacM1(AppleSilicon) Java8 IDEA Flink官方源码 一、下载Flink源码 github地址:https://github.com/apache/flink考虑到一些原因,github下载可能会极其缓慢,且大概率失败。可以考虑使用gitee地址:https://gitee.com/apache/flink gitclonehttps://gitee.com/apache/flink.git 忽略重构提交Flink文档中提到了下面的操作:(作用未知...

  mA6vNs5hntJW   2024年02月19日   59   0   0 开源研究

RPC(RemoteProcedureCall)是Hadoop服务通信的关键库,支撑上层分布式环境下复杂的进程间(Inter-ProcessCommunication,IPC)通信逻辑,是分布式系统的基础。允许运行于一台计算机上的程序像调用本地方法一样,调用另一台计算机的子程序。由于RPC服务整体知识较多,本节仅针对对YarnRPC进行简略介绍,详细内容会后续开专栏介绍。 一、RPC通信模型介绍 为什么会有RPC框架?在分布式或微服务情境下,会有大量的服务间交互,如果用传统的HTTP协议端口来通信,需要耗费大量时间处理网络数据交换上,还要考虑编解码等问题。如下图所示。 客户端通过RPC框架的...

  mA6vNs5hntJW   2023年11月01日   81   0   0 Java

一个庞大的分布式系统,各个组件间是如何协调工作的?组件是如何解耦的?线程运行如何更高效,减少阻塞带来的低效问题?本节将对Yarn的服务库和事件库进行介绍,看看Yarn是如何解决这些问题的。 一、服务库 一)简介 对于生命周期较长的对象,Yarn采用基于服务的模型对其进行管理,有以下几个特点: 基于状态管理:分为4个状态:NOTINITED(被创建)、INITED(已初始化)、STARTED(已启动)、STOPPED(已停止)。 服务状态的变化会触发其他的操作。 可通过组合的方式对服务进行组合。 二)源码简析 源代码地址在hadoop-common-project/hadoop-common...

  mA6vNs5hntJW   2023年11月01日   52   0   0 Java

当一个服务拥有太多处理逻辑时,会导致代码结构异常的混乱,很难分辨一段逻辑是在哪个阶段发挥作用的。这时就可以引入状态机模型,帮助代码结构变得清晰。 一、状态机库概述 一)简介 状态机由一组状态组成:【初始状态->中间状态->最终状态】。在一个状态机中,每个状态会接收一组特定的事件,根据事件类型进行处理,并转换到下一个状态。当转换到最终状态时则退出。 二)状态转换方式 状态间转换会有下面这三种类型: 三)Yarn状态机类 在Yarn中提供了一个工厂类StateMachineFactory来帮助定义状态机。如何使用,我们直接写个demo。 二、案例demo 在上一篇文章《Yarn服务库和...

  mA6vNs5hntJW   2023年11月01日   88   0   0 Java

本篇学习YarnApplication编写方法,将带你更清楚的了解一个任务是如何提交到Yarn,在运行中的交互和任务停止的过程。通过了解整个任务的运行流程,帮你更好的理解Yarn运作方式,出现问题时能更好的定位。 一、简介 本篇将对YarnApplication编写流程进行介绍。将一个新的应用程序运行到Yarn上,主要编写两个组件Client和ApplicationMaster,组件的具体实现案例将在后两篇文章中介绍。(实际使用中,我们并不需要实现一个YarnApplication,直接将任务提交到MapReduce、Spark、Hive、Flink等框架上,再由这些框架提交任务即可,这些框架...

  mA6vNs5hntJW   2023年11月01日   33   0   0 Java

上篇文章介绍了编写YarnApplication的整体框架流程,本篇文章将详细介绍其中Client部分的编写方式。 一、YarnClient编写方法 本篇代码已上传Github:GithubMyYarnClient 一)编写流程 1、创建并启动Client YarnClient内容通过ApplicationClientProtocol与ResourceManager通信,向RM的ApplicationsManager申请Application。跟踪进去可以在YarnClientImpl找到rpc:this.rmClient=(ApplicationClientProtocol)ClientR...

  mA6vNs5hntJW   2023年11月01日   45   0   0 Java

本篇文章继续介绍YarnApplication中ApplicationMaster部分的编写方法。 一、ApplicationMaster编写方法 上一节讲了Client提交任务给RM的全流程,RM收到任务后,由ApplicationsManager向NM申请Container,并根据Client提供的ContainerLaunchContext启动ApplicationMaster。本篇代码已上传Github:GithubMyApplicationMaster 一)整体流程 1&2、启动NMClient和RMClient 在AM中需要分别启动NMClient和RMClient进行通...

  mA6vNs5hntJW   2023年11月01日   30   0   0 Java

前面几篇文章对Yarn基本架构、程序基础库、应用设计方法等进行了介绍。之后几篇将开始对Yarn核心组件进行剖析。ResourceManager(RM)是Yarn的核心管理服务,负责集群管理、任务调度、状态机管理等,本篇将对RM总体架构进行介绍。 一、RM基本职能 主要包含以下几个功能: Client交互:处理来自Client的请求; 管理ApplicationMaster:启动、管理、重启等; 管理Nodemanager:接收NM汇报的资源信息,并下达管理指令; 资源管理与调度:接收AM的资源请求,并分配资源。 如上图所示,RM中各组件通过对应RPC与各Client进行通信: Reso...

  mA6vNs5hntJW   2023年11月01日   47   0   0 Java

一、根本原因 「CPU、内存、磁盘之间的速度差异」 为了能同时执行多个任务,CPU发展出时间片轮转、多核等 CPU要从内存中读数据太慢了,所以给自己设置了缓存 CPU读磁盘更慢了,所以可以让该线程阻塞 二、直接原因 缓存导致的可见性问题 CPU把要处理的数据加载到自己的缓存中,处理完了放回自己的缓存。 另一个CPU同样的处理,就导致可能看不到上一个CPU处理的结果。 线程切换带来的原子性问题 程序中的一行代码往往不是一条CPU指令。 线程切换的时候,可能会在一个代码执行的中间地方切换。 编译优化带来的有序性问题 优化会为了更高效的利用CPU缓存,将代码指令重排。 这个重排的过程会导致看似...

  mA6vNs5hntJW   2023年11月01日   45   0   0 Java

如何解决其中的可见性和有序性导致的问题,这也就引出来了今天的主角——Java内存模型。 一、什么是Java内存模型? 导致可见性的原因是缓存,导致有序性的原因是编译优化,那解决可见性、有序性最直接的办法就是禁用缓存和编译优化,但这样虽然解决了问题,但也导致带来的性能优化都没了。 因此,解决方案是:提出一套规则和方法,是程序员能在该禁用的时候禁用,不该禁用的时候不禁用。 Java内存模型规范就是来解决这个问题的——提供按需禁用缓存和编译优化的方法具体来说,这些方法包括volatile、synchronized和final三个关键字,以及六项Happens-Before规则,这也正是本期的重点内容...

  mA6vNs5hntJW   2023年11月01日   69   0   0 Java

原子性问题的源头是线程切换 Q:如果禁用CPU线程切换是不是就解决这个问题了?A:单核CPU可行,但到了多核CPU的时候,有可能是不同的核在处理同一个变量,即便不切换线程,也有问题。 所以,解决原子性的关键是「同一时刻只有一个线程处理该变量,也被称为互斥」。 如何做到呢?用「锁」。 一、锁模型 一)简易锁模型 一般看到的锁模型长下面这样。 但对于这个模型,会有几个疑问: 锁的是什么? 临界区的这一堆代码相关的都被锁了? 保护的又是什么? 二)改进后的锁模型 用下面这个模型来解释就解答了上面几个问题: 要保护的是临界区中的资源R 因此要为R创建一个对应的锁LR 需要处理资源R的时候先加锁...

  mA6vNs5hntJW   2023年11月01日   72   0   0 Java

读本篇文章之前,如果让你叙述一下ExceptionErrorThrowable的区别,你能回答出来么?你的反应是不是像下面一样呢? 你在写代码时会经常trycatch(Exception) 在log中会看到OutOfMemoryError Throwable似乎不常见,但也大概听说过 一、ExceptionErrorThrowable关系 直接看下图,展示了三者之间的关系: Throwable是Error和Exception的父类。 Exception是程序正常运行中可预料的正常情况,应该被捕获并进行处理。 又分为可检查(checked)和不检查(unchecked)异常。 可检查异常...

  mA6vNs5hntJW   2023年11月01日   16   0   0 Java

如果你被问到:什么是反射?为什么需要反射、以及反射的应用?你会如何回答呢?本篇会带大家初识反射,了解反射概念和基本应用。反射的原理以及深入源码的探究将会在后面几篇介绍。 一、什么是反射? 要理解什么是反射,我们先看看什么是「正射」,一个常见的获取Student的正射如下: Studentstudent=newStudent(); 通常我们都是直接声明,或者通过newStudent()直接获取一个Student类,然后再使用。而一个反射的例子如下: //这里的“com.demo.Student”是需要反射的类的全限定名(包名+类名) Classclz=Class.forName("com.de...

  mA6vNs5hntJW   2023年11月01日   32   0   0 Java

上一篇文章对ResourceManager整体架构和功能进行了讲述。本篇将对RM中管理ApplicationMaster的部分进行深入的讲解。下面将会介绍RM与AM整体通信执行流程,并对RM中涉及的对应服务进行具体讲解。为了更好的学习本篇知识,建议先熟悉以下知识点,不了解的部分可翻到前面对应的文章进行学习: RPC(2-2Yarn基础库底层通信库RPC) 事件处理器(2-3Yarn基础库服务库与事件库) AM程序执行流程(3-3YarnApplicationMaster编写) 一、AM执行流程 客户端提交任务到RM后,启动AM到任务完成的流程如下所示: 各个步骤具体执行操作请对应下面各服务...

  mA6vNs5hntJW   2023年11月01日   48   0   0 Java
关注 更多

空空如也 ~ ~

粉丝 更多

空空如也 ~ ~