摘要:Spark SQL
啟動Spark SQL應(yīng)用
#! /bin/bash
cd /home/test_gp/SparkSQLExample
nohup spark2-submit \
--class com.example.SparkSQLExample.SparkSQLExampleMain \
--master yarn \
--num-executors 20 \
--executor-cores 3 \
--executor-memory 10g \
--conf spark.yarn.executor.memoryOverhead=12288 \
--conf spark.dynamicAllocation.enabled=false \
--conf spark.network.timeout=300 \
--conf spark.sql.shuffle.partitions=20 \
SparkSQLExample-1.0-SNAPSHOT.jar \
hdfs:///tmp/SparkSQLExample.properties > logs/detail.log 2>&1 &
跟蹤日志到Spark WebUI的鏈接tracking URL

查看jobs
查看任務(wù)一共被分為4個job,以及每個job在scala代碼中出發(fā)的行數(shù),還包括提交時間,執(zhí)行時間,每個job得到stage數(shù)量以及成功的stage數(shù)量,每個job所有的task數(shù)量和成功的task數(shù)量。

查看stages
點(diǎn)擊每個job可以看待當(dāng)下job的所有stage,也可以直接點(diǎn)擊stages面板,顯示一共有19個stage??梢圆榭疵總€stage的task數(shù)量和成功的task數(shù)量,Input從hadoop或者spark storage讀取的數(shù)據(jù)大小,Output寫入hadoop的數(shù)據(jù)大小,shuffle read每個stage讀取的數(shù)據(jù)大小,shuffle write每個stage寫入磁盤的數(shù)據(jù)大小供于未來某個stage讀取。

一般而言task數(shù)量(partition)等于spark.sql.shuffle.partitions數(shù)量,當(dāng)spark從hive,kudu讀取數(shù)據(jù)時,task數(shù)量和數(shù)據(jù)表的分區(qū)數(shù)保持一致。
如下圖spark sql task數(shù)為226,hive在hdfs上的分區(qū)也是226


如下圖spark sql task數(shù)為255,kudu的tablet也是255


查看executors
點(diǎn)擊executors面板,可以看到driver所在機(jī)器以及其他20個executor所在機(jī)器和端口號,以及executor端的日志

一般executors數(shù)量和num-executors數(shù)量一致,如果開啟了spark.dynamicAllocation.enabled,spark會根據(jù)task數(shù)量動態(tài)調(diào)整executors數(shù)量,num-executors只是executors數(shù)量的初始值
查看SQL的執(zhí)行計(jì)劃
點(diǎn)擊SQL面板查看執(zhí)行計(jì)劃

-
scan:從hive,kudu讀取數(shù)據(jù) -
Filter:過濾操作,包括去除缺失值,條件篩選等 -
Project:映射,選擇需要的列 -
HashAggregate:聚合,本例中HashAggregate+Exchange+HashAggregate用來distinct去重 -
wholestagecodegen:全階段代碼生成,用來將多個處理邏輯整合到單個代碼模塊中,是Spark的新的SQL代碼生成模型 -
Exchange:數(shù)據(jù)重分區(qū) -
Sort:數(shù)據(jù)根據(jù)某個key排序 -
SortMergeJoin:大表和大表join的策略,本例中Exchange+Sort+SortMergeJoin用來做大表和大表join
SortMergeJoin

-
shuffle階段:將兩張大表根據(jù)join key進(jìn)行重新分區(qū),對應(yīng)執(zhí)行計(jì)劃中的Exchange -
sort階段:對單個分區(qū)節(jié)點(diǎn)的兩表數(shù)據(jù),分別進(jìn)行排序,對應(yīng)執(zhí)行計(jì)劃中的Sort -
merge階段:對排好序的兩張分區(qū)表數(shù)據(jù)執(zhí)行join操作。遍歷兩張表的有序序列,從第一行開始,碰到相同join key就merge輸出,否則取更小一邊的下一個進(jìn)行對碰
SortMergeJoin.png
