概念

宽窄依赖

窄依赖:父RDD分区只对应一个子RDD分区,子RDD分区可以对应多个父RDD分区
宽依赖:父RDD分区对应多个子RDD分区

parallelism

parallelism则指的是在RDD进行reduce类操作的时候,默认返回数据的paritition数量(而在进行map类操作的时候,partition数量通常取自parent RDD中较大的一个,而且也不会涉及shuffle,因此这个parallelism的参数没有影响)。

Worker

一个Worker实例(SPARK_WORKER_INSTANCE)会启动一个JVM

Excector

是一个进程

坑搜集

stop-all.sh之后一定要jps看下master和worker都关闭了,再start-all。要不然会出现重复woker和master。
https://www.jianshu.com/p/0b2ea4cfdc8a

无法序列化问题

SparkContext和SparkSession不能传入类初始化的参数中,会报
java.io.NotSerializableException: org.apache.spark.SparkContext

原理

作业执行原理

划分调度阶段

Action对应一个Job对应一个DAG。DAG丢给DAGScheduler。DAGScheduler把DAG根据宽依赖切分成Stage,把Stage丢给TaskSheduler。TaskScheduler负责Task的失败重算和强占先算。
Action会隐式调用sc.runJob()来提交作业
DAGScheduler会从最后一个RDD开始向前广度优先遍历生成Stage。
Stage分为ResultStage和ShuffleMapStage

提交调度阶段

Shuffle

由于内存中需要保存海量文件操作句柄和临时信息,容易出现OOM错误。
Timsort
https://www.cnblogs.com/jcchoiling/p/6440102.html
https://www.cnblogs.com/itboys/p/9226479.html
https://www.cnblogs.com/itboys/p/9201750.html
http://sharkdtu.com/posts/spark-shuffle.html

读HDFS原理

https://www.jianshu.com/p/e33671341f0d
HadoopRDD类中的getPartitions决定分区数量
getPartitions会把Hadoop InputSplit转换成HadoopPartition

分区大小计算公式

goalSize用户期望大小、blockSize是HadoopBlock大小、minSize是Hadoop配置文件大小。

  1. return Math.max(minSize, Math.min(goalSize, blockSize));

配置

在spark-env.sh中配置
export JAVA_HOME=/usr/local/jdk1.8.0_131
export HADOOP_CONF_DIR=/root/apps/hadoop/etc/hadoop
设置HADOOP_CONF_DIR或者YARN_CONF_DIR,Spark就可以找到Yarn了

备忘

多Worker启动

spark-daemon.sh start org.apache.spark.deploy.worker.Worker

RDD操作备忘

rdd.keys和rdd.values分别返回key和value,rdd.mapValues回调参数是value,但是返回(k, v)。
sortBy基于sortByKey是transformation操作。

Spark+HBase

https://blog.csdn.net/u013468917/article/details/52822074
https://stackoverflow.com/questions/25040709/how-to-read-from-hbase-using-spark

多线程提交Job

hadoop FileSystem 多线程要小心会被一个线程关闭导致其他线程无法使用,原因是get返回可能从缓存中返回同一个对象。
http://www.udpwork.com/item/9869.html

On Yarn

Yarn-Cluster模式中Diver在ApplicationMaster进程中。
Spark 运行在 YARN 上时,不需要启动 Spark 集群,只需要启动 YARN即可!! YARN的 ResourceManager 相当于 Spark Standalone 模式下的 Master。
在Spark on Yarn的模式下,Hadoop Yarn的配置yarn.nodemanager.local-dirs会覆盖Spark的spark.local.dir !!!