在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
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
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源創計劃”,歡迎正在閱讀的你也加入,一起分享。