Open mengxh1990 opened 6 years ago
http://litaotao.github.io/deep-into-spark-exection-model 资源: http://litaotao.github.io/spark-resouces-blogs-paper?s=inner RDD论文翻译:http://shiyanjun.cn/archives/744.html
创建spark application, spark通过分析优化代码,决定有几个job来完成这个application: 一个 job,就是由一个 rdd 的 action 触发的动作,可以简单的理解为,当你需要执行一个 rdd 的 action 的时候,会生成一个 job。 stage 是一个 job 的组成单位,就是说,一个 job 会被切分成 1 个或 1 个以上的 stage,然后各个 stage 会按照执行顺序依次执行。 task 是stage 下的一个任务执行单元,一般来说,一个 rdd 有多少个 partition,就会有多少个 task,因为每一个 task 只是处理一个 partition 上的数据。从 web ui 截图上我们可以看到,这个 job 一共有 2 个 stage,66 个 task,平均下来每个 stage 有 33 个 task,相当于每个 stage 的数据都有 33 个 partition [注意:这里是平均下来的哦,并不都是每个 stage 有 33 个 task,有时候也会有一个 stage 多,另外一个 stage 少的情况,就看你有没有在不同的 stage 进行 repartition 类似的操作了。] 从大到小: application -> job -> stage -> task, task是基本单元。 触发一个rdd的action和shuffle操作,都会划分一个stage。 分配task到worker机器上时,最好 把task分配到它处理partition所在的节点上,这样效率高。将任务分配到距离数据最近的节点上 一个stage就是一个TaskSet. stage是DAGScheduler生成的,DAG是有向无环图,所以stage也是有顺序的, stage中的各个task的计算逻辑是相同的,并行计算,有TaskScheduler提交。
一个spark beeline客户端进程就对应spark 服务节点上的application,输入的每一条sql对应一个job。 每个FI ResourceManager实例常驻一个spark application用来处理spark beeline里的任务。 Executor: 在每个 Worker Node 上为某应用启动的一个进程,该进程负责运行任务,并且负责将数据存在内存或者磁盘上:
SparkContext,简写sc: spark app 的起点和入口,一般用来加载数据集,生成第一个 rdd。 shuffle 是两个 stage 之间的数据传输过程。 rdd上的转换transform都是懒操作或者延迟操作,并不立即执行计算,而是在action时才执行计算。所以转换可以理解为定义rdd,需要的时候才生成。也可以通过cache或者persist把rdd缓存起来,不用每次转换都需重新计算。 基于工作集的应用(即多个并行操作重用中间结果的这类应用) pipeline是流畅不卡顿不停顿的流水操作,来一个分区就处理一个往下走一个,不会积累全部分区统一处理完了再往下走,窄依赖可以pipeline,宽依赖不会,因为窄依赖的子RDD分区只依赖常数个父RDD的分区,而宽依赖的子RDD每个分区依赖父RDD的所有分区。 org.apache.spark.rdd.RDD也是一个普通类: collect和toArray功能一样
可以理解为RDD的一种形式,可以等同于关系型数据库中的表。 一个 dataframe 可以被注册成一张数据表,然后用 sql 语言在上面操作,可以通过如下方式创建dataframe: 已有的RDD、结构化数据文件、JSON数据集、Hive表、外部数据库等。
在 spark 2.0 之前,sparkContext 是 Spark应用的入口。除了 sparkContext,还有 sqlContext,StreamingContext,HiveContext 等其他入口。然而到了 spark 2.0 后,因为逐渐要采用 DataFrame 和 DataSets 作为 API 使用,需要一个统一的入口点,所以就诞生了 SparkSession。本质上,可以简单的把 SparkSession 理解成 sparkContext, sqlContext, StreamingContext, HiveContext 的统一封装。
spark application的入口点,即entry point,提供与各种数据源的连接connection,在1.x的时代是基于SparkContext的sqlcontext, hivecontext等。在2.x版本中,为SparkSession. SparkSession屏蔽了sqlcontext,hivecontext等区别,统一API。sparksession实际上也是基于sparkcontext创建的。 RDD是分布式的Java对象的集合。DataFrame是分布式的Row对象(row是划分字段和字段类型的)的集合。
spark sql中的jdbc server对应Hive的hiveserver,也称为thriftserver。 spark sql在hive的基础上发展的,有些模块没有重复造轮子,用的Hive的模块,比如meta server,等。
Structured Streaming Spark Streaming structured streaming
掘金 https://juejin.im/post/5bf8dd7a51882507e94b8b15
窗口机制 http://wuchong.me/blog/2016/05/25/flink-internals-window-mechanism/
spark学习
http://litaotao.github.io/deep-into-spark-exection-model 资源: http://litaotao.github.io/spark-resouces-blogs-paper?s=inner RDD论文翻译:http://shiyanjun.cn/archives/744.html
基本概念
创建spark application, spark通过分析优化代码,决定有几个job来完成这个application: 一个 job,就是由一个 rdd 的 action 触发的动作,可以简单的理解为,当你需要执行一个 rdd 的 action 的时候,会生成一个 job。 stage 是一个 job 的组成单位,就是说,一个 job 会被切分成 1 个或 1 个以上的 stage,然后各个 stage 会按照执行顺序依次执行。 task 是stage 下的一个任务执行单元,一般来说,一个 rdd 有多少个 partition,就会有多少个 task,因为每一个 task 只是处理一个 partition 上的数据。从 web ui 截图上我们可以看到,这个 job 一共有 2 个 stage,66 个 task,平均下来每个 stage 有 33 个 task,相当于每个 stage 的数据都有 33 个 partition [注意:这里是平均下来的哦,并不都是每个 stage 有 33 个 task,有时候也会有一个 stage 多,另外一个 stage 少的情况,就看你有没有在不同的 stage 进行 repartition 类似的操作了。] 从大到小: application -> job -> stage -> task, task是基本单元。 触发一个rdd的action和shuffle操作,都会划分一个stage。 分配task到worker机器上时,最好 把task分配到它处理partition所在的节点上,这样效率高。将任务分配到距离数据最近的节点上 一个stage就是一个TaskSet. stage是DAGScheduler生成的,DAG是有向无环图,所以stage也是有顺序的, stage中的各个task的计算逻辑是相同的,并行计算,有TaskScheduler提交。
Driver与Executor
一个spark beeline客户端进程就对应spark 服务节点上的application,输入的每一条sql对应一个job。 每个FI ResourceManager实例常驻一个spark application用来处理spark beeline里的任务。 Executor: 在每个 Worker Node 上为某应用启动的一个进程,该进程负责运行任务,并且负责将数据存在内存或者磁盘上:
transformation与action
RDD
SparkContext,简写sc: spark app 的起点和入口,一般用来加载数据集,生成第一个 rdd。 shuffle 是两个 stage 之间的数据传输过程。 rdd上的转换transform都是懒操作或者延迟操作,并不立即执行计算,而是在action时才执行计算。所以转换可以理解为定义rdd,需要的时候才生成。也可以通过cache或者persist把rdd缓存起来,不用每次转换都需重新计算。 基于工作集的应用(即多个并行操作重用中间结果的这类应用) pipeline是流畅不卡顿不停顿的流水操作,来一个分区就处理一个往下走一个,不会积累全部分区统一处理完了再往下走,窄依赖可以pipeline,宽依赖不会,因为窄依赖的子RDD分区只依赖常数个父RDD的分区,而宽依赖的子RDD每个分区依赖父RDD的所有分区。 org.apache.spark.rdd.RDD也是一个普通类: collect和toArray功能一样
DataFrame
可以理解为RDD的一种形式,可以等同于关系型数据库中的表。 一个 dataframe 可以被注册成一张数据表,然后用 sql 语言在上面操作,可以通过如下方式创建dataframe: 已有的RDD、结构化数据文件、JSON数据集、Hive表、外部数据库等。
在 spark 2.0 之前,sparkContext 是 Spark应用的入口。除了 sparkContext,还有 sqlContext,StreamingContext,HiveContext 等其他入口。然而到了 spark 2.0 后,因为逐渐要采用 DataFrame 和 DataSets 作为 API 使用,需要一个统一的入口点,所以就诞生了 SparkSession。本质上,可以简单的把 SparkSession 理解成 sparkContext, sqlContext, StreamingContext, HiveContext 的统一封装。
spark application的入口点,即entry point,提供与各种数据源的连接connection,在1.x的时代是基于SparkContext的sqlcontext, hivecontext等。在2.x版本中,为SparkSession. SparkSession屏蔽了sqlcontext,hivecontext等区别,统一API。sparksession实际上也是基于sparkcontext创建的。 RDD是分布式的Java对象的集合。DataFrame是分布式的Row对象(row是划分字段和字段类型的)的集合。
SparkSubmit
spark sql中的jdbc server对应Hive的hiveserver,也称为thriftserver。 spark sql在hive的基础上发展的,有些模块没有重复造轮子,用的Hive的模块,比如meta server,等。
Structured Streaming Spark Streaming structured streaming