前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >0827-7.1.4-如何在CDP中使用Spark SQL CLI

0827-7.1.4-如何在CDP中使用Spark SQL CLI

作者头像
Fayson
发布2021-01-12 11:09:58
1.4K0
发布2021-01-12 11:09:58
举报
文章被收录于专栏:Hadoop实操Hadoop实操

1.文档编写目的

在CDP7.1.4中,自带的spark-sql运行会报错,如下图

这是因为在CDP7.1.4中不支持Spark SQL CLI,官网有说明如下

而我们在产品开发过程中,可能需要用到spark-sql来进行数据加工,本文就采用脚本的方式,调用spark-shell来进行数据的处理,执行需要的sql语句。

  • 测试环境:

1.Redhat7.7

2.采用root用户操作

3.CM为7.1.4,CDP为7.1.4

2.解决办法

1.编写脚本spark-sql.sh如下

代码语言:javascript
复制
#!/bin/bash

if [[ $1 = "-e" ]];then
   sql=$2
elif [[ $1 = "-f" ]];then
   sql=`cat $2`
else
  echo "Usage:"
  echo "--------------------------------------------------------"
  echo "spark2-sql.sh -f [SQL filename] : execute a sql file"
  echo "spark2-sql.sh -e [SQL] : execute a sql"
  echo "--------------------------------------------------------"
fi

if [[ ${sql} =~ ';' ]];then
  i=1
  while((1==1))
  do
     splitchar=`echo $sql|cut -d ";" -f$i`
     if [ "$splitchar" != "" ];then
        ((i++))
        sparksql=${sparksql}"spark.sql(\"$splitchar\").show();"
     else
        break
     fi
  done
else
  sparksql = "spark.sql(\"$sql\").show();"
fi
echo $sparksql
echo ${sparksql} | spark-shell

2.使用方法在脚本中进行了说明,-f参数直接接sql文本,-e可以直接输入sql语句进行执行。

代码语言:javascript
复制
sh spark-sql.sh -e "show databases;"
代码语言:javascript
复制
cat a.sql
sh spark-sql.sh -f a.sql

3.问题总结

1.使用中用-e参数进行执行的时候,SQL语句后面的分号“;”要注意,不要漏掉,不然会无法识别。

2.本文演示中是直接在脚本存放路径进行执行的。可以根据自己的需要,把脚本配置进系统环境变量,以方便日常使用。

3.对于sql文本,需要注意编写的文本的行结束符要是UNIX/LINUX(LF)格式的,不然会无法识别。

4.关于CDH为什么一直不打包集成Spark Thrift Server,可以参考Fayson之前的文章《0643-Spark SQL Thrift简介

代码语言:javascript
复制
1.不支持用户模拟,即Thrift Server并不能以提交查询的用户取代启动Thrift Server的用户来执行查询语句,具体对应到Hive的hive.server2.enable.doAs参数不支持。参考:



https://issues.apache.org/jira/browse/SPARK-5159
https://issues.apache.org/jira/browse/SPARK-11248
https://issues.apache.org/jira/browse/SPARK-21918


2.因为上述第一点不支持用户模拟,导致任何查询都是同一个用户,所有没办法控制Spark SQL的权限。



3.单点问题,所有Spark SQL查询都走唯一一个Spark Thrift节点上的同一个Spark Driver,任何故障都会导致这个唯一的Spark Thrift节点上的所有作业失败,从而需要重启Spark Thrift Server。



4.并发差,上述第三点原因,因为所有的查询都要通过一个Spark Driver,导致这个Driver是瓶颈,于是限制了Spark SQL作业的并发度。



因为以上限制,主要是安全性上的(即上面描述的第一和第二点),所以CDH的企业版在打包Spark的时候将Spark Thrift服务并没有打包。如果用户要在CDH中使用Spark Thrift服务,则需要自己打包或单独添加这个服务,但Cloudera官方并不会提供支持服务。可以参考如下jira:

https://issues.cloudera.org/browse/DISTRO-817


关于Spark Thrift的缺陷,也可以参考网易的描述:
大家可能都知道,Hive一般有两种使用模式,一种是client模式,所有的SQL解析都客户端在这之中完成。一种是HiveSever2模式,整个SQL解析放到server端完成。



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



Kyuubi基于Spark Thrift Sever改造,Spark Thrift Sever类似于HiveSever2,但是它不够完善。由于我们在此基础上增加了多租户的功能,因此可以支持网易内部各业务线的使用。

所以网易才自己做了一个Thrift服务取名Kyuubi,参考:




http://blog.itpub.net/31077337/viewspace-2212906/

5.为了解决这个问题,CDP中如果要使用Spark SQL JDBC,通过使用Livy Thrift Server来解决,Livy Thrift Server是对Spark Thrift Server的一次改进提升,Fayson会在后续的文章中进行介绍。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-01-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Hadoop实操 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
专用宿主机
专用宿主机(CVM Dedicated Host,CDH)提供用户独享的物理服务器资源,满足您资源独享、资源物理隔离、安全、合规需求。专用宿主机搭载了腾讯云虚拟化系统,购买之后,您可在其上灵活创建、管理多个自定义规格的云服务器实例,自主规划物理资源的使用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档