如何在 Kylin 中优雅地使用 Spark
前言Kylin 用户在使用 Spark的过程中经常会遇到任务提交缓慢、构建节点不稳定的问题。为了更方便地向 Spark 提交、管理和监控任务有些用户会使用 Livy 作为 Spark 的交互接口。在最新的 Apache Kylin 3.0 版本中Kylin 加入了通过 Apache Livy 递交 Spark 任务的新功能[KYLIN-3795]特此感谢滴滴靳国卫同学对此功能的贡献。Livy 介绍Apache Livy 是一个基于 Spark 的开源 REST 服务是 Apache 基金会的一个孵化项目它能够通过 REST 的方式将代码片段或是序列化的二进制代码提交到 Spark 集群中去执行。它提供了如下基本功能提交 Scala、Python 或是 R 代码片段到远端的 Spark 集群上执行。提交 Java、Scala、Python 所编写的 Spark 作业到远端的 Spark 集群上执行。Apache Livy 架构为什么使用 Livy1. 当前 Spark 存在的问题Spark 当前支持两种交互方式交互式处理用户使用 spark-shell 或 pyspark 脚本启动 Spark 应用程序伴随应用程序启动的同时Spark 会在当前终端启动 REPL(Read–Eval–Print Loop) 来接收用户的代码输入并将其编译成 Spark 作业。批处理批处理的程序逻辑由用户实现并编译打包成 jar 包spark-submit 脚本启动 Spark 应用程序来执行用户所编写的逻辑与交互式处理不同的是批处理程序在执行过程中用户没有与 Spark 进行任何的交互。两种方式都需要用户登录到 Gateway 节点上通过脚本启动 Spark 进程但是会出现以下问题增加 Gateway 节点的资源使用负担和故障发生的可能性。同时 Gateway 节点的故障会带来单点问题造成 Spark 程序的失败。难以管理、审计以及与已有的权限管理工具的集成。由于 Spark 采用脚本的方式启动应用程序因此相比于 WEB 方式少了许多管理、审计的便利性同时也难以与已有的工具结合如 Apache Knox 等。将 Gateway 节点上的部署细节以及配置不可避免地暴露给了登陆用户。2. Livy 优势一方面接受并解析用户的 REST 请求转换成相应的操作另一方面它管理着用户所启动的所有的 Spark 集群。Livy 具有如下功能通过 Livy session 实时提交代码片段与 Spark 的 REPL 进行交互。通过 Livy batch 提交 Scala、Java、Python 编写的二进制包来提交批处理任务。多用户能够使用同一个服务器(支持用户模拟)。能够通过 REST 接口在任何设备上提交任务、查看任务执行状态和结果。Kylin with Livy1. 引入 Livy 之前 Kylin 是如何使用 Spark 的Spark 是在 Kylin v2.0 引入的主要应用于 Cube 构建构建过程介绍可以查看https://kylin.apache.org/blog/2017/02/23/by-layer-spark-cubing/下面是 SparkExecutable 类的 doWork 方法关于提交 Spark job 的一段代码,我们可以看到 Kylin 会从配置中获取 Spark job 包的路径(默认为 $KYLIN_HOME/lib)通过本地指令的形式提交 Spark job然后循环获取 Spark job 的执行状态和结果。我们可以看到 Kylin 单独开了一个线程在本地向 Spark 客户端发送来 job 请求并且循环获取结果额外增加了节点系统压力。Override protected ExecuteResult doWork(ExecutableContext context) throws ExecuteException { //略... String jobJar config.getKylinJobJarPath(); //获取job jar的路径 //略... final String cmd String.format(Locale.ROOT, stringBuilder.toString(), hadoopConf,KylinConfig.getSparkHome(), jars, jobJar, formatArgs()); //构建本地command //略... //创建指令执行线程 Callable callable new CallablePairInteger, String() { Override public PairInteger, String call() throws Exception { PairInteger, String result; try { result exec.execute(cmd, patternedLogger); } catch (Exception e) { logger.error(error run spark job:, e); result new Pair(-1, e.getMessage()); } return result; } }; //略... try { FuturePairInteger, String future executorService.submit(callable); PairInteger, String result null; while (!isDiscarded() !isPaused()) { if (future.isDone()) { result future.get(); //循环获取指令执行结果 break; } else { Thread.sleep(5000); //每隔5秒检查一次job执行状态 } } //略... } catch (Exception e) { logger.error(Error run spark job:, e); return ExecuteResult.createError(e); } //略... }2. Livy for Kylin 详细解析Livy 向 Spark 提交 job 一共有两种分别是 Session 和 BatchKylin 是通过 Batch 的方式提交 job 的需要提前构建好 Spark job 对应的 jar 包并上传到 HDFS 中并且将配置项 kylin.engine.livy-conf.livy-key.filehdfs:///path-to-kylin-job-jar 加入到 kyiln.properties 中。Batch 一共具有如下九种状态public enum LivyStateEnum { starting, running, success, dead, error, not_started, idle, busy, shutting_down; }下面是 SparkExecutableLivy 类的 doWork 方法和 LivyRestExecutor 类的 execute 方法关于提交 Spark job 的一段代码Kylin 通过 livyRestBuilder 读取配置文件获取 Spark job 的包路径然后通过 restClient 向 Livy 发送 Http 请求。在提交 job 之后会每隔 10 秒查询一次 job 执行的结果直到 job 的状态变为 shutting_down, error, dead, success 中的一种。每一次都是通过 Http 的方式发送请求相比较于通过本地 Spark 客户端提交任务更加稳定而且减少了 Kylin 节点系统压力。Override protected ExecuteResult doWork(ExecutableContext context) throws ExecuteException { //略... livyRestBuilder.setLivyTypeEnum(LivyTypeEnum.job); executor.execute(livyRestBuilder, patternedLogger); //调用LivyRestExecutor类的execute方法 if (isDiscarded()) { return new ExecuteResult(ExecuteResult.State.DISCARDED, Discarded); } if (isPaused()) { return new ExecuteResult(ExecuteResult.State.STOPPED, Stopped); } //略... } public void execute(LivyRestBuilder livyRestBuilder, Logger logAppender) { LivyRestClient restClient new LivyRestClient(); String result restClient.livySubmitJobBatches(dataJson); //向Livy发送http请求 JSONObject resultJson new JSONObject(result); String state resultJson.getString(state); //得到Livy请求结果 final String livyTaskId resultJson.getString(id); while (!LivyStateEnum.shutting_down.toString().equalsIgnoreCase(state) !LivyStateEnum.error.toString().equalsIgnoreCase(state) !LivyStateEnum.dead.toString().equalsIgnoreCase(state) !LivyStateEnum.success.toString().equalsIgnoreCase(state)) { String statusResult restClient.livyGetJobStatusBatches(livyTaskId); //获取Spark job执行状态 JSONObject stateJson new JSONObject(statusResult); if (!state.equalsIgnoreCase(stateJson.getString(state))) { logAppender.log(Livy status Result: stateJson.getString(state)); } state stateJson.getString(state); Thread.sleep(10*1000); //每10秒检查一次结果 } }3. Livy 在 Kylin 中的应用构建 Intermediate Flat Hive Table 和 Redistribute Flat Hive Table 原本都是通过 Hive 客户端Cli 或 Beeline进行构建的引入 Livy 之后Kylin 通过 Livy 来调用 SparkSQL 进行构建提高了平表的构建速度。在引入 Livy 之后Cube 的构建主要改变的是以下几个步骤对应的任务日志输出如下构建 Intermediate Flat Hive Table构建 Redistribute Flat Hive Table使用 Spark-Submit 的地方都用 Livy 的 Batch API 进行替换1构建 Cube2转换 Cuboid 为 HFile4. 引入 Livy 对 Kylin 的好处无需准备 Spark 的客户端配置Kylin 部署更加轻量化。Kylin 节点系统压力更低无需在 Kylin 节点启动 Spark 客户端。构建 Flat Hive Table 更快通过 Livy 可以使用 Spark SQL 构建平表而 Spark SQL 要快于 Hive。提交 job 更快job 状态获取更方便。5. 如何在 Kylin 中启用 Livy在 Kylin 启用 Livy 前请先确保 Livy 能够正常工作1在 Kylin.properties 中加入如下配置并重启使之生效。//此处为CDH5.7环境下的配置 kylin.engine.livy-conf.livy-enabledtrue kylin.engine.livy-conf.livy-urlhttp://cdh-client:8998 kylin.engine.livy-conf.livy-key.filehdfs:///path/kylin-job-3.0.0-SNAPSHOT.jar //请根据个人环境替换对应版本的包 kylin.engine.livy-conf.livy-arr.jarshdfs:///path/hbase-client-1.2.0-cdh5.7.5.jar,hdfs:///path/hbase-common-1.2.0-cdh5.7.5.jar,hdfs:///path/hbase-hadoop-compat-1.2.0-cdh5.7.5.jar,hdfs:///path/hbase-hadoop2-compat-1.2.0-cdh5.7.5.jar,hdfs:///path/hbase-server-1.2.0-cdh5.7.5.jar,hdfs:///path/htrace-core-3.2.0-incubating.jar,hdfs:///path/metrics-core-2.2.0.jar其中 livy-key.file 和 livy-arr.jars 地址之间不要有空格否则可能会出不可预知的错误。2Cube 构建引擎选用 Spark。常见问题以下问题往往为使用不当和配置错误的原因非 Kylin 本身存在的问题此处仅为友情提示。1. Table or view not found输出日志Exception in thread main org.apache.spark.sql.AnalysisException: Table or view not found: DEFAULT.KYLIN_SALES; line 21 pos 6;解决方法//将hive-site.xml拷贝到spark的配置文件目录中 ln -s /etc/hive/conf/hive-site.xml $SPARK_CONF_DIR2. livy request 400 error解决方法//kylin.properties Livy配置项jar包地址之间不要留空格 //此处为CDH5.7环境下的依赖包请根据个人环境替换对应版本的包 kylin.engine.livy-conf.livy-arr.jarshdfs:///path/hbase-client-1.2.0-cdh5.7.5.jar,hdfs:///path/hbase-common-1.2.0-cdh5.7.5.jar,hdfs:///path/hbase-hadoop-compat-1.2.0-cdh5.7.5.jar,hdfs:///path/hbase-hadoop2-compat-1.2.0-cdh5.7.5.jar,hdfs:///path/3. NoClassDefFoundError输出日志NoClassDefFoundError: org/apache/hadoop/hbase/protobuf/generated/HFileProtos解决方法find /opt -type f -name hbase-protocol*.jar cp /path/to/hbase-protocol-1.2.0-cdh5.7.5.jar $SPARK_HOME/jars4. livy sql 执行错误解决方法//kylin.properties中添加如下配置 kylin.source.hive.quote-enabledfalse总结Livy 本质上是在 Spark 上的 REST 服务对于 Kylin cube 的构建没有本质上的性能提升但是通过引入 LivyKylin 能够直接通过 Spark SQL 代替 Hive 构建 Flat Table而且管理 Spark job 也更加方便。但是Livy 当前也存在一些问题比如使用较低或较高版本的 Spark 无法正常工作以及单点故障等问题用户可以考虑自身的实际场景选择是否需要在 Kylin 中使用 Livy。参考文章https://hortonworks.com/blog/livy-a-rest-interface-for-apache-spark/https://wiki.apache.org/incubator/LivyProposalhttps://kylin.apache.org/blog/2017/02/23/by-layer-spark-cubing/作者简介王汝鹏Kyligence 大数据研发工程师主要负责 Apache Kylin 社区维护和开发。GitHubhttps://github.com/rupengwang。了解更多大数据资讯点击进入Kyligence官网

相关新闻

线性表的概念和顺序存储

线性表的概念和顺序存储

线性表 线性表是由n(n>0)个数据元素(结点)a1,a2,…,an组成的有限序列,其中数据元素的个数n定义为表的长度,当n0时成为空表,若线性表的名字为L,则非空的线性表(n>0)记作L &…

2026/7/28 16:35:50阅读更多 →
环境变量的概念及设置的意义

环境变量的概念及设置的意义

首先,需要了解什么是环境变量? 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。在Windows和DOS操作系统中的path环境变量,当要求系统运行一个程序而没有告诉它程序所在的完…

2026/7/28 16:35:50阅读更多 →
牛客网题目:给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素。  请注意,它是排序后的第k小元素,而不是第k个元素

牛客网题目:给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素。 请注意,它是排序后的第k小元素,而不是第k个元素

题目:给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素。 请注意,它是排序后的第k小元素,而不是第k个元素 以下属于自己调试总结,若有不同,乐意听从,借鉴…

2026/7/28 16:35:50阅读更多 →
5大实战技巧:快速掌握Poppins字体的终极应用指南

5大实战技巧:快速掌握Poppins字体的终极应用指南

5大实战技巧:快速掌握Poppins字体的终极应用指南 【免费下载链接】Poppins Poppins, a Devanagari Latin family for Google Fonts. 项目地址: https://gitcode.com/gh_mirrors/po/Poppins 你是否正在寻找一款既能完美支持拉丁字母又能优雅呈现天城体文字的…

2026/7/28 17:44:00阅读更多 →
企业级Agent智能体开发服务商私有化部署方案与落地场景解析

企业级Agent智能体开发服务商私有化部署方案与落地场景解析

我们公司决定上马AI智能体项目的时候,第一个拍板的原则就是:必须私有化部署。不为别的,我们手里握着大量客户的核心业务数据和内部经营数据,这些东西如果通过公有云API流转出去,万一出点什么事,谁也担不起这…

2026/7/28 17:44:00阅读更多 →
2026主流品牌多层料箱批量读码盘点:固定式读码器如何择优?

2026主流品牌多层料箱批量读码盘点:固定式读码器如何择优?

前言 在制造业仓库与物流配送中心,料箱出入库、发料核对、托盘流转等环节长期依赖人工逐一扫码。操作员需从托盘上逐一取下料盘、扫描条码、再放回原处——面对整托数十甚至上百个料盘,这种逐一扫描模式耗时费力,同时因疲劳极易出现漏扫和重复…

2026/7/28 17:44:00阅读更多 →
国内智能运维厂商哪家好?选型不再纠结:从“场景适配”看AIOps真实价值

国内智能运维厂商哪家好?选型不再纠结:从“场景适配”看AIOps真实价值

在运维领域,一个经常被讨论的问题是“国内智能运维厂商哪家好”。核心在于,企业的IT架构、数据成熟度、行业监管要求以及预算规模,共同决定了哪一类平台更适合。对于金融、能源、制造等行业的数字化转型来说,选型的本质&#xff0…

2026/7/28 17:44:00阅读更多 →
告警量大的企业选智能告警智能运维平台,哪家稳?先看这三个硬指标

告警量大的企业选智能告警智能运维平台,哪家稳?先看这三个硬指标

数字化转型持续深化,企业 IT 系统规模成倍扩张,一套核心系统故障动辄触发数万条告警,有效故障信息占比不足一成,告警风暴成为金融、能源、大型制造等中大型运维团队的常态化难题。市面上运维产品繁多,不少企业选型后发…

2026/7/28 17:44:00阅读更多 →
2026国考备考工具评测与组合策略

2026国考备考工具评测与组合策略

1. 考公备考工具现状与选择困境 2026年国考备战季已经悄然拉开帷幕,备考工具的选择成为考生们面临的第一个关键决策。在这个信息爆炸的时代,各类考公APP层出不穷,但真正能帮助考生高效备考的却屈指可数。作为经历过三次公考最终成功上岸的过来…

2026/7/28 17:42:00阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/28 4:06:39阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/28 2:08:06阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/28 1:38:28阅读更多 →
告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否也曾为官方Om…

2026/7/28 0:00:29阅读更多 →
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

做 RAG 的人应该都踩过这个致命的坑:把几百页的财报、法规、技术手册扔给向量库,问一个具体问题,搜出来的全是沾边但没用的内容 —— 关键信息要么被硬切块拆碎了,要么藏在几十条结果的最下面。语义相似≠真正相关,这个…

2026/7/28 0:00:29阅读更多 →
抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

2026年做短视频运营,从抖音上扒文案早就不是偷偷抄笔记的事了。我刚开始做内容的时候,每天刷半小时抖音,手动把爆款视频的口播敲进备忘录,一条2分钟的视频得花十来分钟,碰到语速快的还要反复回听。后来试了一圈工具&am…

2026/7/28 0:00:29阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/27 16:57:54阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/28 3:17:03阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/28 2:35:58阅读更多 →