1 引入Spark引擎
Kylin v2开始引入了Spark引擎,可以在构建Cube步骤中替换MapReduce。 关于配置spark引擎的文档,下面给出官方链接以便查阅:
http://kylin.apache.org/docs20/tutorial/cube_spark.html
以下是配置步骤:
1.在kylin的安装目录下,新建目录hadoop_conf
mkdir $KYLIN_HOME/hadoop_conf
2.将core-site.xml,hdfs-site.xml,hbase-site.xml,hive-site.xml,yarn-site.xml 5个配置文件放入刚才建立的目录。
(如果使用的是Apache的Hadoop,hbase,hive等,去配置文件目录复制或者建立软连接,我使用的是CDH管理集群,那么配置文件就在/etc/hadoop/conf,/etc/hive/conf,/etc/hbase/conf路径下,直接复制过去)
cp /etc/hadoop/conf/hdfs-site.xml $KYLIN_HOME/hadoop_conf
cp /etc/hadoop/conf/yarn-site.xml $KYLIN_HOME/hadoop_conf
cp /etc/hadoop/conf/core-site.xml $KYLIN_HOME/hadoop_conf
cp /etc/hbase/conf/hbase-site.xml $KYLIN_HOME/hadoop_conf
cp /etc/hive/conf/hive-site.xml $KYLIN_HOME/hadoop_conf
3.修改kylin.properties,添加以下配置(这里写hadoop-conf的全路径,路径根据自己hadoo_conf目录所在位置决定)
kylin.env.hadoop-conf-dir= $KYLIN_HOME/hadoop_conf
4 . 检查 Spark 配置
Kylin 在KYLIN_HOME/spark 中嵌入一个 Spark binary (v2.1.2),所有使用 “kylin.engine.spark-conf.” 作为前缀的 Spark 配置属性都能在 $KYLIN_HOME/conf/kylin.properties 中进行管理。这些属性当运行提交 Spark job 时会被提取并应用;例如,如果您配置 “kylin.engine.spark-conf.spark.executor.memory=4G”,Kylin 将会在执行 “spark-submit” 操作时使用 “–conf spark.executor.memory=4G” 作为参数。
运行 Spark cubing 前,建议查看一下这些配置并根据您集群的情况进行自定义。
下面是建议配置,开启了 Spark 动态资源分配:
kylin.engine.spark-conf.spark.master=yarn
kylin.engine.spark-conf.spark.submit.deployMode=cluster
kylin.engine.spark-conf.spark.dynamicAllocation.enabled=true
kylin.engine.spark-conf.spark.dynamicAllocation.minExecutors=1
kylin.engine.spark-conf.spark.dynamicAllocation.maxExecutors=1000
kylin.engine.spark-conf.spark.dynamicAllocation.executorIdleTimeout=300
kylin.engine.spark-conf.spark.yarn.queue=default
kylin.engine.spark-conf.spark.driver.memory=2G
kylin.engine.spark-conf.spark.executor.memory=4G
kylin.engine.spark-conf.spark.yarn.executor.memoryOverhead=1024
kylin.engine.spark-conf.spark.executor.cores=1
kylin.engine.spark-conf.spark.network.timeout=600
kylin.engine.spark-conf.spark.shuffle.service.enabled=true
kylin.engine.spark-conf.spark.executor.instances=1
kylin.engine.spark-conf.spark.eventLog.enabled=true
kylin.engine.spark-conf.spark.hadoop.dfs.replication=2
kylin.engine.spark-conf.spark.hadoop.mapreduce.output.fileoutputformat.compress=true
kylin.engine.spark-conf.spark.hadoop.mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.DefaultCodec
kylin.engine.spark-conf.spark.io.compression.codec=org.apache.spark.io.SnappyCompressionCodec
kylin.engine.spark-conf.spark.eventLog.dir=hdfs:///kylin/spark-history
kylin.engine.spark-conf.spark.history.fs.logDirectory=hdfs:///kylin/spark-history
5.重启kylin
bin/kylin.sh stop
bin/kylin.sh start
注意:
1.如果直接使用bin/kylin.sh restart重启,有可能配置会不生效,我就遇到了,用上面的方式重启就没问题。
2.在kylin的web页面上,有system选项卡,里面有reload config,本来我以为修改配置文件后可以点击此按钮,不用重启,但是实验证明这样配置也无法生效。所以保险的方法就是按照上面的方式重启。
2 创建和修改样例 cube
Kylin 启动后,访问 Kylin 网站,在 “Advanced Setting” 页,编辑名为 “kylin_sales” 的 cube,将 “Cube Engine” 由 “MapReduce” 换成 “Spark”:
点击 “Next” 进入 “Configuration Overwrites” 页面,点击 “+Property” 添加属性 “kylin.engine.spark.rdd-partition-cut-mb” 其值为 “500” (理由如下):
样例 cube 有两个耗尽内存的度量: “COUNT DISTINCT” 和 “TOPN(100)”;当源数据较小时,他们的大小估计的不太准确: 预估的大小会比真实的大很多,导致了更多的 RDD partitions 被切分,使得 build 的速度降低。500 对于其是一个较为合理的数字。点击 “Next” 和 “Save” 保存 cube。
3 用 Spark 构建 Cube
点击 “Build”,选择当前日期为 end date。Kylin 会在 “Monitor” 页生成一个构建 job,第 7 步是 Spark cubing。Job engine 开始按照顺序执行每一步。
第 7 步是 Spark cubing,当 Kylin 执行这一步时,您可以监视 Yarn 资源管理器里的状态. 点击 “Application Master” 链接将会打开 Spark 的 UI 网页,它会显示每一个 stage 的进度以及详细的信息。
查看Spark 的 UI
所有步骤成功执行后,Cube 的状态变为 “Ready” 且您可以像往常那样进行查询。
4 MapReduce和Spark引擎构建Cube时间对比
默认MapReduce引擎构建Cube,耗时15.97分钟;
引入Spark引擎构建Cube,耗时6.78分钟
5 进一步
如果您是 Kylin 的管理员但是对于 Spark 是新手,建议您浏览 Spark 文档,别忘记相应地去更新配置。您可以开启 Spark 的 Dynamic Resource Allocation ,以便其对于不同的工作负载能自动伸缩。Spark 性能依赖于集群的内存和 CPU 资源,当有复杂数据模型和巨大的数据集一次构建时 Kylin 的 Cube 构建将会是一项繁重的任务。如果您的集群资源不能够执行,Spark executors 就会抛出如 “OutOfMemorry” 这样的错误,因此请合理的使用。对于有 UHC dimension,过多组合 (例如,一个 cube 超过 12 dimensions),或耗尽内存的度量 (Count Distinct,Top-N) 的 Cube,建议您使用 MapReduce engine。如果您的 Cube 模型较为简单,所有度量都是 SUM/MIN/MAX/COUNT,源数据规模小至中等,Spark engine 将会是个好的选择。