编译spark支持thriftserver

cdh默认把spark的spark-sql以及hive-thriftserver给阉割掉了,想使用thriftserver,于是自己重新编译一个。

此外,如果是spark1.6至spark2.1版本,也可以直接从官网下载编译好的包,将thriftserver相关的jar包放到cdh spark对应的目录下,并且将执行文件,比如start-thriftserver.sh上传到CDH对应的目录下即可。

如果是spark2.3以上,只能重新编译或者使用网易开源的kyuubi(基于thriftserver改造,并且更加完善一些,可以视为spark thriftserver的增强版)

---摘自网易大数据平台架构实践---
接下来,我会介绍网易在Spark多租户方面的工作,这个项目叫做Kyuubi(该项目的开源地址: https://github.com/netease-bigdata/kyuubi https://github.com/yaooqinn/kyuubi),实际上是类似于HiveSever2的程序。大家可能都知道,Hive一般有两种使用模式,一种是client模式,所有的SQL解析都客户端在这之中完成。一种是HiveSever2模式,整个SQL解析放到server端完成。

在公司实际使用过程中,我们更希望用户的使用行为通过Server端完成,否则会很难管理,因为客户端根本不在平台掌控范围之内,我们很难进行各种升级及配置变化。只有当MetaStore和HDFS 配置不暴露给用户,我们才能更好得管控。Hive的社区比较完善,在这方面没有问题,但是Spark还有些不足。其实,所谓的Kyuubi只是在类似HiveSever2的基础上提供服务, 提供SparkSQL服务,而不是Hive SQL服务。

Kyuubi基于Spark Thrift Sever改造,Spark Thrift Sever类似于HiveSever2,但是它不够完善。由于我们在此基础上增加了多租户的功能,因此可以支持网易内部各业务线的使用。要想实现多租户功能,首先要把SparkContext变成多实例,之后每次执行代理真正的用户身份执行;其次,我们提供了Spark SQL集群,用户请求负载均衡到每台Kyuubi服务器,并且这部分是高可用的,一台服务器挂了会立刻切换到另一台。

此外,我们对安全性也进行了改进,支持kerbros。其实,整个网易猛犸平台都是强安全认证系统,每个用户都有自己的kerberos key tabkerbros,所有系统拿kerberoskerbros做认证访问都是带认证的,Kyuubi要融入这个体系同样需要支持kerberoskerbros。

Kyuubi的主要特点如下:一是具备统一接口,与HiveSever2相比,Kyuubi提供SwiftThrift的API,无论是Beeline客户端、JDBC客户端、ODBC客户端还是网易猛犸自助分析查询平台、有数可视化BI平台,Kyuubi都可以用标准的方式连接到Spark。

二是有弹性的资源控制能力,Kyuubi支持session级别的资源配置,每个session所需的队列、资源核数和内存都可以进行配置。

三是支持SparkContext的动态缓存。创建一个SparkContext耗时较长,所以我们要对SparkContext进行缓存设置,让用户不需要每次查询都动态创建SparkContext。

此外,我们也支持Spark动态资源分配特性,启用SparkContext需要启用一堆Spark执行器。如果业务需要较快的响应速度,那就直接发SQL,不需要等待进程启用。

四是Kyuubi安全特性,首先是支持Kerberos还有代理执行,最后支持集成我们自己的spark-authorizer权限验证插件,该插件对Spark没有侵入性,主要用于查询优化的最后阶段。实际上,具体权限对接的是rRangerr中的权限控制中心,通过集成Spark-authorizer,我们能够做到细粒度的权限控制。

此外,我们也支持服务的高可用和负载均衡,Kyuubi基于负载均衡的方式设计,通过将ZK作为Namespace来实现。具体过程为,Kyuubi将自己注册到ZK,ZK形成服务列表,注明各服务的存活状态,客户端会与ZK通讯拿到该服务器列表,从中挑选Kyuubi服务器执行。通过这种方式,我们将负载均衡到众多Spark查询设备上,从而避免了单点故障,保证了服务的可用性。

总结来看,Kyuubi以HiveServer2 Thrift API为接口协议,提供Spark SQL服务。相比传统的Spark,Kyuubi主要增加了企业级特性,如果公司多租户场景较多且业务线复杂,多租户功能是比较要紧的事情比如多租户、权限、负载均衡等
Kyuubi简述

官网参考:

http://spark.apache.org/docs/2.3.3/building-spark.html#building-a-runnable-distribution

http://spark.apache.org/docs/2.3.3/sql-programming-guide.html#distributed-sql-engine

环境:

#java
export JAVA_HOME="/usr/lib/java/jdk1.8.0_144"
export JRE_HOME="$JAVA_HOME/jre"
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$PATH
#maven
export MAVEN_HOME="/home/etluser/kong/spark/apache-maven-3.6.2"
export MAVEN_OPTS="-Xmx2g -XX:ReservedCodeCacheSize=512m"
export PATH=$MAVEN_HOME/bin:$PATH

修改./dev/make-distribution.sh,

1.根据服务器实际配置使用多core

2.直接指定相关VERSION,注释获取version的部分

3.hadoop,flume,zk指定cdh相关版本

vim spark-2.3.4/dev/make-distribution.sh
BUILD_COMMAND=("$MVN" -T 1C clean package -DskipTests $@)
修改为
BUILD_COMMAND=("$MVN" -T 10C package -DskipTests $@)

#VERSION=$("$MVN" help:evaluate -Dexpression=project.version $@ 2>/dev/null | grep -v "INFO" | tail -n 1)
#SCALA_VERSION=$("$MVN" help:evaluate -Dexpression=scala.binary.version $@ 2>/dev/null
# | grep -v "INFO"
# | tail -n 1)
#SPARK_HADOOP_VERSION=$("$MVN" help:evaluate -Dexpression=hadoop.version $@ 2>/dev/null
# | grep -v "INFO"
# | tail -n 1)
#SPARK_HIVE=$("$MVN" help:evaluate -Dexpression=project.activeProfiles -pl sql/hive $@ 2>/dev/null
# | grep -v "INFO"
# | fgrep --count "<id>hive</id>";
# Reset exit status to 0, otherwise the script stops here if the last grep finds nothing
# because we use "set -o pipefail"
# echo -n)
VERSION=2.3.4
SCALA_VERSION=2.11.8
SPARK_HADOOP_VERSION=2.6.0-cdh5.13.3
SPARK_HIVE=1

<hadoop.version>2.6.0-cdh5.14.0</hadoop.version>
<flume.version>1.6.0-cdh5.14.0</flume.version>
<zookeeper.version>3.4.5-cdh5.14.0</zookeeper.version>

 修改maven conf目录下settings.xml文件,加入阿里库

<mirror>
    <id>alimaven</id>
    <mirrorOf>central</mirrorOf>
    <name>aliyun-maven</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>

在spark-2.3.4/pom.xml 添加cdh仓库

<repository>
    <id>cloudera</id>
    <name>cloudera Repository</name>
    <url>https://repository.cloudera.com/artifactory/cloudera-repos</url>
</repository>

 执行

./make-distribution.sh --name hadoop2.6 --tgz -Pyarn -Phadoop-2.6 -Dhadoop.version=2.6.0-cdh5.13.3 -Phive -Phive-thriftserver -DskipTests

然后等待...

完成!

 生成的压缩包

原文地址:https://www.cnblogs.com/zz-ksw/p/11905400.html