第一章:上次课回顾
第二章:
第一章:上次课回顾
https://blog.csdn.net/zhikanjiani/article/details/100082667
第二章:
**第一步:**点击load,load是DataFrameReader(org.apache.spark.sql)
def load():sql.DataFrame
- spark.read.load()
点进去查看方法:
/**
* Loads input in as a `DataFrame`, for data sources that don't require a path (e.g. external
* key-value stores).
*
* @since 1.4.0
*/
def load(): DataFrame = {
load(Seq.empty: _*) // force invocation of `load(...varargs...)`
}
第二步:再点击1中的load:
DataFrameReader (org.apache.spark.sql) def load(paths: String*): sql.DataFrame
path后面跟的路径是一个可变参数,意思是可以跟很多路径
def load(paths: String*): DataFrame = {
if (source.toLowerCase(Locale.ROOT) == DDLUtils.HIVE_PROVIDER) {
throw new AnalysisException("Hive data source can only be used with tables, you can not " +
"read files of Hive data source directly.")
}
再点进source里面去看,
- private var source: String = sparkSession.sessionState.conf.defaultDataSourceName
点击defaultDataSourceName得到的如下:
- def defaultDataSourceName: String = getConf(DEFAULT_DATA_SOURCE_NAME)
再点进去:
- // This is used to set the default data source
val DEFAULT_DATA_SOURCE_NAME = buildConf(“spark.sql.sources.default”)
.doc(“The default data source to use in input/output.”)
.stringConf
.createWithDefault(“parquet”)
有一个参数spark.sql.sources.default,parquet是spark sql中的默认数据源。
spark中为什么要选择parquet的数据源?
spark1.5版本中查询文本格式和parquet格式的时间对比:
错误:
Shuffle的时候提示文件找不到,map端写完后在reduce端shuffle的时候拉不到数据。
spark挂了,会重新启动executor;
parquet的优势对于我们的查询有很多的帮助。
思考生产中为什么还是没有选择Parquet,而是选择了ORC?
启动Spark-shell终端,./spark-shell --master yarn
先启动application master,再启动一堆的container,启动一个spark-shell默认是两个executor,花了一分钟的时间;那申请200个exec tutor呢。
1)无法释放:
申请资源肯定是花费大量时间的,这些资源全部拿到开始跑,比如2000个task,1998个已经跑完了,还剩2个task由于数据倾斜的原因,迟迟不释放资源。
这种场景下就是对集群资源下的一种浪费
2)小任务:
比如申请executor花了1min,然而作业跑了只有20s,
3)如果有波峰波谷的花,无法去预估,如果公司资源本来就不够多呢,会造成资源吃紧和资源浪费。
假设我们读取一个hive的作业,大小100G,分区是1000,在spark.sql.shuffle.partitions中默认分区时200,这个给写死了;如何让作业共享。
Share:共享
每一个spark-shell共享一个SparkContext,
两种可以做到:JobServer、Livy
PK哥公司自研的共享平台:
Spark SQL: A compiler from queries to RDDs.
什么是RDD?
- Dependencies
- Partitions
- Compute functions
RDD Programming Model
是去构建一个DAG图的。RDD的不容易读,写完后过了一天可能就会忘了。
Spark SQL Come to Rescue
- More efficient:更高效的
- High-level-API:更高级的API
不仅仅是写更少的代码,执行的速度还能更快。
DataFrames Datasets and SQL share the same optimization/execution pipeline.
select sum(v)
from (
select
ti.id,
1 + 2 +t1.value AS v
FROM t1 JOIN t2
WHERE
t1.id = t2.id AND
t2.id > 50 * 1000) tmp
Expression:表达式
- an expression represents a new value, computed based on input values
- sum(v)
Query Plan:查询计划
Logical Plan:逻辑执行计划
Transform:
先filter还是先Join的性能好?
先filter再join的性能好