概念
宽窄依赖
窄依赖:父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配置文件大小。
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 !!!