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

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如下

#!/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語句進行執行。

sh spark-sql.sh -e "show databases;"



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簡介

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會在後續的文章中進行介紹。


本文分享自微信公衆號 - Hadoop實操(gh_c4c535955d0f)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章