1. Kylin的构建步骤
Cube构建任务为两个步骤,第一步检测构建Cube数据的源文件,第二步是构建快照表(如果需要)、生成全局字典(如果需要)、将Cube数据构建为Parquet文件
2. Spark构建资源参数配置优化
2.1 自动计算Spark构建需要的资源
如果没有设置Spark的构建资源参数,则Kylin会通过源文件中最大文件的大小和 Cube是否具有准确的去重计数度量(precisely count_distinct)来自动计算Spark构建需要的资源
Executor内存规则
- 如果【最大文件大小】>= 100G and 【存在准确去重度量值】, 设置kylin.engine.spark-conf.spark.executor.memory为20G
- 如果【最大文件大小】>= 100G or (如果【最大文件大小】>= 10G and 【存在准确去重度量值】), 设置kylin.engine.spark-conf.spark.executor.memory为16G
- 如果【最大文件大小】>= 10G or (如果【最大文件大小】>= 1G and 【存在准确去重度量值】), 设置kylin.engine.spark-conf.spark.executor.memory为10G
- 如果【最大文件大小】>= 1G or 【存在准确去重度量值】, 设置kylin.engine.spark-conf.spark.executor.memory为4G
- 否则设置kylin.engine.spark-conf.spark.executor.memory为1G
Executor核心数规则
- 如果【最大文件大小】>= 1G or【存在准确去重度量值】, 设置kylin.engine.spark-conf.spark.executor.cores为5
- 否则设置kylin.engine.spark-conf.spark.executor.cores为1
Executor堆外内存规则
- 如 果【最大文件大小】>= 100G and 【存在准确去重度量值】, 设置kylin.engine.spark-conf.spark.executor.memoryOverhead为6G, 所以这种情况下,每个Executor的内存为20G + 6G = 26G
- 如果【最大文件大小】>= 100G or (如果【最大文件大小】>= 10G and 【存在准确去重度量值】), 设置kylin.engine.spark-conf.spark.executor.memoryOverhead为4G
- 如果【最大文件大小】>= 10G or (如果【最大文件大小】>= 1G and 【存在准确去重度量值】), 设置kylin.engine.spark-conf.spark.executor.memoryOverhead为2G
- 如果【最大文件大小】>= 1G or 【存在准确去重度量值】, 设置kylin.engine.spark-conf.spark.executor.memoryOverhead为1G
- 否则设置kylin.engine.spark-conf.spark.executor.memoryOverhead为512M
Executor实例数量规则
- 读取参数kylin.engine.base-executor-instance(默认值为5)的值作为基本Executor数量
- 根据Cuboid个数来计算所需的Executor个数, 配置文件中读取参数kylin.engine.executor-instance-strategy的值,默认为
100,2,500,3,1000,4
,即 Cuboid个数为0-100时,因数为1;100-500时,因数为2;500-1000时,因数为3;1000以上时,因数为4。然后用这个因数乘以第一步的基本Executor数量就是 Executor的预估总数量 - 从Spark资源池中的得到可用的总核心数和总内存数,然后用总核心数除以kylin任务所需的核心数,再用总内存数除以kylin任务所需的内存数,两者求个最小值,就是Executor的可用总数量
- 最后在Executor的预估总数量和Executor的可用总数量之间取最小值作为 Executor的实际最终总数量
Shuffle分区数量规则
设置kylin.engine.spark-conf.spark.sql.shuffle.partitions为max(2, 【最大文件大小MB】/ 32)
自动分配的资源,可以在$KYLIN_HOME/logs/kylin.log中查找Auto set查看
2.2 手动设置Spark构建需要的资源
在kylin.properties配置文件中,以kylin.engine.spark-conf开头的参数,都是设置Spark构建资源的参数。主要如下:
参数 | 说明 |
---|---|
kylin.engine.spark-conf.spark.executor.instances | Spark应用程序的Executor数量 |
kylin.engine.spark-conf.spark.executor.cores | 每个Executor使用的核心数, Executor数量乘以Executor使用的核心数就是Spark程序运行的最大并行度 |
kylin.engine.spark-conf.spark.executor.memory | 每个Executor使用的内存 |
kylin.engine.spark-conf.spark.executor.memoryOverhead | 每个Executor使用的堆外内存 |
kylin.engine.spark-conf.spark.sql.files.maxPartitionBytes | 读取文件时要打包到单个分区中的最大字节数,默认值为128M。如果源表(Hive source)中有许多小文件,spark会自动将许多小文件打包到单个分区中,以避免执行太多的小任务 |
kylin.engine.spark-conf.spark.sql.shuffle.partitions | 配置为Join或聚合Shuffle时要使用的分区数,默认值为200。较大的值需要更多的CPU资源,而较小的值需要更多的内存资源 |
如果存在严重的内存问题,可以考虑调整kylin.engine.spark-conf.spark.executor.cores为1,使单个任务是每个Executor的独家任务,虽然执行效率相对较低,但它可以通过这种方式来避免构建失败