您的浏览器禁用了JavaScript(一种计算机语言,用以实现您与网页的交互),请解除该禁用,或者联系我们。[DataFunSummit2023:OLAP引擎架构峰会]:Impala中的性能优化 - 发现报告
当前位置:首页/行业研究/报告详情/

Impala中的性能优化

AI智能总结
查看更多
Impala中的性能优化

DataFunSummit2023 Impala在数据湖中的 性能优化 黄权隆-Cloudera-StaffSoftwareEngineer Impala与数据湖 Iceberg相关优化 Codegen优化 未来展望 Impala与数据湖 DataFunSummit2023 •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节点 •Coordinator处理查询请求,可有多个 •Parse,Analyze,Plan,Optimize •元数据缓存 •准入控制/并发控制,调度 •Executor •分布式执行 Metadata&Control Ranger HiveMetastore StorageMasterNodes QueryExecutor QueryExecutor QueryExecutor QueryExecutor QueryExecutor QueryExecutor QueryExecutor QueryExecutor QueryExecutor QueryExecutor ImpalaCoordinator ImpalaExecutors FE (Java) BE (C++) Storage QueryExecutorQueryExecutor QueryExecutor QueryCoordinator QueryCompiler StateStore CatalogServer CachedTableMetadata LocalMetadataCache Execution 外部系统 HDFS/Ozone Kudu S3/ADLS/GCP HBase 元数据/调度/集群管控执行层 •所有查询都能查看,包括正在运行或失败的查询,以及DDL/DML等 •图形化的queryplan,开源版本即可拥有 •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测试建议使用新版本 •对数据的假设/管控有限 •数据源、数据导入方式、文件格式、表格式多样 •存算分离,支持开放存储 •数据湖/湖仓优化vs.传统数仓优化 •数据预排序 •需要数据生产者支持 •若保证有序,简单的min()/max()查询可只读首/末行,可实现直接merge-join等优化 •不保证有序,只能基于文件min-max索引做谓词下推,数据有序时,min-max索引更有效 •字典编码、索引等 •文件级别可以有字典编码,但难以维护全局字典 •难以自定义文件格式 •数据位置不可控,难以做colocated优化等 •…… •为支持开放性、存算分离等,不能对数据做过多假设,但仍有许多优化点可做: •查询计划层 •谓词推导/下推、常量传播、Join顺序、子查询改写等 •结合执行层:Pre-aggregation、RuntimeFilter、BroadcastvsPartitioned(Shuffle) •执行层 •JITCodegen、向量化、SIMD、Prefetch、并行优化、延迟物化、内存计算、自适应执行等 •内存管理、Spilltodisk •IO层 •本地短路读、列存优化、压缩、编码(Encoding)、异步IO •缓存 •元数据、Filehandle、数据文件、中间数据、物化视图(需要自主管控) •工程实现优化 Impala在Iceberg上的优化 DataFunSummit2023 Iceberg–OpenTableFormat •用文件保存元数据 •如何分区 •每个分区有哪些数据文件等 •不再需要file-listing •表结构/分区定义/修改更灵活 •方便实现snapshot、回滚等功能 •使用外部系统来保证事务 •如HDFS上的rename •HMS上的元数据变更等 •支持HadoopTables、HadoopCatalog和HiveCatalog •读写IcebergV1表 •读IcebergV2表(仅支持positiondelete) •snapshot操作:show、expire、rollback •查询历史版本(timetravel) •partition变更 •…… https://impala.apache.org/docs/build/html/topics/impala_iceberg.html Datafiles Deletefiles •merge-on-read •两种deletefiles •Positiondeletefiles •记录文件URIs+行号 •Equalitydeletefiles •记录已删除行的某些列的值 •实际应用不多 •Iceberglibrary可返回哪些deletefile对应哪些datafile •可选方案 •IcebergJavaReader •IcebergScanner(C++) •AntiJoin •AntiJoin •使用已有Join实现,支持BROADCAST或PARTITIONED •与HiveACID支持方案类似 •增加虚拟列INPUTFILENAME,FILEPOSITION LEFľANľI HASHJOIN data.INPUTFILENAME =del.file_pathANDdata.FILEPOSITION= del.pos •Join条件: •data.INPUTFILENAME=del.file_pathANDdata.FILEPOSITION=del.pos SCANNODE(DAľAROWS) SCANNODE(DELEľEDROWS) UNIONALL SCANNODE(NODELEľES) LEFľANľI HASHJOIN SCANNODE(DAľAROWS) SCANNODE(DELEľEDROWS) •区分datafiles,没有对应deletefiles的可以直接读取,绕过AntiJoin •使用Unionall连接结果 •AntiHashJoin需要为每行计算hash值 •替换为Iceberg特定的operator •使用特定的lookuptable: •File→sortedpositions •只索引在prodeside要读的datafile对应的deletefile •每个rowbatch仅需一次lookup,然后类似mergejoin处理deletepositions •注:rowbatch里各行天然按position排序 ScanNode(Dataíows) IcebeígSpecificAntiJoin ScanNode(Deletedíows) •使用snapshot的统计信息优化简单的count(*) •SELECTcount(*)FROMice_tblSELECT1000 •SELECTcount(*),min(a),max(b)FROMice_tbl SELECT1000,min(a),max(b)FROMice_tbl •仅对v1和没有deletefile的v2表有效 •IcebergV2表包含deletefile,是否能简单减去deletefile行数? •Deletefile可能有内容重复(并发修改导致) •rewriteFiles(partialcompaction)可能导致deletefile指向的某些文件失效 DeleteFile(2) A(100) BC’(199) Snapshot2 Snapshot1 B(100) C(100) compaction忽略已删除的行 AGGREGAľE count(*) LEFľANľI HASHJOIN SCANNODE(DAľAROWS) SCANNODE(DELEľEDROWS) UNIONALL SCANNODE(NODELEľES) LEFľANľI HASHJOIN SCANNODE(DAľAROWS) SCANNODE(DELEľEDROWS) AGGREGAľE count(*) Constant •查询计划优化 不同条件的TableScan在planFiles()时都需要读Manifest文件 TPCDS-Q9读取store_sales表15次,需要查看Manifest文件15次 在云上Manifest文件的读取成为QueryPlanning的瓶颈 •Impala已有的元数据缓存 •表结构定义 •文件信息,如path、大小、权限信息等 •Blocklocation(HDFS) •两种缓存优化方案 •缓存无谓词的planFiles()结果集,ScanNodeplanning时不再调用IcebergAPI,在缓存的结果集上根据谓词过滤文件 •在Iceberglibrary内部缓存manifest文件,加速planFiles()等API的执行 •对上层引擎透明,所有使用IcebergJavaLibrary的引擎都受益 •注:Iceberg的设计里Manifest文件不会被修改,只有新增和删除 ContentCachefoíManifestfiles IcebergCoreLibrary(iceberg#4518) Iceberg1.1.0开始支持 ManifestFileN ManifestFile2 ManifestFile1 FileION … … … FileIO2 FileIO1 ContentCacheN ContentCache2 ContentCache1 FileLocation1FileLocation2 …… FileLocationN … Manifest缓存优化效果 Codegen相关优化 DataFunSummit2023 Impala中的Codegen •基于LLVM •目标:为每个查询编译出最优的执行程序 •利用运行时信息优化执行代码 •裁减分支,如排序是升序/降序、NULLFirst/Last等 •使用常量下标、指针,如排序列下标 •替换虚函数调用,如GetValue()->GetBigIntValue() •现状:主要优化Operator、表达式内部代码 Codegen例子 Codegen加速比 Codegen导致的延迟 •向量化引擎相比Codegen引擎在小数据集上有天然优势 “AsMartinKerstenpointedoutinaworkshopdiscussion,end-to-endMonetDBcouldeasilyoutperformHyPeronsmalldatasetsduetothehighcompilationtime.EvenforTPC-HSF1thequerycompilationtimewasoftenhigherthanthequeryexecutiontime.” MonetDB