首页 文章 精选 留言 我的

精选列表

搜索[API集成],共10000篇文章
优秀的个人博客,低调大师

橙单低代码 v2.9.5 发布,致谢 Mybatis-flex 作者海哥支持集成

致谢 Mybatis-flex 非常感谢 Mybatis-flex 作者 @开源海哥 的支持。尽管海哥每天都忙于各种开源框架的开发与维护,然而在我们提出各种技术问题和兼容性建议时,仍然会耐心倾听我们的需求并快速升级予以支持,最终使得橙单在原有支持 Mybatis-plus 的同时,可以轻松修改代码模板支持 Mybatis-flex,最后再次感谢海哥。 新版功能 基础架构,升级支持 Spring Boot 3.1.6。从当前版本开始,橙单将同时支持 Spring Boot 3.x 和 Spring Boot 2.7.x。 基础架构,升级支持 Mybatis Flex。从当前版本开始,橙单将同时支持 Mybatis Flex 和 Mybatis Plus。 工作流,Spring Boot 3 版本升级至 Flowable 7。 工作流,Spring Boot 2 版本升级至 Flowable 6.8。 工作流,原有自动跳过的执行监听器改为任务监听器,以支持更多自动跳过条件。 图和真相

优秀的个人博客,低调大师

开源直播课丨大数据集成框架ChunJun类加载器隔离方案探索及实践

本期我们带大家回顾一下无倦同学的直播分享《ChunJun类加载器隔离》,ChunJun类加载器隔离的方案是我们近期探索的一个新方案,这个方案目前还不是非常成熟,希望能借由此次分享与大家一起探讨下这方案,如果大家有一些新的想法欢迎大家在github上给我提issue或者pr。 一、Java 类加载器解决类冲突基本思想 在学习方案之前,首先为大家介绍一下Java类加载器解决类冲突的基本思想。 01 什么是 Classpath? Classpath是JVM用到的一个环境变量,它用来指示JVM如何搜索Class。 因为Java是编译型语言,源码文件是.java,而编译后的.class文件才是真正可以被JVM执行的字节码。因此,JVM需要知道,如果要加载一个com.dtstack.HelloWorld的类,应该去哪搜索对应的HelloWorld.class文件。 所以,Classpath就是一组目录的集合,它设置的搜索路径与操作系统相关,例如: 在Windows系统上,用;分隔,带空格的目录用""括起来,可能长这样: C:\work\project1\bin;C:\shared;"D:\My Documents\project1\bin" 在MacOS & Linux系统上,用:分隔,可能长这样: /usr/shared:/usr/local/bin:/home/wujuan/bin 启动JVM时设置Classpath变量, 实际上就是给java命令传入-Classpath或-cp参数. java -Classpath .;/Users/lzq/Java/a;/Users/lzq/Java/b com.dtstack.HelloWorld 没有设置系统环境变量,也没有传入-cp参数,那么JVM默认的Classpath为,即当前目录: java com.dtstack.HelloWorld 02 Jar 包中的类什么时候被加载? ● Jar包 Jar 包就是 zip 包,只不过后缀名字不同。用于管理分散的 .class 类。 生成 jar 包可以用 zip 命令 zip -r ChunJun.zip ChunJun java -cp ./ChunJun.zip com.dtstack.HelloWorld ● 加载 “加载”(Loading) 阶段是整个“类加载”(Class Loading) 过程中的一个阶段,希望读者没有混淆这两个看起来很相似的名词。在加载阶段,Java虚 拟机需要完成以下三件事情: 1.通过一个类的全限定名来获取定义此类的二进制字节流; 2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构; 3.在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。 ● 解析 类或接口的解析 假设当前代码所处的类为D,如果要把一个从未解析过的符号引用N解析为一个类或接口C的直接引用,那虚拟机完成整个解析的过程需要包括以下3个步骤: 1.如果C不是一个数组类型,那虚拟机将会把代表N的全限定名传递给D的类加载器去加载这个类C。 在加载过程中,由于元数据验证、字节码验证的需要,又可能触发其他相关类的加载动作,例如加载这个类的父类或实现的接口。一旦这个加载过程出现了任何异常,解析过程就将宣告失败。 2.如果C是一个数组类型,并且数组的元素类型为对象,也就是N的描述符会是类 似“[Ljava/lang/Integer的形式,那将会按照第一点的规则加载数组元素类型。 如果N的描述符如前面所假设的形式,需要加载的元素类型就是“java.lang.Integer",接着由虚拟机生成一个代表该数组维度和元素的数组对象。 3.如果上面两步没有出现任何异常,那么C在虚拟机中实际上已经成为一个有效的类或接口了,但在解析完成前还要进行符号引用验证,确认D是否具备对C的访问权限。如果发现不具备访问权限,将抛出java.lang,llegalAccessEror异常。 03 哪些行为会触发类的加载? 关于在什么情况下需要开始类加载过程的第一个阶段“加载”,《Java虚拟机规范》中并没有进行 强制约束,这点可以交给虚拟机的具体实现来自由把握。但是对于初始化阶段,《Java虚拟机规范》 则是严格规定了有且只有六种情况必须立即对类进行“初始化”(而加载、验证、准备自然需要在此之 前开始): ● 场景一 遇到new、getstatic、putstatic或invokestatic这四条字节码指令时,如果类型没有进行过初始 化,则需要先触发其初始化阶段。能够生成这四条指令的典型Java代码场景有: 1.使用new关键字实例化对象的时候。 2.读取或设置一个类型的静态字段(被final修饰、已在编译期把结果放入常量池的静态字段除外) 的时候。 3.调用一个类型的静态方法的时候。 ● 场景二 使用java.lang.reflect包的方法对类型进行反射调用的时候,如果类型没有进行过初始化,则需 要先触发其初始化。 ● 场景三 当初始化类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化。 ● 场景四 当虚拟机启动时,用户需要指定一个要执行的主类(包含main()方法的那个类),虚拟机会先 初始化这个主类。 ● 场景五 当使用JDK 7新加入的动态语言支持时,如果一个java.lang.invoke.MethodHandle实例最后的解析结果为REF_getStatic、REF_putStatic、REF_invokeStatic、REF_newInvokeSpecial四种类型的方法句柄,并且这个方法句柄对应的类没有进行过初始化,则需要先触发其初始化。 ●场景六 当一个接口中定义了JDK 8新加入的默认方法(被default关键字修饰的接口方法)时,如果有这个接口的实现类发生了初始化,那该接口要在其之前被初始化。 对于以上这六种会触发类型进行初始化的场景,《Java虚拟机规范》中使用了一个非常强烈的限定语 ——“有且只有”,这六种场景中的行为称为对一个类型进行主动引用。除此之外,所有引用类型的方 式都不会触发初始化,称为被动引用。 04 什么是双亲委派机制? 双亲委派机制,是按照加载器的层级关系,逐层进行委派,例如下图中的自定义类加载器想要加载类,它首先不会想要自己去加载,它会通过层级关系逐层进行委派,从自定义类加载器 -> App ClassLoader -> Ext ClassLoader -> BootStrap ClassLoader,如果在BootStrap ClassLoader中没有找到想要加载的类,又会逆循环加载。 05 如何打破双亲委派机制? 那么如何打破双亲委派机制呢?其实可以通过重写 loadclass 方法来实现,具体过程大家可通过视频了解,这里就不过多赘述。 二、Flink 类加载隔离的方案 接下来我们来介绍下Flink 类加载隔离的方案,Flink有两种类加载器Parent-First和Child-First,他们的区别是: 1.Parent-First 类似 Java 中的双亲委派的类加载机制。Parent First ClassLoader 实际的逻辑就是一个 URL ClassLoader。 2.Child-First 先用 classloader.parent-first-patterns.default 和 classloader.parent-first-patterns.additional 拼接的list做匹配,如果类名前缀匹配了,先走双亲委派。否则就用 ChildFirstClassLoader 先加载。 Child-First 存在的问题 每次新 new 一个 ChildFirstClassLoader,如果运行时间久的话,类似 Session 这种 TaskManager 一直不关闭的情况。任务运行多次以后,会出现元数据空间爆掉,导致任务失败。 Child-First 加载原理 01 Flink是如何避免类泄露的? 大家可以参考Flink中的jira,这里面包含一些bug和处理方法: https://issues.apache.org/jira/browse/FLINK-16245 https://issues.apache.org/jira/browse/FLINK-11205 Flink如何避免类泄露,主要是通过以下两种方法: 增加一层委派类加载器,将真正的 UserClassloader 包裹起来。 增加一个回调钩子,当任务结束的时候可以提供给用户一个接口,去释放未释放的资源。 KinesisProducer 使用了这个钩子 final RuntimeContext ctx = getRuntimeContext(); ctx.registerUserCodeClassLoaderReleaseHookIfAbsent( KINESIS_PRODUCER_RELEASE_HOOK_NAME, ()-> this.runClassLoaderReleaseHook (ctx.getUserCodeClassLoader())); 02 Flink 卸载用户代码中动态加载的类 卸载用户代码中动态加载的类,所有涉及动态用户代码类加载(会话)的场景都依赖于再次卸载的类。 类卸载指垃圾回收器发现一个类的对象不再被引用,这时会对该类(相关代码、静态变量、元数据等)进行移除。 当TaskManager启动或重启任务时会加载指定任务的代码,除非这些类可以卸载,否则就有可能引起内存泄露,因为更新新版本的类可能会随着时间不断的被加载积累。这种现象经常会引起OutOfMemoryError: Metaspace这种典型异常。 类泄漏的常见原因和建议的修复方式: ● Lingering Threads 确保应用代码的函数/sources/sink关闭了所有线程。延迟关闭的线程不仅自身消耗资源,同时会因为占据对象引用,从而阻止垃圾回收和类的卸载。 ● Interners 避免缓存超出function/sources/sinks生命周期的特殊结构中的对象。比如Guava的Interner,或是Avro的序列化器中的类或对象。 ● JDBC JDBC驱动会在用户类加载器之外泄漏引用。为了确保这些类只被加载一次,可以将驱动JAR包放在Flink的 lib/ 目录下,或者将驱动类通过 classloader-parent-first-patterns-additional 加到父级优先加载类的列表中。 释放用户代码类加载器的钩子(hook)可以帮助卸载动态加载的类,这种钩子在类加载器卸载前执行,通常情况下最好把关闭和卸载资源作为正常函数生命周期操作的一部分(比如典型的close()方法)。有些情况下(比如静态字段)最好确定类加载器不再需要后就立即卸载。 释放类加载器的钩子可以通过 RuntimeContext.registerUserCodeClassLoaderReleaseHookIfAbsent()方法进行注册。 03 Flink 卸载 Classloader 源码 BlobLibraryCacheManager$ResolvedClassLoader private void runReleaseHooks() { Set<map.entry> hooks = releaseHooks.entrySet(); if (!hooks.isEmpty()) { for (Map.EntryhookEntry : hooks) { try { LOG.debug("Running class loader shutdown hook: {}.", hookEntry.getKey()); hookEntry.getValue().run(); } catch (Throwable t) { LOG.warn( "Failed to run release hook '{}' for user code class loader.", hookEntry.getValue(), t); } } releaseHooks.clear(); } } 三、ChunJun 如何实现类加载隔离 接下来为大家介绍下ChunJun 如何实现类加载隔离。 01 Flink jar 的上传时机 首先我们需要上传Jar包,整体流程如下图所示: ● Yarn Perjob 提交任务的时候上传 jar 包,会放到 hdfs://flink03:9000/user/root/.flink/application_1654762357754_0140。 ● Yarn Session 启动 Session 的时候,Yarn 的 App 上传 Jar 包机制,往 Session 提交任务的时候,Flink 的 Blob Server 负责收。 02 Yarn 的分布式缓存 03 Yarn 的分布式缓存 分布式缓存机制是由各个NM实现的,主要功能是将应用程序所需的文件资源缓存到本地,以便后续任务的使用。资源缓存是用时触发的,也就是第一个用到该资源的任务触发,后续任务无需再进行缓存,直接使用即可。 根据资源类型和资源可见性,NM可将资源分成不同类型: 资源可见性分类 ● Public 节点上所有的用户都可以共享该资源,只要有一个用户的应用程序将着这些资源缓存到本地,其他所有用户的所有应用程序都可以使用。 ● Private 节点上同一用户的所有应用程序共享该资源,只要该用户其中一个应用程序将资源缓存到本地,该用户的所有应用程序都可以使用。 ● Application 节点上同一应用程序的所有Container共享该资源 资源类型分类 ● Archive 归档文件,支持.jar、.zip、.tar.gz、.tgz、.tar的5种归档文件。 ● File 普通文件,NM只是将这类文件下载到本地目录,不做任何处理 ● Pattern 以上两种文件的混合体 YARN是通过比较resource、type、timestamp和pattern四个字段是否相同来判断两个资源请求是否相同的。如果一个已经被缓存到各个节点上的文件被用户修改了,则下次使用时会自动触发一次缓存更新,以重新从HDFS上下载文件。 分布式缓存完成的主要功能是文件下载,涉及大量的磁盘读写,因此整个过程采用了异步并发模型加快文件下载速度,以避免同步模型带来的性能开销。 04 Yarn 的分布式缓存 NodeManager采用轮询的分配策略将这三类资源存放在yarn.nodemanager.local-dirs指定的目录列表中,在每个目录中,资源按照以下方式存放: ● Public资源 存放在${yarn.nodemanager.local-dirs}/filecache/目录下,每个资源将单独存放在以一个随机整数命名的目录中,且目录的访问权限均为0755。 ● Private资源 存放在${yarn.nodemanager.local-dirs}/usercache/${user}/filecache/目录下,(其中${user}是应用程序提交者,默认情况下均为NodeManager启动者),每个资源将单独存放在以一个随机整数命名的目录中,且目录的访问权限均为0710。 ● Application资源 存放在${yarn.nodemanager.local-dirs}/usercache/${user}/${appcache}/${appid}/filecache/目录下(其中${appid}是应用程序ID),每个资源将单独存放在以一个随机整数命名的目录中,且目录的访问权限均为0710; 其中Container的工作目录位于${yarn.nodemanager.local-dirs}/usercache/${user}/${appcache}/${appid}/${containerid}目录下,其主要保存jar包文件、字典文件对应的软链接。 05 Flink BlobServer 06 如何快速提交,减少上传 jar 包 Flink libs 下面 jar包、Flink Plugins 下面的 jar 包、Flink 任务的 jar 包(对于 ChunJun 来说就是所有 connector 和 core), Flink jar 用户自定义 jar 包。 ● Perjob 如果可以提前上传到 HDFS: 提前把 Flink lib 、Flink plugins、ChunJun jar 上传到 HDFS 上面。 提交任务的时候通过 yarn.provided.lib.dirs 指定 HDFS 上面的路径即可。 如果不可以提前上传到 HDFS: 任务提交上传到 HDFS 固定位置,提交的时候检查 HDFS 上如果有对应的 jar(有缓存策略),就把本地路径替换成远程路径。 利用回调钩子,清楚异常任务结束的垃圾文件。 ● Seeion 如果可以提前上传到 HDFS: 提前把 Flink lib 、Flink plugins、ChunJun jar 上传到 HDFS 上面。 启动 session 的时候通过 yarn.provided.lib.dirs 指定 HDFS 上面的路径即可。 提交任务的时候不需要上传 core 包。 如果不可以提前上传到 HDFS: Session 启动的时候就上传所有 jar 到 HDFS 上面。通过 yarnship 指定。 Flink 任务提交到 Session 的时候,不需要提交任何 jar 包。 07 类加载隔离遇到的问题分析 ● 思路分析 首先要把不同插件(connector) 放到不同的 Classloader 里面。 然后使用 child-first 的加载策略。 确保不会发生 x not cast x 错误。 元数据空间不会内存泄露,导致任务报错。 要缓存 connector jar 包。 ● 遇到的问题 Flink 一个 job 可能有多个算子,一个 connector 就是一个算子。Flink 原生是为 job 级别新生成的 Classloader,无法把每个 connector 放在一个独立的 Classloader 里面。 child-first 加载策略在 Session 模式下每次都新 new 一个 Classloader,导致元数据空间内存泄露。 connecotor 之间用到公有的类会报错。 和问题2类似,主要是因为有些线程池,守护线程会拿着一些类对象,或者类 class 对象的引用。 如果用原生 -yarnship 去上传,会放到 App Classloader 里面。那么就会导致某些不期望用 App Classloader 加载的类被加载。 08 Flink JobGraph Classpath 的使用 /** Set of JAR files required to run this job. */ private final ListuserJars = new ArrayList(); /** Set of custom files required to run this job. */ private final MapuserArtifacts = new HashMap<>(); /** List of Classpaths required to run this job. */ private ListClasspaths = Collections.emptyList(); 客户端处理,JobGraph 处理 userJars、userArtifacts、Classpaths 这三个属性。 Classpath 只留下 connector 的层级目录。 启动 Session 的时候上传 jar,jar 缓存在 Yarn 的所有的 NodeManager 节点。 jobmanager 和 taskmanager 构建 Classloader 的时候去修改 Classpath 的路径,替换成当前节点 NodeManager 的缓存路径。 根据不同 connecotr 去构建Flink Job 的 Classloader。 把构建出来的 classlaoder 进行缓存,下次任务还有相同的 Classloader。避免内存泄露。 重写新的 ChildFirstCacheClassloader 里面的 loadclass 方法,根据不同的 connector url 去生成 单独的 Classloader。 四、遇到的问题和排查方案? jar包冲突常见的异常为找不到类(java.lang.ClassNotFoundException)、找不到具体方法(java.lang.NoSuchMethodError)、字段错误( java.lang.NoSuchFieldError)或者类错误(java.lang.LinkageError)。 ● 常见的解决方法如下 1、首先做法是打出工程文件的依赖树,将根据jar包依赖情况判定是不是同一个jar包依赖了多个版本,如果确认问题所在,直接exclusion其中错误的jar包即可。 2、如果通过看依赖树不能确定具体冲突的jar包,可以使用添加jvm参数的方式启动程序,将类加载的具体jar信息打印出来;-verbose:class 。 3、经过上述步骤基本就可以解决jar包冲突问题,具体的问题要具体分析。 ● 常用工具推荐 1.Maven-helper 主要排查类冲突的 IDEA 插件。 2.Jstack 死锁的一些问题可以通过这个工具查看 jstack 调用栈。 3.Arthas 排查一些性能问题和 Classloader 泄露问题。 4.VisualVM 排查一些对象内存泄露、dump 文件分析等。 袋鼠云开源框架钉钉技术交流群(30537511),欢迎对大数据开源项目有兴趣的同学加入交流最新技术信息,开源项目库地址:https://github.com/DTStack/Taier

优秀的个人博客,低调大师

Google 将 RSS 阅读器集成进 Chrome 浏览器,Google Reader 后继有人

Google Reader(Google 阅读器)曾是 Google 旗下的一个基于网络的聚合器,能在线或者离线阅读 RSS。Google Reader 于 2005 年发布,由于 Google Reader 用户数量逐年下降,Google 于 2013 年 7 月 1 日终止服务。 如今,Google 开始在 Chrome 浏览器上测试新的「关注」功能,将 RSS 阅读器的功能重新带回用户视野。 当用户在浏览网页时,点击 Chrome 菜单栏后,Chrome 就会显示一个「Follow/关注」按钮。它出现在弹出菜单的最底部,其中还包括网站的图标和名称(如下图所示)。一旦点击关注,来自该网站的新内容将作为「Following」标签的一部分出现在新标签页中,该标签会展示封面图片、标题,并显示发布时间。 与 Chrome 浏览器原本的 Discover 页面相比,Discover 仅仅是基于话题展示来自各个不同网站的相似内容或你可能感兴趣的内容,新的 Following 页面则是呈现用户主动选择的网站。 Chrome 团队希望在出版商/网站和读者之间建立更深的联系,同时使访问你最喜欢的网站变得更容易。Google 的 Follow 解决方案利用了所有用户都会安装的浏览器,以及现有的开放式 RSS 网络标准。如果网站不支持 RSS,Google 将退回到其现有的内容索引方案,以保持用户及时获取信息。 Google 目前仅将 Follow 作为一个实验性项目,并会持续评估出版商/网站和最终用户的反馈,以决定是否正式推出这项功能。这项功能将在未来几周率先出现在 Android 版本的 Chrome Canary 上。目前尚不清楚这项功能在未来是否会出现在 iOS 或桌面端浏览器上。

优秀的个人博客,低调大师

LiteOS-Studio V1.45.7 发布,华为物联网操作系统集成开发环境

LiteOS-Studio V1.45.7已经发布,LiteOS Studio是基于LiteOS轻量级操作系统开发的工具。它提供了代码编辑、编译、烧录、调试及Trace跟踪等功能,可以对系统关键数据进行实时跟踪及保存与回放。 此版本更新内容包括: 支持STM32F769NI、STM32L431RC openocd烧录、调测,Bug修复。 访问LiteOS Studio 使用手册,获取软件安装、环境配置、工程示例等等。 详情查看:https://gitee.com/LiteOS/LiteOS_Studio/releases/V1.45.1

优秀的个人博客,低调大师

Flink 作为现代数据仓库的统一引擎:Hive 集成生产就绪!

在2020年,你的数据仓库和基础设施需要满足哪些需求? 我们总结了几下几点: 首先,当下的企业正快速转向更实时化的模式,这要求企业具备对线上流式数据进行低延迟处理的能力,以满足实时(real-time)或近实时(near-real-time)的数据分析需求。人们对从数据产生到数据可用之间延迟的容忍度越来越低。曾经几个小时甚至几天的延误不再被接受。用户期待的是几分钟甚至几秒钟的数据端到端体验。 第二,数据基础设施需要具备同时处理线上和线下数据的能力,两种模式在实际应用中都不可或缺。除了上面提到的流处理,用户也需要批处理做即席查询(ad-hoc query)和数据挖掘。数据基础设施不应该要求用户二选一,而应该提供两个选项并且都是高质量的。 第三,数据工程师、数据科学家、分析师和运维人员都在渴望一套统一的数据技术栈,以便更轻松的使用。大数据领域的技术栈已经支离破碎很多年了,企业可能有一套流处理系统,一套批处理系统,一套线上数据分析系统。这基本都是由于当年流处理框架不够成熟而被迫采用过时的 lambda 架构造成的问题。现在不同了,流处理已成为主流,终端用户不必再学习多种技能和维护各种复杂的工具和数据处理管道(data pipeline)。用户渴望的是一套统一的简单易学易维护的方案。 如果你对以上问题深有同感,那说明这篇文章很适合你。我们来看看如何真正解决这个问题。 接下来我将带各位了解下 Flink 与 Hive 生产级别的整合工作。 Flink 与 Hive 生产级整合 Flink 一直遵循“ 流优先,批是流的一个特例”的思想理念。在这一思想的指导下,Flink 将最先进的流式处理技术运用到批处理中,使得 Flink 的批处理能力一早就令人印象深刻。特别是在 Flink 1.10 中我们基本完成了从1.9开始的对 Blink planner 的整合工作后,Flink SQL 的批处理能力更上一层楼。 Hive 在大数据生态中已成为标准的数据仓库组件。它不仅仅是一个 SQL 引擎,也是一个数据管理系统。但由于自身的局限,Hive 在当下面临很大的挑战,也无法满足的用户需求。 基于此,我们从 Flink 1.9 推出了 Flink 和 Hive 整合的 beta 版本。在过去几个月中,我们基于用户的反馈,在各个方面都对产品进行了加强。我很高兴的宣布,Flink 和 Hive 的整合在 Flink 1.10 版本中能实现生产可用! 下面来为大家介绍一些细节。 统一的元数据管理 Hive Metastore 已逐渐成为 Hadoop 生态中元数据管理的中枢。很多公司都用 Hive Metastore 管理他们的 Hive 甚至非 Hive 的元数据。 Flink 1.9 中我们推出了 Flink 的 HiveCatalog,将 Flink 对接 Hive Metastore 中丰富的元数据。HiveCatalog 有两层作用。 一是它允许 Flink 用户将 Flink 本身的元数据,包括表、函数等,存储到 Hive Metastore 中。 二是它允许 Flink 使用 Hive Metastore 中已有的 Hive 元数据,使得 Flink 可以读写 Hive 的表。 Flink 1.10 中的新功能是用户可以对接几乎所有版本的 Hive Metastore。这里有一个例子是如何将 Flink 的 Kafka 表元数据存储到 Hive Metastore 中。 代码示例:https://ci.apache.org/projects/flink/flink-docs-release-1.10/dev/table/hive/hive_catalog.html#example 流处理 由于 Hive 自身的缺陷,用户无法获得实时数据导入的能力。但通过与 Flink 的整合,用户可以解锁一些其他很有用的场景,比如: 对 Flink 的实时数据和 Hive 的离线数据做 join 通过 Flink 回填 Hive 的数据 Hive 版本兼容 在 Flink 1.10 中,我们兼容了几乎所有 Hive 1.x, 2.x, 3.x 的版本。 复用 Hive 函数 在 Flink 1.9 中用户已经可以复用 Hive UDF。这对 Hive 用户是极大的利好,因为用户不需要再重新开发函数,省时省力。 Flink 1.10 引入了 module 的概念,并通过 HiveModule 支持了所有 Hive 自带的函数(built-in functions)。Hive 社区在过去很多年积累了数量可观的有用的自带函数,这将方便用户在 Flink 更好地完成他们的工作。 加强读写 Hive 数据 1.10 加强了对 Hive 数据读写的支持。 在读方面,Flink 可以读取 Hive 的分区表和视图(view);同时,我们添加了很多读优化,比如分区裁剪(partition-pruning)和 projection pushdown 来减少从文件系统摄入的数据;对 ORC 文件,我们加入了向量化读取。 在写方面,Flink 引入了“INSERT INTO” 和 “INSERT OVERWRITE” 语法;此外,Flink 可以静态和动态写入 Hive 分区表。 更多的数据类型 1.10 中我们支持了更多的常用 Hive 类型。 后续规划 社区计划在用户反馈的基础上进一步优化两个系统间的整合。一些 1.11 的目标包括: Hive 的 near-real-time streaming sink 原生 Parquet 文件读取 额外的交互性 - 允许用户从 Flink 创建 Hive 的表和函数等 更好地开箱即用性 Hive 语法的支持 数仓正在向更实时化的方向发展,与 Flink 的紧密结合会使这个趋势向前更进一步。 Flink 1.10 中与 Hive 在元数据和数据领域生产级别的结合,都能使用户更好地解决实际问题,为业务带来更多价值。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册