Kyuubi 实践ApacheKyuubionSpark 在CDH 上的深度实践
Kyuubi 简介
Kyuubi 是⽹易有数的⼤数据开源项⽬,于2021年6⽉全票通过进⼊世界顶级开源基⾦会 Apache Software Foundation 孵化器。Kyuubi 的命名源⾃中国神话《⼭海经》,意为“九尾狐”。狐会喷⽕,象征Spark;狐有九尾,类⽐多租户,在Spark上实现多租户是系统设计之初的主要⽬的。然后取了动漫《⽕影忍者》中⾓⾊九尾的罗马⾳['kju:bi:],作为项⽬名称。
Kyuubi 的⽬标是让“⼤数据平民化”。为实现这个⽬标,我们遵循“专业⼈做专业事”的准则,通过 Kyuubi
的 C/S 架构,服务端⼤数据专家可以将 Spark 等⼤数据算⼒极致优化并⾼度封装后提供出来,业务端可通过该算⼒直接在⾃⼰擅长的业务领域处理数据产⽣价值,两者之间通过简单的接⼝进⾏必要且有效的直接交互。Kyuubi 使⽤场景:替换 HiveServer2,轻松获得 10~100 倍性能提升构建 Serverless Spark 平台
构建统⼀数据湖探索分析管理平台
下载apacheCDH 最后⼀个免费版 6.3.2 发布⼀年有余,离线计算核⼼组件版本停在了 Hadoop 3.0.0,Hive 2.1.1,Spark 2.4.0。
随着 Spark 3.0 的重磅发布,在性能⽅⾯⼜迎来了⼀次飞跃,本⽂将描述把 Spark 3 集成到 CDH 6.3.1(未开启 Kerberos) 的过程,并使⽤ Kyuubi 替换 HiveServer2,实现 OLAP、ETL 等场景下从 HiveQL 到 SparkSQL 的⽆缝迁移,享受 10x-100x 的性能红利。1
CDH 缺陷修复
[ORC-125] 修复 Hive 不能读取⾼版本 ORC 写⼊的数据
当使⽤ Hive 读取由 Presto 或者 Spark 等写⼊的 ORC ⽂件时,会出现以下错误。
该问题在 ORC 上游被修复 [ORC-125] Correct OrcFile.WriterVersion to correctly use FUTURE。
ORC 最早是 Hive 的⼀个⼦项⽬,在 CDH 6 集成的 Hive 2.1 这个版本⾥,ORC 还没有分离出去,所以这个问题要在 Hive 源码⾥修复。
我做了⼀个打包好的修复版本,GitHub 传送门 ①,下载更换 /opt/cloudera/parcels/CDH/lib/hive/lib 路径下的 hive-exec-2.1.1-cdh6.3.1.jar, hive-orc-2.1.1-cdh6.3.1.jar即可。(⾄少需要更换 Hadoop Client、HiveServer2 节点,如果你不知道我在说什么,就把所有节点都换掉)
2
Spark 3.1
[SPARK-33212] Spark 使⽤ Hadoop Shaded Client
ORC split generation failed with exception: java.lang.ArrayIndexOutOfBoundsException: 6
Hadoop 3.0 提供了 Shaded Client,⽤于下游项⽬规避依赖冲突 [HADOOP-11656] Classpath isolation for downstream clients。
Spark 3.2 在 hadoop-3.2 profile 中切换到了 Hadoop Shaded Client [SPARK-33212] Upgrade to Hadoop 3.2.2 and move to shaded clients for Hadoop 3.x profile。
该更改不是必须的,但个⼈建议从 Spark 主线将该补丁移植到 branch-3.1 使⽤,以规避潜在的依赖冲突。
[CDH-71907] Spark HiveShim 适配 CDH Hive
Spark 通过反射和隔离的类加载器来实现对多版本 Hive Metastore 的⽀持,详情参考 Interacting with Different Versions of Hive Metastore - Spark Documentation。
CDH 6 使⽤修改过的 Hive 2.1.1 版本,其⽅法签名与 Apache 版本有所不同,故 Spark HiveShim 反射调⽤会出现不到⽅法签名,需要⼿动将 CDH-71907 补丁打到 branch-3.1。
Spark External Shuffle Service 协议兼容
Spark shuffle 时,mapper 会将数据写⼊到本地磁盘⽽⾮ HDFS,引⼊ ESS 后,会将⽂件信息注册到 ESS 中,将 mapper 与 reducer 解耦。CDH 中,默认会启⽤ Spark Yarn External Shuffle Service,作为 YARN AUX Service 在所有 Yarn Node 上启动。
Spark 3 修改了 shuffle 通信协议,在与 CDH 2.4 版本的 ESS 交互时,需要设置 spark.shuffle.useOldFetchProtocol=true,否则可能报如下错误。[SPARK-29435] Spark 3 doesn't work with older shuffle service
IllegalArgumentException: Unexpected message type: <number>.
Spark 版本迁移指南
如果你有现存的基于 CDH Spark 2.4 的 Spark SQL/Job,在将其迁移⾄ Spark 3 版本前,请参阅完整的官⽅迁移指南。
Migration Guide: Spark Core - Spark Documentation ②
Migration Guide: SQL, Datasets and DataFrame - Spark Documentation ③
Spark 部署
官⽅⽂档 Running Spark on YARN - Documentation 中提到
因此,⽆需在 CDH 所有节点上部署 Spark 3,只需在 Hadoop Client 节点上部署 Spark 3 即可。
如果你对集权限管理没有⼗分严格的要求,请使⽤ hive ⽤户以避免权限问题。
我基于 Spark 3.1.2 制作了⼀个适配 CDH 6 的版本, GitHub 传送门 ,下载解压⾄ /opt,并软链⾄ /opt/spark3。
1[hive@cdh-kyuubi]$ ls -l /opt | grep spark
2lrwxrwxrwx  1 root        root          39 Aug 10 18:46 spark3 -> /opt/spark-3.1.2-cdh6-bin-3.2.2
3drwxr-xr-x 13 hive        hive        4096 Aug 10 18:46 spark-3.1.2-cdh6-bin-3.2.2
配置 Hadoop、Hive
CDH 会将配置⽂件⾃动分发到所有节点 /etc ⽬录下,建⽴软链即可。
1ln -s /etc/hadoop/l /opt/spark3/conf/
2ln -s /etc/hadoop/l /opt/spark3/conf/
3ln -s /etc/hadoop/l /opt/spark3/conf/
4ln -s /etc/hive/l /opt/spark3/conf/
配置 Spark 环境变量 /opt/spark3/conf/spark-env.sh
1#!/usr/bin/env bash
2export HADOOP_CONF_DIR=/etc/hadoop/conf:/etc/hive/conf
3export YARN_CONF_DIR=/etc/hadoop/conf.cloudera.yarn:/etc/hive/conf
配置 Spark 默认参数 /opt/spark3/f
请参考 Configuration - Spark Documentation 根据集环境实际情况进⾏微调
1spark.authenticate=false
abled=false
abled=true
5spark.eventLog.dir=hdfs://nameservice1/user/spark/applicationHistory 6spark.driver.log.dfsDir=/user/spark/driverLogs
7spark.driver.abled=true
8spark.files.overwrite=true
9spark.files.useFetchCache=false
10spark.serializer=org.apache.spark.serializer.KryoSerializer
11spark.abled=true
12spark.shuffle.service.port=7337
13spark.shuffle.useOldFetchProtocol=true
abled=true
15spark.ui.killEnabled=true
16spark.yarn.historyServer.address=cdh-master2:18088
17spark.yarn.historyServer.allowTracking=true
18spark.master=yarn
19spark.submit.deployMode=cluster
=2G
<=8G
abled=true
utorIdleTimeout=60
28spark.dynamicAllocation.minExecutors=0
29spark.dynamicAllocation.schedulerBacklogTimeout=1
30spark.abled=true
31spark.sql.cbo.starSchemaDetection=true
32spark.sql.abled=false
33spark.sql.sources.partitionOverwriteMode=dynamic
34spark.vertMetastoreParquet=false
35spark.Schema=false
36spark.astore.version=2.1.1
37spark.astore.jars=/opt/cloudera/parcels/CDH/lib/hive/lib/* rgeSchema=true
39spark.Schema=true
40spark.sql.parquet.writeLegacyFormat=true
41spark.abled=true
42spark.sql.adaptive.forceApply=false
43spark.sql.adaptive.logLevel=info
44spark.sql.adaptive.advisoryPartitionSizeInBytes=256m
45spark.abled=true
46spark.alescePartitions.minPartitionNum=1
47spark.alescePartitions.initialPartitionNum=1024
48spark.sql.adaptive.fetchShuffleBlocksInBatch=true
49spark.sql.abled=true
50spark.sql.abled=true
51spark.sql.adaptive.skewJoin.skewedPartitionFactor=5
52spark.sql.adaptive.skewJoin.skewedPartitionThresholdInBytes=128m 53spark.EmptyPartitionRatioForBroadcastJoin=0.2
54spark.sql.autoBroadcastJoinThreshold=-1
验证 spark-shell ⼯作正常
1[hive@cdh-kyuubi]$ /opt/spark3/bin/spark-shell
2Setting default log level to "WARN".
3To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
421/08/30 19:53:46 WARN NativeCodeLoader: Unable to load native-hadoop library for using builtin-java classes where applicable 521/08/30 19:53:46 WARN Client: Neither spark.yarn.jars nor spark.yarn.archive is set, falling back to uploading libraries under SPARK_HOME.
6Spark context Web UI available at cdh-master1:4040
7Spark context available as 'sc' (master = yarn, app id = application_1615462037335_40099).
8Spark session available as 'spark'.
9Welcome to
10      ____              __
11    / __/__  ___ _____/ /__
12    _\ \/ _ \/ _ `/ __/  '_/
13  /___/ .__/\_,_/_/ /_/\_\  version 3.1.2-cdh6
14      /_/
15Using Scala version 2.12.10 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_221)
16Type in expressions to have them evaluated.
17Type :help for more information.
18scala> spark.sql("show databases").show
19+----------------+
20|      namespace|
21+----------------+
22|            test|
23+----------------+
24scala>
⾄此,Spark 3 on CDH 6 已经部署完成,可以像 CDH ⾃带的 Spark 2.4 ⼀样,正常的使⽤ spark-submit、spark-shell,但依旧不⽀持 spark-sql,spark-thriftserver。
相⽐略显鸡肋的 spark-sql,spark-thriftserver,Kyuubi 是更好的选择,因此我故意移除了这两个功能。
注意:我提供的构建版,没有启⽤ spark-thriftserver 模块,为正常使⽤ Kyuubi,请下载hive-service-rpc-3.1.2.jar 添加到
/opt/spark3/jars 路径。
3
Kyuubi —— 解锁 Spark SQL 更多场景
简⾔之,Apache Kyuubi (Incubating) 之于 Spark,类似 HiveServer2 之于 Hive。
Kyuubi 通过将 Spark 暴露⼀个与 HiveServer2 完全兼容的 Thrift API,可以兼容现有的 Hive ⽣态,如 beeline,hive-jdbc-
driver,HUE,Superset 等。
可以通过以下⽂档来了解 Kyuubi 的架构,Kyuubi 与 HiveServer2 和 Spark Thrift Server 的异同。
Welcome to Kyuubi’s documentation ④
Kyuubi Architecture — Kyuubi documentation ⑤
Kyuubi v.s. HiveServer2 — Kyuubi documentation ⑥
Kyuubi v.s. Spark Thrift JDBC/ODBC Server (STS) — Kyuubi documentation ⑦
Kyuubi 部署
Kyuubi ⽆需任何修改即可适配 CDH 6,下⾯给出关键步骤,详情可以参考 Deploy Kyuubi engines on Yarn — Kyuubi documentation ⑧
同样的,如果你对集权限管理没有⼗分严格的要求,请使⽤ hive ⽤户以避免权限问题。
解压部署
下载 kyuubi-1. 解压⾄ /opt,并创建软链到 /opt/kyuubi。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。