spark-sql 寫代碼的三種方式


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中可以查看到運行后的文件

image

默認分區數是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;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM