性能提升约 7 倍!Apache Flink 与 Apache Hive 的集成

简介: 随着 Flink 在流式计算的应用场景逐渐成熟和流行,如果 Flink 能同时把批量计算的应用场景处理好,就能减少用户在使用 Flink 时开发和维护的成本,并且能够丰富 Flink 的生态。SQL 是批计算中比较常用的工具,所以 Flink 针对于批计算也以 SQL 为主要接口。

导读:随着 Flink 在流式计算的应用场景逐渐成熟和流行,如果 Flink 能同时把批量计算的应用场景处理好,就能减少用户在使用 Flink 时开发和维护的成本,并且能够丰富 Flink 的生态。SQL 是批计算中比较常用的工具,所以 Flink 针对于批计算也以 SQL 为主要接口。本次分享主要介绍 Flink 对批处理的设计与 Hive 的集成。主要分为下面三点展开:

  1. 设计架构
  2. 项目进展
  3. 性能测试

设计架构

首先和大家分享一下 Flink 批处理的设计架构。

1. 背景

640.jpeg

Flink 提升批处理的主要原因是为了减少客户的维护成本和更新成本和更好的完善 Flink 生态环境。SQL 是批计算场景中一个非常重要的工具,所以希望以 SQL 作为在批计算场景的主要接口,为此我们着重优化了 Flink SQL 的功能。当前 Flink SQL 主要有下面几点需要优化:

  • 需要完整的元数据管理体制。
  • 缺少对 DDL(数据定义语言 DDL 用来创建数据库中的各种对象,如表、视图、索引、同义词、聚簇等)的支持。
  • 与外部系统进行对接不是很方便,尤其是 Hive, 因为 Hive 是大数据领域最早的 SQL 引擎,所以 Hive 的用户基础非常广泛,新的一些 SQL 工具,如 Spark SQL、Impala 都提供了与 Hive 对接的功能,这样用户才能更好地将其应用从 Hive 迁移过来,所以与 Hive 对接对 Flink SQL 而言也十分重要。

2. 目标

640-2.jpeg

所以我们要完成以下目标:

  • 定义统一的 Catalog 接口,这个是 Flink SQL 更方便与外部对接的前提条件。如果大家用过 Flink 的 TableSource 和 TableSink 来对接外部的系统的表,会发现不管是通过写程序还是配置 yaml 文件会跟传统的 SQL 使用方式会有些不同。所以我们肯定不希望 Hive 的用户迁移 Flink SQL 需要通过定义 TableSouces 和 TableSink 的方式来与 Hive 进行交互。因此我们提供了一套新的 Catalog 接口以一种更接近传统 SQL 的方式与 Hive 进行交互。
  • 提供基于内存和可持久化的实现。基于内存就是 Flink 原有的方式,用户所有的元数据的生命周期是跟他的 Session(会话)绑定的,Session(会话)结束之后所有的元数据都没有了。因为要跟 Hive 交互所以肯定还要提供一个持久化的 Catalog。
  • 支持 Hive 的互操作。有了 Catalog 之后用户就可以通过 Catalog 访问 Hive 的元数据,提供 Data Connector 让用户能通过 Flink 读写 Hive 的实际数据,实现 Flink 与 Hive 的交互。
  • 支持 Flink 作为 Hive 的计算引擎(长期目标),像 Hive On Spark,Hive On Tez。

3. 全新设计的 Catalog API(FlIP-30)

640-3.jpeg

用户通过 SQL Client 或者 Table API 提交请求,Flink 会创建 TableEnvironment, TableEnvironment 会创建 CatalogManager 加载并配置 Catalog 实例,并且 Catalog 支持多种元数据类型 table、database、function、view、partition 等,在 1.9.0 的版本当中 Catalog 会有两个实现:

  • 一个是基于内存的 GenericinMemoryCatalog。
  • 另一是 HiveCatalog,HiveCatalog 通过 HiveShim 与 Hive Metasotre 交互来操作 Hive 元数据,HiveShim 的作用是处理 Hive 在大版本中 Hive Metastore 不兼容的问题。

从这种实现的方式可以看出,用户可以创建多个 Catalog,也可以访问多个 Hive Metastore,来达到跨 Catalog 查询的操作。

4. 读写 Hive 数据

640-4.jpeg

有了元数据之后我们就可以实现 Flink SQL 的 Data Connector 来真正的读写 Hive 实际数据。Flink SQL 写入的数据必须要兼容 Hive 的数据格式,也就是 Hive 可以正常读取 Flink 写入的数据,反过来也是一样的。为了实现这一点我们大量复用 Hive 原有的 Input/Output Format、SerDe 等 API,一是为了减少代码冗余,二是尽可能的保持兼容性。

在 Data Connect 中读取 Hive 表数据具体实现类为:HiveTableSource、HiveTableInputFormat。写 Hive 表的具体实现类为:HiveTableSink、HiveTableOutputFormat。

项目进展

其次和大家分享 Flink 1.9.0 的现状和 1.10.0 中的新特性还有未来工作。

1. Flink 1.9.0 的现状

640-5.jpeg

Flink SQL 作为 1.9.0 版本中作为试用功能发布的,它的功能还不是很完善:

  • 支持的数据类型还不全。(1.9.0 中带参数的数据类型基本上都不支持:如 DECIMAL,CHAR 等)
  • 对分区表的支持不完善,只能读取分区表,不能写分区表。
  • 不支持表的 INSERT OVERWRITE。

2. Flink 1.10.0 中的新特性

640-6.jpeg

Flink SQL 在 1.10.0 版本里我们做了比较多的进一步开发,与 Hive 集成的功能更加完整。

  • 支持读写静态分区和动态分区表。
  • 在表级别和分区级别都支持 INSERT OVERWRITE。
  • 支持了更多地数据类型。(除 UNION 类型都支持)
  • 支持更多地 DDL。(CREATE TABLE/DATABASE)
  • 支持在 Flink 中调用 Hive 的内置函数。(Hive 大约 200 多个内置函数)
  • 支持了更多的 Hive 版本。(Hive 的 1.0.0~3.1.1)
  • 做了很多性能优化如,Project/Predicate Pushdown,向量的读取 ORC 数据等。

3. Module 接口

640-7.jpeg

为了能让用户调用 Flink SQL 中调用 Hive 的内置函数,我们在 Flink 1.10 当中引入了一个 Module 接口。这个 Module 是为了让用户能够方便的把外部系统的内置函数接入到系统当中。

  • 使用方式和 Catalog 类似,用户可以通过 Table API 或 Yaml 文件来配置 Module。
  • Module 可以同时加载多个,Flink 解析函数的时候通过 Module 的加载顺序在多个 Module 中查找函数的解析。也就是如果两个 Module 包含名字相同的 Function,先加载的 Module 会提供 Function 的定义。
  • 目前 Module 有两个实现,CoreModule 提供了 Flink 原生的内置函数,HiveModule 提供了 Hive 的内置函数。

4. 未来工作

640-8.jpeg

未来的工作主要是先做功能的补全,其中包括:

  • View 的支持(有可能在 1.11 中完成)。
  • 持续改进 SQL CLI 的易用性,现在支持翻页显示查询结果,后续支持滚动显示。并支持 Hive 的 -e -f 这种非交互式的使用方式。
  • 支持所有的 Hive 常用 DDL,例如 CREATE TABLE AS。
  • 兼容 Hive 的语法,让原来在 Hive 上的工程在 Flink 的顺滑的迁移过来。
  • 支持 SQL CLI 的远程模式,类似 HiveServer2 的远程连接模式。
  • 支持流式的写入 Hive 数据。

性能测试

下面是 Flink 在批处理作业下与 HiveMR 对比测试的测试环境和结果。

1. 测试环境

640-9.jpeg

首先我们的测试环境使用了 21 个节点的物理机群,一个 Master 节点和 20 个 Slave 节点。节点的硬件配置是 32 核,64 个线程,256 内存,网络做了端口聚合,每个机器是 12 块的 HDD 硬盘。

2. 测试工具

640-10.jpeg

测试工具使用了 Hortonworks 的 hive-testbench,github 中一个开源的工具。我们使用这个工具生成了 10TB 的 TPC-DS 测试数据集,然后分别通过 Flink SQL 和 Hive 对该数据集进行 TPC-DS 的测试。

一方面我们对比了 Flink 和 Hive 的性能,另一方面我们验证了 Flink SQL 能够很好的访问 Hive 的数据。测试用到了 Hive 版本是 3.1.1,Flink 用到的是 Master 分支代码。

3. 测试结果

640-11.jpeg

测试结果 Flink SQL 对比 Hive On MapReduce 取得了大约 7 倍的性能提升。这得益于 Flink SQL 所做的一系列优化,比如在调度方面的优化,以及执行计划的优化等。总体来说如果用的是 Hive On MapReduce,迁移到 Flink SQL 会有很大性能的提升。

附最新性能对比详情及思路解析:Flink 1.10 和 Hive 3.0 性能对比

作者介绍:

李锐(天离),阿里巴巴技术专家,Apache Hive PMC 成员,加入阿里巴巴之前曾就职于 Intel、IBM 等公司,主要参与 Hive、HDFS、Spark 等开源项目。

王刚(乔燃),阿里巴巴高级开发工程师, Flink Contributor。浙大计算机系毕业后曾任职于蘑菇街数据平台,从事数据交换系统开发。目前在阿里主要专注在 Flink 与 Hive 生态建设。

相关实践学习
基于Hologres+Flink搭建GitHub实时数据大屏
通过使用Flink、Hologres构建实时数仓,并通过Hologres对接BI分析工具(以DataV为例),实现海量数据实时分析.
实时计算 Flink 实战课程
如何使用实时计算 Flink 搞定数据处理难题?实时计算 Flink 极客训练营产品、技术专家齐上阵,从开源 Flink功能介绍到实时计算 Flink 优势详解,现场实操,5天即可上手! 欢迎开通实时计算 Flink 版: https://cn.aliyun.com/product/bigdata/sc Flink Forward Asia 介绍: Flink Forward 是由 Apache 官方授权,Apache Flink Community China 支持的会议,通过参会不仅可以了解到 Flink 社区的最新动态和发展计划,还可以了解到国内外一线大厂围绕 Flink 生态的生产实践经验,是 Flink 开发者和使用者不可错过的盛会。 去年经过品牌升级后的 Flink Forward Asia 吸引了超过2000人线下参与,一举成为国内最大的 Apache 顶级项目会议。结合2020年的特殊情况,Flink Forward Asia 2020 将在12月26日以线上峰会的形式与大家见面。
相关文章
|
传感器 C语言 智能硬件
基于单片机的温度控制系统
基于单片机的温度控制系统
|
传感器
差动放大器的介绍
一、差动放大器的原理 差动放大器是通过两个输入信号的差值来放大信号的一种电路。它由两个输入端口和一个输出端口组成,输入端口分别连接两个输入信号,输出端口连接放大后的信号。差动放大器的原理基于差动放大模式,即将两个输入信号分别连接到两个晶体管的基极端口,通过晶体管的放大作用将差值放大后输出。 差动放大器的工作原理是利用两个晶体管的共射放大作用,通过对输入信号进行差分放大,将差值放大后输出。其中一个晶体管的基极连接到输入信号,另一个晶体管的基极连接到输入信号的反相信号。通过对两个晶体管的控制,可以实现对输入信号的放大和输出。 二、差动放大器的工作方式 差动放大器的工作方式主要包括共模模式和差模
1010 0
|
6月前
|
人工智能 运维 Ubuntu
阿里云轻量服务器系统镜像 vs 应用镜像有什么区别?90%的人都选错!
阿里云轻量服务器中,系统镜像为纯净OS(如Ubuntu、Windows),需手动部署环境;应用镜像则预装WordPress、宝塔等完整应用及依赖,开箱即用。新手选应用镜像,定制需求选系统镜像。
821 6
|
搜索推荐 API 开发者
Django框架和Flask框架的适用场景分别是什么?
总体而言,Django 更适合需要全面功能和大规模开发的场景,而 Flask 则更适合灵活性要求高、小型项目或特定需求的开发。当然,具体的选择还应根据项目的具体情况、团队的技术能力和偏好等因素来综合考虑。在实际应用中,开发者可以根据项目的特点和需求,灵活选择使用这两个框架,或者结合它们的优势来构建更强大的 Web 应用程序。
1000 163
|
Java Apache
超实用!教你如何在POI-TL框架中熟练使用Configure类,快速完成Office文档生成!
POI-TL是一个用于生成Office文档的Java库,Configure类是该库中的一个配置类,其作用是提供了一些全局的配置选项,可以用于定制化生成的文档。
1125 0
|
消息中间件 缓存 监控
小记 | 一周上线百万级高并发系统
本文是鱼皮在腾讯实习期间,从零开始一周紧急上线百万高并发系统的相关经验、思路及感悟,分享给大家。花 5 分钟阅读本文,你将收获:1. 加深对实际工作环境、工作状态的了解2. 学习高并发系...
1094 0
|
Rust 并行计算 安全
揭秘Rust并发奇技!线程与消息传递背后的秘密,让程序性能飙升的终极奥义!
【8月更文挑战第31天】Rust 以其安全性和高性能著称,其并发模型在现代软件开发中至关重要。通过 `std::thread` 模块,Rust 支持高效的线程管理和数据共享,同时确保内存和线程安全。本文探讨 Rust 的线程与消息传递机制,并通过示例代码展示其应用。例如,使用 `Mutex` 实现线程同步,通过通道(channel)实现线程间安全通信。Rust 的并发模型结合了线程和消息传递的优势,确保了高效且安全的并行执行,适用于高性能和高并发场景。
604 0
|
人工智能 算法 API
百川智能发布角色大模型 ,零代码复刻角色轻松满足游戏领域定制需求
百川智能于2024年1月9日推出Baichuan-NPC角色大模型,优化了角色知识和对话能力,提升游戏AI角色的真实感。同时,公司发布了零代码角色创建平台,允许游戏厂商通过简单描述快速定制角色,降低开发成本和提高效率。Baichuan-NPC通过大量针对性训练,解决了角色扮演的“非拟人化”问题,增强了角色一致性。此外,百川智能的角色创建平台结合搜索增强知识库,提供高自由度的角色定制,支持实时调优和一键代码复制,简化了开发流程,已获得创梦天地、完美世界游戏等合作伙伴的认可。
547 2
百川智能发布角色大模型 ,零代码复刻角色轻松满足游戏领域定制需求
|
定位技术
ArcGIS中ArcMap创建渔网Create Fishnet:生成指定大小的格网矢量文件
ArcGIS中ArcMap创建渔网Create Fishnet:生成指定大小的格网矢量文件
1422 1
|
Web App开发 JavaScript 测试技术
python自动化测试实战 —— WebDriver API的使用
python自动化测试实战 —— WebDriver API的使用
470 1

相关产品

  • 实时计算 Flink版