大数据架构面试指南
一、项目经验介绍
面试官:简单的做个自我介绍吧
面试官您好!我叫 xxx,xxxx 年 x 月毕业于 xxx 学校,xx 学历,目前就职于 xxx 公司 xxx 部门,职位为大数据开发工程师。主要从事 Flink、Hadoop 等组件及平台的开发工作。
工作以来,我先后参与了 xxx 项目、xxx 项目以及 xxx 项目,积累了丰富的项目经验,这些项目均获得了团队和领导的高度评价。
我对 Flink 组件有着浓厚的兴趣,工作之余经常钻研技术,例如 Flink 四大基石、Flink 内核应用提交流程、Flink 调度策略等。
入职 x 年,曾荣获优秀员工称号。以上是我的自我介绍,请面试官提问。
面试官:介绍一下你最拿手的项目
好的,那我重点介绍一下流计算平台。该平台对标阿里云的实时计算 Flink,是一个一站式、高性能的大数据计算与分析平台。底层基于 Flink 实现,平台提供多种核心功能,支持多种 Source、Sink 插件,内置统一的元数据管理,支持一键提交、应用管理、断点调试、监控告警、Ranger 鉴权等多个核心模块。
我主要负责对该平台的 Flink 版本升级(从原先的 Flink 1.11.0 升级到 1.14.0),同时对平台进行架构重构及代码优化,并参与核心模块应用管理、Ranger 鉴权模块的开发工作。
主要解决了多部门提交 Flink 任务需要大量开关配置问题,版本升级后的 SQL 语法校验、应用提交报错问题,以及 Ranger 鉴权问题。
二、Flink 核心机制
1. Ranger 鉴权机制
面试官:ranger 鉴权能介绍一下吗?是对哪方面进行鉴权?
Ranger 鉴权主要是对表级别的读写权限进行控制。
通过 Flink SQL 调用 parser 解析后获得 operation,然后判断 operation 的表类型是 DDL、DML 还是 DQL 的哪种。通过自研的 flink-ranger 插件获取 operation,从 operation 提取关键信息,组成 ranger 格式的约定进行鉴权。如果鉴权成功,就根据 Flink 原生的执行逻辑继续往下执行;反之报出鉴权异常。
面试官:为什么要用 Flink SQL 鉴权,而不用 Hive SQL 鉴权或者 HDFS 本身的鉴权?
首先该流计算平台底层基于 Flink 实现。在鉴权方面,由于编写的 SQL 在提交过程中需要走 Flink SQL 提交流程,所以在鉴权时直接通过 SQL 解析,校验拿到对应的 operation 类型。同时为了和流计算平台更适配,满足更多业务场景需求,才最终选用 Flink SQL 鉴权。其实用 Hive SQL 也是可以鉴权的,但在流式场景下 Flink SQL 解析更为直接高效。
2. Flink SQL 解析流程
面试官:Flink SQL operation 之前的解析流程清楚吗?可以详细介绍一下
Flink SQL 调用 parser() 方法,将 sqlText 转为 Flink 内部的 operation。在这其中主要经历了 4 大步骤:
- parse() 方法:将 SQL 转为未经校验的 AST 抽象语法树(sqlNode)。在解析阶段主要用到词法解析和语法解析。词法解析将 SQL 语句转为一组 token,语法解析对 token 进行递归下降语法分析。
- validate() 方法:将 AST 抽象语法树转为经过校验的抽象语法树(SqlNode)。在校验阶段主要校验两部分:
- 校验表名、字段名、函数名是否正确。
- 校验特殊的类型是否正确,如 join 操作、groupby 是否有嵌套等。
- rel() 方法:将抽象语法树 SqlNode 转为关系代数树 RelNode(关系表达式)和 RexNode(行表达式)。在这个步骤中,DDL 不执行 rel 方法,因为 DDL 实际是对元数据的修改,不涉及复杂查询。
- convert() 方法:将 RelNode 转为 operation。operation 包含多种类型,但最终都会生成根节点 ModifyOperation。
面试官:那在 operation 之后又做了哪些操作?
在 Flink 内部的 operation 之后,会调用 translate 方法将 operation 转为 transformation。在这中间也经历了四大步骤:
- translateToRel() 方法:先将 ModifyOperation 转换成 Calcite RelNode 逻辑计划树,再对应转换成 FlinkLogicalRel(RelNode 逻辑计划树)。


