Hive SQL on Flink 构建流批一体引擎

news2024/11/15 7:02:37

摘要:本文整理自阿里巴巴开发工程师罗宇侠、阿里巴巴开发工程师方盛凯,在 Flink Forward Asia 2022 流批一体专场的分享。本篇内容主要分为五个部分:

    1. 构建流批一体引擎的挑战

    2. Hive SQL on Flink

    3. 流批一体引擎的收益

    4. Demo

    5. 未来展望

Tips:点击「阅读原文」查看原文视频&演讲 ppt


01

构建流批一体引擎的挑战

6d23119316702b2c32c048525fc20339.jpeg

目前,流和批仍然是相对割裂的。虽然我们在应用层统一了,但从接入层开始,不同的引擎依旧有不同的接入层、API 层、执行层。我们认为,统一的流批一体引擎应该是从接入层开始使用 SQL Gateway 作为接入层。在 API 层使用 Flink SQL 作为编写作业的主要语言,在执行层替换成统一的 Runtime。

bb1ca4e4727d05fb4e5d0d59ed85aa21.jpeg

为了达成统一的流体引擎,我们认为有以下两个难点:

  • 应用层的对接。在流批割裂的环境下,应用层仍然是有不同的提交平台,如何保证原来的应用层能无损且直接地对接到新的 SQL Gateway 上,是一个巨大的难点。

  • 用户作业迁移的成本。用户原来的 Batch 作业是用 Hive SQL 进行撰写的,现在则需要替换成 Flink SQL。为了保证用户的作业能无损迁上来,我们需要解决语言上的兼容和用户所用的 UDF 的兼容。

ed4497ffc4eadb523a2ba7fb0a17b24d.jpeg

为此我们围绕以下两点在 Flink 1.16 上做了大量改进,保证了 Hive SQL on Flink 构建流批一体引擎是可行的。

  • Flink 对 Hive SQL 的兼容,我们在 1.16 中大大提升了对 Hive SQL 本身的兼容性。

  • 我们在 Flink 社区引入了 SQL Gateway,从而兼容 Hive 的生态。

02

Hive SQL on Flink

接下来我来讲一下 Flink 社区具体做的一些工作来使得基于 Hive SQL on Flink 构建流批一体引擎成为可能。

在这一方面,Flink 社区经过多个版本的打磨,做了大量的工作使得基于 Hive SQL on Flink 构建流批一体引擎能够在生产中可用。

2.1 Hive SQL on Flink 的具体工作

5d0986e098af04c0c3753da4102195ff.jpeg

第一,集成 Hive MetaStore。众所周知,在大数据领域,Hive MetaStore 已经是事实的元数据管理标准了,所以 Flink 在很早的版本就已经开始集成 Hive MetaStore。主要分为以下三方面的支持:

  • 支持 Hive MetaStore 作为 Flink 的 Catalog,Hive 已有的表可自动注册进 Flink 中,用户无需再定义各种 DDL 来映射底层的 Hive 表。

  • 支持 Hive MetaStore 存储 Flink 定义的 Hive 表/ 非 Hive 表。

  • 支持从 Hive MetaStore 获得表的统计信息,从而优化查询的执行计划,提升端到端 SQL 的性能。

第二,集成 Hive 的 UDF。主要支持以下两方面:

  • Hive 提供了非常丰富的 UDF,在 Flink 中我们可以直接调用 Hive 中内置的 UDF。换句话说,用户使用 Flink 就能享受到 Hive 那套内置 UDF 所带来的方便及易用性。

  • 支持调用自定义的 Hive UDF。对于熟悉 Hive 的人,他们会基于 Hive UDF 的接口去定义自己的 UDF。但如果他们想用 Flink,又不想废弃那些 UDF,更不想重写。要怎么办呢?其实 Flink 支持调用用户自定义的 Hive UDF,所以用户不需要对 UDF 做任何重写的工作,这极大的方便了用户的操作。

c1b3891c6536466912ee5a942414c1dc.jpeg

第三,Hive 表的读写。主要支持以下几方面:

  • 支持流读/批读/流写/批写 Hive 表。

  • 批读 Hive 表支持静态分区裁剪和动态分区裁剪。可以大幅削减读取数据的规模,从而提升读的性能和效率。

  • 批读 Hive 表支持并发推断。在批场景下,并发设置是一个比较难的问题,但如果在批读 Hive 场景下,我们可以通过 Hive 表的文件信息推断出合理的并发,从而提升端到端链路的性能。

  • 批写/流写 Hive 支持自定义分区提交策略。在批调度链路里,我们可能会把先提交分区,然后触发一些其他下游的操作或调度,这时我们无需引入其他额外的组件,直接在 Flink 里自定义这些分区提交的策略即可。比如指定分区提交后,触发定时任务或者在消息队列插一条数据等等。

  • 流写 Hive 表支持小文件自动合并。在流的场景下,会生成很多小文件,但在流写 Hive 表时,我们支持小文件的自动合并,通过将小文件合并成更大的文件,减少了小文件的数量,从而缓解 HDFS 集群的压力。

  • 批写 Hive 表支持自动收集统计信息,这一部分完全兼容了 Hive 的行为。在使用 Hive 写 Hive 表的时候,它会收集统计信息并提交到 MetaStore。我们用 Flink 写 Hive 表的时候,也能支持将统计信息提交到 MetaStore,包括文件的大小、数据的条数等等。

2.2 Flink 兼容 Hive SQL 的架构

f8ab26616c136ed10b86d7d375e91361.jpeg

用户的 Hive SQL 如何在 Flink 中顺滑地运行?上图是 Flink 兼容 Hive SQL 的架构,可以看到,它被分成了两个不同的分支,Flink SQL 和 Hive SQL。然后它们会由不同的 Parser 去做解析,Flink SQL 通过 Flink Parser 做解析,Hive SQL 通过 Hive Parser 做解析,Hive Parser 的行为和 Hive 的行为保持一致。

接下来它们都会生成 Flink 里的 Logical Plan,Logical Plan 进行优化,生成 Physical Plan,Physical Plan 再进行翻译,生成具体的 Job Graph,最后交由 Flink Runtime 执行。

基于这套架构,我们可以很方便地扩展 Flink 来提供对其他语法的支持。另外通过这套架构,我们理论上还能达到对 Hive 语法的百分之百兼容。

2.3 Flink 对 Hive SQL 的兼容

4d70c8d4cd0e19985319848f86015ff3.jpeg

接下来讲一下我们最后达到了怎样的效果。

第一,支持生产上常用的 Hive 语法。即生产上的作业能够很好地迁移到我们的 Flink 中执行。主要支持以下语法:

  • 支持 distribute by/sort by/ cluster by。

  • 支持 multi insert。一个 scan 可以插入到多个不同数据的 sink 端,极大的提高了数据 ETL 链路的效率。

  • 支持 insert directory。

  • 支持 load data。

  • 支持 create function using jar。

  • ……

那么我们到底对 Hive SQL 的兼容度能达到多少呢?答案是 94%了。这个数字又是怎么得出来的呢?

  • 基于 Hive 2.3 的 qtest 测试集,12000 条 DQL/DML 都扔到 Flink 去执行,这些 SQL 都能够被正常执行。

  • 12000 条 DQL/DML 也包含了很多对 ACID 表的查询。Hive 的 ACID 表在生产中用的较少,如果我们除去针对 ACID 表的 DQL/DML,兼容度可达 97%。

2.4 Flink 对 Hive 生态的兼容

98bc9b9d9474f82bfbf489f4420128f9.jpeg

如上图所示,之前的内容讲的是 API 层、执行层已经统一了。那么我们如何在接入层也把它统一掉呢?就引出我们接下来要分享的 Flink SQL Gateway 了。

2.5 引入 Flink SQL Gateway 的原因

f649ec09d88820c660efcaa945412736.jpeg

我们为什么引入 Flink SQL Gateway 呢?原因有以下三个:

  • 目前 Flink 社区官方提供了 SQL Client 供用户提交 SQL 作业。但由于 SQL Client 本身没有服务化,用户往往需要基于 SQL Client 做一层封装,添加一个服务化的前端。通过该服务化的前端,用户的 SQL 作业最终会被提交给 SQL Client 去执行。以上的过程比较繁琐而且开发成本较大,因此,我们在社区提供了一个默认的服务化的实现,降低用户的使用成本。

  • 以上的方案是基于 SQL Client 来做的作业提交,但这套 API 并不稳定。而引入的 SQL Gateway 则提供了稳定的 API。

  • 相比于 SQL Client, SQL Gateway 是 C/S 架构,更容易对接诸多生态 ,e.g. HiveServer2。

基于以上的考量,Flink 社区引入了 Flink SQL Gateway。它有以下特点:

  • 开箱即用,用户可以直接使用 SQL Gateway 搭建一个生产可用的提交工具。

  • 生态对接,提供了稳定的 API,方便 Flink 对接其它生态工具。

  • 兼容 HiveServer2 协议,提供了 HiveServer2 Endpoint 以兼容 Hive 生态。

2.6 Flink SQL Gateway 架构

2eaca81e30f41b2c017099b9f45e2d76.jpeg

上图是 Flink SQL Gateway 的架构图,可以分成前端和后端。

后端提供了多租户能力,可以对接不同的集群,包括 Flink Standalone,Flink On Yarn 等。另外,它支持用户自定义的 Catalog,可以用默认的 Catalog,也可以用 MySQL Catalog、Hive Catalog。

SQL Gateway 目前提供了两个 Endpoint,分别是 REST Endpoint 和 HiveServer2 Endpoint。

  • REST Endpoint:用户可以通过 REST 工具提交作业。

  • HiveServer2 Endpoint:通过它我们就能提供对接 Hive 主流生态的能力。

从上图左侧可以看到目前一些 Hive 的生态工具,包括 Beeline、DBeaver、DolphinScheduler、Superset、Apache Zeppelin 等,都能很好的对接到 Flink SQL Gateway 上。

2.7 HiveServer2 Endpoint

796802b04e6984eaa2de5930e34d2ab7.jpeg

上面提到 HiveServer2 Endpoint 在兼容 Hive 生态的重要性,接下来让我们一起来看一下它的具体架构。从上图可以看到主要分为两层,Client 端和 Server 端。HiveServer2 实际上是定义了 Client 端和 Server 端的一套通信协议,如果要兼容 HiveServer2,我们只要实现 HiveServer2 定义的这套协议即可。通过兼容 HiveServer2 协议,我们可以在不修改 Client 的情况下,将请求调用都转发到 Flink SQL Gateway,并在 Flink 集群执行。

139fbfc14950c7559cffa796e747e9b9.jpeg

上图呈现的是 HiveServer2 和 HiveServer2 Endpoint 的对应关系。

HiveServer2 提供了直连 MetaStore 的能力,可以使用 Hive SQL,底层是批处理引擎,包括 MapReduce 或者 Spark 等。

HiveServer2 Endpoint 内置了 Hive Catalog,其实就是 Hive MetaStore。同时它也使用 Hive 语法,底层也是批处理引擎,即 Flink Batch 引擎。

4ff794b508d9b65935313406d0d41b50.jpeg

讲了这么多关于 Hive 兼容的内容,最后我们能达到什么样的效果呢?

上面的图我们从上往下看。通常,用户的 SQL 脚本通过 Apache Zeppelin、Beeline 等客户端提交作业,然后通过 Hive 的 JDBC 提交到 HiveServer2 中,再交由底下具体的引擎来执行。

基于上述介绍的 Flink 对兼容 Hive 所做的工作,我们只需要将引擎层改成 Flink 将可以作业直接迁移到 Flink 上,从而达到了一个非常平滑且无缝迁移的过程。

03

流批一体引擎的收益

3.1 Hive SQL on Flink 构建流批一体引擎

5bbf4806125956c4bcdcdaa3844d613b.jpeg

基于 Hive SQL on Flink 构建了流批一体引擎,我们获得了以下收益:

  • 第一,统一流批引擎。降低维护成本,提升研发的效率。因为我们现在就一套引擎了,所以维护成本会非常低。

  • 第二,流批一体数仓。我们通过流批一体引擎构建出了流批一体 SQL 层。借此,我们可以把流批一体的存储考虑进来,构建完整的流批一体数仓架构。

  • 第三,Hive SQL 实时化。目前 Hive SQL 主要还是跑在批引擎上,每天做一次调度,产生结果。如果把 Hive SQL 迁移到 Flink 中,我们就可以很方便的将它实时化改造。只要把引擎模式设置成流模式,就可以将其实时化,数仓实时化改造的成本非常低。

  • 第四,OLAP & 联邦查询。我们可以基于 Flink + Hive SQL 搭建 OLAP 系统。借助 Flink 对各种数据源的支持,以及对 Hive SQL 稍微进行扩展就可以实现联邦查询。

3.2 基于 Hive 语法进行联邦查询

04f82ab357a80253717ff2791093b141.jpeg

联邦查询是指,查不同数据源的数据,再写到不同的数据存储中。Hive 本身虽然通过 storage handler 提供了查询不同数据源的数据,比如 MySQL、Hbase 等,但相对来说还是比较复杂和不太完善。所以 Flink 就对 Hive 语法进行了扩展,使其它可以很方便的进行联邦查询。

首先我们看一下上图中间这条非常典型的 Hive SQL,它将几个表 join 一下,distribute by 再写到下游。注意看一下红色字,就是需要我们额外改造的内容,改造的成本非常低,只要在 Table 前面加上 Catalog 的那么就能读到不同 Catalog 的数据。比如说我们注册一个 PG Catalog,直接把 PG Catalog 的名字加到这个表的前面,我们就能读到 PG Catalog 的数据。

基于这样一层改造和扩展,我们就能使用 Hive 语法查到不同数据源的数据,再写到不同的数据存储。

04

Demo

14f85d7eab7bf23903a16165fc7fbbfe.jpeg

在传统的 Lambda 架构中,我们往往会有两条不同的 pipeline:

  • 实时的 pipeline,我们往往通过 Flink 将 Kafka 的数据进行打宽聚合写入下游,并通过 Flink 写入 HDFS 的最终表。

  • 离线的 pipeline,我们则可以通过周期性地调度 Flink 作业将数据写入到 HDFS 中。为了保持数据的正确性,在 Lambda 架构之中往往通过将批的结果回刷到 HDFS 中,保证数据的正确性。

当批作业回刷结束后,用户可以通过应用层分析最终表的结果,进行实时大屏地展示,做相关的数据应用以及分析数据之中潜在的趋势。

今天,我们则聚焦在数据回刷这一层,演示如何通过 Hive on Flink 构建流批一体引擎。

d24801e67f82837be97f314c0f488720.jpeg

我们在 Kafka 中提前灌注了一些实时订单表,在 HDFS 中灌注了之前已经有的一些历史订单表。

实时链路中,我们通过 Window 语义,按天级别将统计信息直接灌入 HDFS 中,实时地获取当前的销售量。而离线链路中,我们则通过 agg 语法可以在第二天凌晨汇总当天的订单信息。通过数据回刷,我们就可以得到统一的每日销售额统计。

4836064d61cebdb76c60734bafc641a0.jpeg

下面用 Zeppelin 演示 Hive SQL on Flink 构建流批一体数仓的 Demo。

demo 演示:

05

未来展望

0dda6d853379b38609f9d13fa48bfc4e.jpeg

以下是我们未来的一些规划:

在流批一体方面,虽然我们在这个版本已经做了极大的努力,但存储层仍然是不统一。比如在流上我们依旧使用 Kafka 作为中间结果的存放,在批上我们更倾向于使用 HDFS,因此存储层统一也是至关重要的。另外,Batch 的用户现在更倾向使用 Hive SQL 写作业,但我们更希望他们能将 Batch 作业全部迁移至 Flink Batch SQL 中来。所以,未来我们将不断提升 Batch SQL 的功能性。

在 Hive 的集成方面,主要分为以下 3 点:

  • 优化读各种格式的文件,包括对读 Parquet 文件的嵌套列 PushDown、FilterPushDown 的优化等,从而提升性能。

  • 提升写 Hive 端到端的生产可用性。比如,批模式下解决小文件多的问题。

  • 根据用户的反馈不断加强 Hive 的语法支持。

在 Flink SQL Gateway 方面,它依旧处于起步的状态。我们将从以下三个方面来完善它:

  • SQL Client 支持向 SQL Gateway 提交 SQL,保证功能完整性。

  • 补全认证功能,保证 SQL Gateway 基本生产可用。

  • 基于 SQL Gateway 对接更多生态工具,增强 SQL Gateway 的应用范围。

往期精选

289a31d1ce560bfb01c82116cd5d05ae.png

▼ 精彩直播回顾 ▼

2f86448175980b0750e0ff5ac30e1e32.png


▼ 登录「Flink-learning 学训平台」,加入学习 ▼

9e7d628b6df96a0d0aa6f3940d004c05.png

▼ 关注「Apache Flink」,获取更多技术干货 ▼

5ed889371f1206b2e545e07419972843.png

 fb911b2d36c165434c4c752db7addd69.gif  点击「阅读原文,查看原文视频&演讲 ppt

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/494564.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

做到“有效沟通”,帮你达到这3个目的

在项目管理中,团队沟通是至关重要的。团队成员之间应该建立良好的沟通机制,及时沟通和协调问题,避免出现问题后甩锅的情况。 在实际项目中,很多问题出现的原因是团队沟通不畅,项目经理需要加强团队沟通的重要性&…

K8S二进制安装报错及各个组件功能介绍

目录 一、K8S安装二、安装时遇到的几个问题2.1、Unable to connect to the server: x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "kuberne…

C语言复习笔记2

1.变量命名只能以数字、字母、下划线组成并且不能以数字开头。 #include<stdio.h> #include<unistd.h>//变量名只能由数字字母下划线组成&#xff0c;不能以数字开头 int main() {//int 2b;return 0; }2.内存中保存的是补码 0的补码取反得补码再求源码是-1。 源码…

提升论文影响力的方法

论文发表后&#xff0c;还有一些重要的工作去做&#xff0c;那就是去积极宣传和推广自己的论文&#xff0c;提高自己论文的影响力。这类似于一个电影上映后&#xff0c;主演们还得去做宣传一样&#xff0c;要想办法推销自己的作品。本文将介绍提升论文影响力的方法。 1. 开源数…

xray简单使用指南

前言收到需求如下 用户还需要一个报告 询问了群里的小伙伴推荐使用xray进行扫描 一、下载 https://github.com/chaitin/xray/releases windows下载amd64即可 解压后进入其目录下执行exe程序&#xff0c;帮我们生成一些yaml文件 生成 ca 证书 .\xray_windows_amd64.exe g…

创客匠人:五月,爱成长的力量,有爱必赢

2023年5月4日&#xff0c;创客匠人第六十九届铁军训练营在厦门举办&#xff0c;由创客匠人CEO蒋洪波、CSO张潇峰及HRM何巧婷为厦门总部的伙伴们带来精彩的回顾总结及主题分享。 一、四月总结 为了明确前进奋斗的方向&#xff0c;进一步提升团队战斗力&#xff0c;从而更好地帮助…

Altium Designer中如何在顶层中添加对应端口

转载说明&#xff1a; 大众深度科普 https://jingyan.baidu.com/article/c33e3f4889f327ea15cbb584.html 版权归原作者所有&#xff1b;感谢原作者的分享&#xff1b; 转载到此&#xff0c;主要为了后期查看方便&#xff1b; 本经验简要介绍Altium Designer中如何在顶层中添…

SpringBoot【开发实用篇】---- 热部署

SpringBoot【开发实用篇】---- 热部署 1. 手动启动热部署2. 自动启动热部署3. 参与热部署监控的文件范围配置4. 关闭热部署 什么是热部署&#xff1f;简单说就是你程序改了&#xff0c;现在要重新启动服务器&#xff0c;嫌麻烦&#xff1f;不用重启&#xff0c;服务器会自己悄悄…

人类创新发展的四个阶段:三个核心和一个扩展

纵观人类的发展史&#xff0c;始终伴随着人类的创新过程&#xff0c;这也是人类与其他生物体的最大的区别&#xff0c;别的生物体也就是可以使用工具或者模仿别的生物的动作来制造简单的工具&#xff0c;对工具进行简单的拼接&#xff0c;只有人类是可以进行真正的创造出这个自…

记录-Symbol学习笔记

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 Symbol是JavaScript中的原始数据类型之一&#xff0c;它表示一个唯一的、不可变的值&#xff0c;通常用作对象属性的键值。由于Symbol值是唯一的&#xff0c;因此可以防止对象属性被意外地覆盖或修改。…

Word下划线怎么打?速速get这5个实用方法!

案例&#xff1a;Word下划线怎么打&#xff1f; 【朋友们&#xff0c;最近在写毕业论文&#xff0c;封面文字的下划线打了好久都打不出来&#xff0c;请问大家Word下划线是怎么打的呀&#xff1f;】 在Microsoft Word中&#xff0c;打下划线是一种常见的操作&#xff0c;它可…

Python小姿势 - ## Python与数据库

Python与数据库 简介 当今&#xff0c;数据库是计算机应用中最重要的部分。几乎所有的大型应用都要用到数据库&#xff0c;比如银行、电商、航空、政府、医疗、教育、科研等。数据库的目的是存储数据&#xff0c;并且能够根据用户的需求提供数据。 数据库管理系统&#xff08;D…

QQ音乐银河音效技术实践——音乐重放效果的补偿与修饰

音效渲染是音频或音乐播放器最为重要的后处理模块之一。LiveVideoStackCon 2022 北京站邀请到腾讯音乐银河音效开发负责人——闫震海&#xff0c;为大家介绍银河音效在QQ音乐播放器中的创新应用&#xff0c;包括空间环绕效果和音效制作工具等内容。 文/闫震海 编辑/LiveVideoSt…

取代你的可能不是AI,而是比你更会使用AI的人

1、背景 从开始了解AI到现在已经1个月了&#xff0c;最明显的就是&#xff0c;产品层出不穷&#xff0c;以前只有技术人员才关系AI&#xff0c;现在各行各业都在关系AI&#xff0c;都希望通过它提高生产力和创造力&#xff1b; 在当今大数据和人工智能时代&#xff0c;职场和企…

MySQL基础(一)数据库概述

1. 为什么要使用数据库 持久化(persistence)&#xff1a;把数据保存到可掉电式存储设备中以供之后使用。大多数情况下&#xff0c;特别是企业级应用&#xff0c;数据持久化意味着将内存中的数据保存到硬盘上加以”固化”&#xff0c;而持久化的实现过程大多通过各种关系数据库…

Linux网络基础-2

在之前的网络基础博客中&#xff0c;我们对网络的基本概念进行了一个简单的介绍&#xff0c;那么接下来的网络内容中&#xff0c;我们将对网络通信中的典型协议进行详细解释。 我们根据网络协议中的分层来对典型协议进行注意介绍&#xff0c;不过对于物理层的传输我们不做考究…

docker安装mongodb出现bash: mongo: command not found

安装MongoDB容器 -e MONGO_INITDB_ROOT_USERNAME创建管理员账号 -e MONGO_INITDB_ROOT_PASSWORD123456创建密码 映射容器服务的 27017 端口到宿主机的 27017 端口 docker run -d -p 27017:27017 --name mongodb -e MONGO_INITDB_ROOT_USERNAMEadmin -e MONGO_INITDB_ROOT_PAS…

简单分享微信里怎么添加投票活动

今天小编要分享是投票活动&#xff0c;怎么做投票活动&#xff0c;首先要做投票活动是需要用到第三方平台&#xff0c;这样我们才可以快速的制作出投票活动链接&#xff0c;其次我们是在微信小程序上添加投票活动的话&#xff0c;我们需要有微信小程序平台&#xff0c;然后把二…

数字信号处理2:频率

频率这个东西&#xff0c;说实话&#xff0c;我记得好像是初中还是小学的时候&#xff0c;刚接触三角函数的时候老师就已经开始给我们教频率了&#xff0c;但是&#xff0c;因为一直没有碰过信号&#xff0c;所以对频率也就没怎么关注过。 频率就是周期的倒数&#xff0c;这是…

Centos7 DolphinScheduler集群部署

DolphinScheduler集群部署 1 DolphinScheduler集群部署1.1 DolphinScheduler简介1.2 集群规划1.3 前置准备工作1.4 DolphinScheduler集群部署1.4.1 解压DolphinScheduler安装包1.4.2 创建元数据库及用户1.4.3 配置一键部署脚本1.4.4 初始化数据库1.4.5 配置部署用户免密及权限1…