黄权隆-Cloudera-StaffSoftwareEngineer Impala与数据湖 Iceberg相关优化 Codegen优化 未来展望 数据湖概览 Impala简介 •SQL查询引擎,面向交互式查询场景•数据/元数据都在外部存储上,无状态•MPP架构,内存计算,C++内核 •OpenStorage•HDFS、Ozone、Kudu、S3、ADLS、HBase等 •OpenFileFormat•Parquet、ORC、Avro、Text等 •OpenTableFormat•Iceberg、Hudi、HiveACID等 •企业级的Security集成•授权、鉴权、血缘、审计、脱敏等都有集成•如Kerberos、LDAP、JWT、SSL、Ranger、Atlas集成等 •企业级应用广泛•>1400个客户,>97000台机器•单集群规模>500节点 Impala架构 •Coordinator处理查询请求,可有多个 ImpalaWebUI–Queries页面 •所有查询都能查看,包括正在运行或失败的查询,以及DDL/DML等 ImpalaWebUI–QueryPlan可视化 •图形化的queryplan,开源版本即可拥有 ImpalaWebUI–QueryTimeline Impala发布历史 •4.3.0:计划中•4.2.0:2022-12-08•4.1.0: 2022-06-01•4.0.0: 2021-07-12•3.4.0: 2020-04-24•3.3.0: 2019-08-22•3.2.0: 2019-03-28(CDH6.3版本)•3.1.0: 2018-12-06•3.0.1: 2018-10-24•3.0.0: 2018-05-07•2.12.0: 2018-04-24(CDH5.16版本)•2.11.0: 2017-12-28 Benckmark测试建议使用新版本 数据湖查询引擎的挑战–开放性(Openness) •对数据的假设/管控有限 •数据源、数据导入方式、文件格式、表格式多样•存算分离,支持开放存储 •数据湖/湖仓优化vs.传统数仓优化•数据预排序 •需要数据生产者支持•若保证有序,简单的min()/max()查询可只读首/末行,可实现直接merge-join等优化•不保证有序,只能基于文件min-max索引做谓词下推,数据有序时,min-max索引更有效•字典编码、索引等 •难以自定义文件格式 •数据位置不可控,难以做colocated优化等 数据湖查询引擎可做的优化 •为支持开放性、存算分离等,不能对数据做过多假设,但仍有许多优化点可做: •查询计划层 •谓词推导/下推、常量传播、Join顺序、子查询改写等•结合执行层:Pre-aggregation、RuntimeFilter、BroadcastvsPartitioned(Shuffle) •执行层 •JITCodegen、向量化、SIMD、Prefetch、并行优化、延迟物化、内存计算、自适应执行等•内存管理、Spilltodisk •IO层•本地短路读、列存优化、压缩、编码(Encoding)、异步IO Iceberg–OpenTableFormat •用文件保存元数据•如何分区•每个分区有哪些数据文件等•不再需要file-listing•表结构/分区定义/修改更灵活•方便实现snapshot、回滚等功能•使用外部系统来保证事务•如HDFS上的rename•HMS上的元数据变更等 ImpalaonIceberg功能集 •支持HadoopTables、HadoopCatalog和HiveCatalog•读写IcebergV1表•读IcebergV2表(仅支持positiondelete)•snapshot操作:show、expire、rollback•查询历史版本(timetravel)•partition变更•…… https://impala.apache.org/docs/build/html/topics/impala_iceberg.html IcebergV2 •merge-on-read •两种deletefiles•Position delete files•记录文件URIs +行号•Equality delete files•记录已删除行的某些列的值•实际应用不多 •Iceberg library可返回哪些deletefile对应哪些data file Impala读IcebergV2的实现 •可选方案 •IcebergJavaReader•IcebergScanner(C++)•AntiJoin •AntiJoin •与HiveACID支持方案类似 ImpalaonIcebergV2读实现优化 •区分datafiles,没有对应deletefiles的可以直接读取,绕过AntiJoin•使用Unionall连接结果 ImpalaonIcebergV2读实现优化(开发中) •AntiHashJoin需要为每行计算hash值•替换为Iceberg特定的operator•使用特定的lookup table:•File → sorted positions•只索引在prodeside要读的datafile对应的deletefile•每个row batch仅需一次lookup,然后类似mergejoin处理deletepositions•注:rowbatch里各行天然按position排序 count(*)优化 •使用snapshot的统计信息优化简单的count(*) •SELECTcount(*)FROMice_tblàSELECT1000 •SELECTcount(*),min(a),max(b)FROMice_tblàSELECT1000,min(a),max(b)FROMice_tbl •仅对v1和没有deletefile的v2表有效 count(*)优化–IcebergV2 •IcebergV2表包含deletefile,是否能简单减去deletefile行数? •Deletefile可能有内容重复(并发修改导致)•rewriteFiles(partialcompaction)可能导致deletefile指向的某些文件失效 count(*)优化–IcebergV2 •查询计划优化 Manifest文件的读取 不同条件的TableScan在planFiles()时都需要读Manifest文件 TPCDS-Q9读取store_sales表15次,需要查看Manifest文件15次 缓存Manifest文件 •Impala已有的元数据缓存•表结构定义 •文件信息,如path、大小、权限信息等•Blocklocation(HDFS) •两种缓存优化方案 •缓存无谓词的planFiles()结果集,ScanNodeplanning时不再调用IcebergAPI,在缓存的结果集上根据谓词过滤文件•在Iceberglibrary内部缓存manifest文件,加速planFiles()等API的执行•对上层引擎透明,所有使用IcebergJavaLibrary的引擎都受益•注:Iceberg的设计里Manifest文件不会被修改,只有新增和删除 使用Caffeine缓存Manifest Manifest缓存优化效果 Codegen相关优化 Impala中的Codegen •基于LLVM•目标:为每个查询编译出最优的执行程序•利用运行时信息优化执行代码•裁减分支,如排序是升序/降序、NULLFirst/Last等•使用常量下标、指针,如排序列下标•替换虚函数调用,如GetValue()->GetBigIntValue()•现状:主要优化Operator、表达式内部代码 Codegen例子 Codegen加速比 Codegen导致的延迟 •向量化引擎相比Codegen引擎在小数据集上有天然优势 “As Martin Kersten pointed out in a workshop discussion, end-to-endMonetDBcould easily outperformHyPeron small data sets due to the highcompilation time. Even for TPC-H SF1 the query compilation time was oftenhigher than the query execution time.” MonetDB:向量化引擎代表HyPer:查询编译引擎代表 Impala在TPC-H查询上的codegen编译时间为200~900ms AsyncCodegen •在异步线程中执行Codegen•查询先用解释型代码执行•Codegen完成后,把函数指针改成codegen后的函数 •小查询可能在Codegen线程完成前就已完成 AsyncCodegen效果 •TPC-H(SF=1)性能对比:是否开启AsyncCodegen,是否关闭Codegen CodegenCache •优化有fragment相同的查询 CodegenCache测试 •TPC-H(SF=1)性能对比:是否命中CodegenCache,是否关闭Codegen Codegencache也能缓解小查询上codegen带来的性能回退 未来展望 Iceberg相关 •优化IcebergV2表读性能•支持IcebergV2表上的DELETE和UPDATE操作•支持用SELECT查询Iceberg元数据(IMPALA-10947) Codegen相关 •在更多地方使用Codegen•AdaptiveQueryCompilation•CodegenCache内存优化•Codegen可见性(Observability) 欢迎交流 邮件列表(英文交流):user@impala.apache.orgdev@impala.apache.org !"#:China_Impala!$Impala%&'()*+,-Impala./ 感谢观看