spark-sql 寫程式碼的三種方式
阿新 • • 發佈:2022-03-13
spark-sql 寫程式碼的三種方式
目錄一、在idea裡面將程式碼編寫好打包上傳到叢集中執行----上線使用
spark-submit提交(專案常用)
1、編寫程式碼
編寫程式碼三步驟:
(1)建立環境
(2)讀取檔案、編寫邏輯
(3)儲存資料
package com.shujia.sql import org.apache.spark.sql.{DataFrame, SaveMode, SparkSession} object Demo8Submit { def main(args: Array[String]): Unit = { val spark: SparkSession = SparkSession .builder() // .master("local") //提交到叢集執行,不需要寫 .appName("submit") .getOrCreate() import spark.implicits._ import org.apache.spark.sql.functions._ //讀取hdfs中的檔案 val student: DataFrame = spark .read .format("csv") .option("sep", ",") .schema("id STRING,name STRING,age INT,gender STRING,clazz STRING") .load("/user/hive/warehouse/test1.db/students") //統計性別人數 val genderNum: DataFrame = student .groupBy($"gender") .agg(count($"gender") as "c") //儲存資料 genderNum .write .format("csv") .option("sep", "\t") .mode(SaveMode.Overwrite) .save("/user/hive/warehouse/test1.db/gender_num") /** * spark-submit --master yarn-client --class com.shujia.sql.Demo8Submit --executor-memory 1G --executor-cores 1 --num-exe * cutors 1 --conf spark.sql.shuffle.partitions=1 spark-1.0.jar * */ } }
2、打包上傳到Hdoop叢集中
在IDEA中使用
package
將程式碼打包將打好的包上傳到叢集(我們目前使用的叢集就是虛擬機器)
3、spark-submit提交到Yarn上執行
使用yarn-client模式,可以檢視日誌,方便我們檢視是否有錯誤
[root@master jars]#
spark-submit --master yarn-client --class com.shujia.sql.Demo8Submit --executor-memory 1G --executor-cores 1 --num-executors 1 Spark-1.0.jar
通過命令可以檢視執行結果
[root@master jars]# hdfs dfs -cat /user/hive/warehouse/test1.db/gender_num/*
男 507
女 493
在HDFS中可以檢視到執行後的檔案
預設分割槽數是200個,執行時就有200個task,執行的比較慢,修改分割槽數
方法1:修改程式碼
1、在建立SparkSession時指定分割槽數
val spark: SparkSession = SparkSession
.builder()
// .master("local")//提交到叢集執行,不需要寫
.appName("submit")
.config("spark.sql.shuffle.partitions",1)//指定分割槽數
.getOrCreate()
2、再重新打包上傳
方法2:通過shell命令直接修改
在jar包前面增加
--conf spark.sql.shuffle.partitions=1
[root@master jars]#
spark-submit --master yarn-client --class com.shujia.sql.Demo8Submit --executor-memory 1G --executor-cores 1 --num-executors 1
--conf spark.sql.shuffle.partitions=1 Spark-1.0.jar
二、Spark shell 命令欄裡面寫程式碼----測試使用(專案上幾乎不使用)
這種方式統稱為
repl
(互動式命令列)
需要進入spark shell命令欄
兩種進入命令欄的方式:
(1)
spark-shell --master local
---本地模式:適合資料量較小的測試(2)
spark-shell --master yarn-client
----Yarn模式:適合資料量較大的測試
不能使用yarn-cluster Driver必須在本地啟動
[root@master jars]# spark-shell --master local
scala> "可以直接編寫和IDEA裡一樣的程式碼"
[root@master jars]# spark-shell --master client
scala> "可以直接編寫和IDEA裡一樣的程式碼"
三、spark-sql命令欄寫程式碼
類似與 hive 的 shell
可以在裡面直接寫 SQL
預設使用derby管理元資料
# 進入 spark-sql
# 不指定預設是local模式,但是不能使用yarn-cluster模式
spark-sql --master yarn-client
# 退出
# 注意這裡一定要通過quit;退出,不然yarn上的任務不會停止
quit;
#如果使用了Ctrl+z/x/c退出,yarn上的任務不會停止,那麼就要手動停止
yarn application -kill ID號
在進入 spark-sql 的過程中會輸出很多日誌,那麼如何取消這些日誌呢?
log4j -- 打日誌的框架,一般常用的元件都是通過它打日誌的
不建議修改輸出日誌的級別
# 進入spark配置檔案目錄
cd /usr/local/soft/spark-2.4.5/conf/
# 重新命名
mv log4j.properties.template log4j.properties
# 修改log4j.properties
vim log4j.properties
# 修改輸出日誌的級別
# 預設是INFO級別
log4j.rootCategory=INFO,console
# 將之修改為 ERROR 級別 -- 只打印報錯
log4j.rootCategory=ERROR,console
spark 整合 Hive
因為spark預設使用derby管理元資料,一旦換個位置進入spark-sql,之前做的操作就都沒了
所以我們需要將 Hive 和 spark 進行整合,讓 spark 可以使用 Hive 的元資料
即讓spark可以使用Hive中的表
1、在hive的hive-site.xml修改一行配置
cd /usr/local/soft/hive-1.2.1/conf
vim hive-site.xml
#查詢hive.metastore.uris關鍵字
#新增 <value>thrift://master:9083</value>
<property>
<name>hive.metastore.uris</name>
<value>thrift://master:9083</value>
</property>
2、啟動hive元資料服務
nohup hive --service metastore >> metastore.log 2>&1 &
#注意: 當修改完配置檔案之後,你不開啟hive元資料服務,那麼hive就會報一個 拒絕連線 的錯誤
#驗證 hive 能不能用 -- 看看能不能進入hive的shell
hive
3、將 hive-site.xml 複製到 spark conf 目錄下
cp /usr/local/soft/hive-1.2.1/conf/hive-site.xml /usr/local/soft/spark-2.4.5/conf/
4、將mysql的驅動包複製到saprk jars目錄下
cp /usr/local/soft/hive-1.2.1/lib/mysql-connector-java-5.1.49.jar /usr/local/soft/spark-2.4.5/jars/
做完這4步就整合好了
在 spark-sql 裡面就可以使用hive的表了
#進入spark-sql命令欄
spark-sql --master yarn-client --conf spark.sql.shuffle.partitions=2
#不能使用cluster模式
也可以單獨在 spark-sql 中設定執行引數
set spark.sql.shuffle.partitions=2;