MR有什么问题?
调度慢,启动map、 reduce太耗时
计算慢,每一步都要保存中间结果落磁盘
API抽象简单,只有map和reduce两个原语
缺乏作业流描述,一项任务需要多轮mr
什么是spark?
– 也是一个分布式的并行计算框架
– spark是下一代的map-reduce,扩展了mr的数据处理流程。
– executor都是装载在container里运行,container默认内存是
1G(参数yarn.scheduler.minimum-allocation-mb定义)
– executor分配的内存是executor-memory,向YARN申请的内
存是executor-memory * num-executors。
– AM在Spark中叫driver,AM向RM申请的是executor资源,当分配完资源后,executor启动后,由spark的AM向executor分配task,分配多少task、分配到哪个executor由AM决定,可理解为spark也有个调度过程,这些task都运行在executor的坑里
– Executor有线程池多线程管理这些坑内的task
Spark解决了什么问题?
– 最大化利用内存cache
– 中间结果放内存,加速迭代
– 某结果集放内存,加速后续查询和处理,解决运行慢的问题
– 完整作业描述
– 将用户的整个作业穿起来。关键是这3行。 可以立即解释。不像mr那样,需要实现多个map和reduce脚
本,解决MR缺乏作业流描述问题
一个作业中描述完整的APP作业流
多语言SDK支持:Scala、 java、 python
spark的安装
…
验证Spark
• 本地模式
:
– ]# ./bin/run-example SparkPi 10 --master local[2]
• 集群模式 Spark Standalone
:
– ]# ./bin/spark-submit --class org.apache.spark.examples.SparkPi --master spark://master:7077
lib/spark-examples-1.6.0-hadoop2.6.0.jar 100
• 集群模式 Spark on Yarn 集群上yarn-cluster模式
:
– ]# ./bin/spark-submit --class org.apache.spark.examples.SparkPi --master yarn-cluster lib/sparkexamples-1.6.0-hadoop2.6.0.jar 10
• Spark standalone vs. Spark on Yarn
• Spark standalone:独立模式,类似MapReduce 1.0所采取的模式,完全由内部实现容错性和资源管理
• Spark on Yarn:让Spark运行在一个通用的资源管理系统之上,这样可以与其他计算框架共享资源
• Yarn Client vs. Spark Standlone vs. Yarn Cluster
• Yarn Client:适用于交互与调试
– Driver在任务提交机上执行
– ApplicationMaster只负责向ResourceManager申请executor需要的资源
– 基于yarn时,spark-shell和pyspark必须要使用yarn-client模式
• Yarn Cluster:适用于生产环境
• Yarn(通用)
– Master/Slave结构
• RM:全局资源管理器,负责系统的资源管理和分配
• NM:每个节点上的资源和任务管理器
• AM:每个应用程序都有一个,负责任务调度和监视,并与RM调度器协商为任务获取资源
• Standalone(Spark自带)
– Master/Slave结构
• Master:类似Yarn中的RM
• Worker:类似Yarn中的NM
spark和mapreduce作业之间的区别
• Hadoop中:
– 一个MapReduce程序就是一个job,而一个job里面可以有一个或多个Task,Task又可以区分为Map Task和Reduce Task
– MapReduce中的每个Task分别在自己的进程中运行,当该Task运行完时,进程也就结束
Spark中:
– Application:spark-submit提交的程序
– Driver:完成任务的调度以及和 executor和 cluster manager进行协调
– Executor:每个Spark executor作为一个YARN容器
(container)运行
– Job:和MR中Job不一样。 MR中Job主要是Map或者Reduce Job。而Spark的Job其实很好区别,一个action算子就算一个Job,比方说count,first等
– Task:是Spark中最新的执行单元。 RDD一般是带有partitions的,每个partition在一个executor上的执行可以认为是一个Task
– Stage:是spark中独有的。一般而言一个Job会切换成一定数量的stage。各个stage之间按照顺序执行
• Spark中:
– Application:由一个driver program和多个job构成
– Job:由多个stage组成
– Stage:对应一个taskset
– Taskset:对应一组关联的相互之间没有shuffle依赖关系的task组成
– Task:任务最小的工作单元
• Driver Program:
– (驱动程序)是Spark的核心组件
– 构建SparkContext(Spark应用的入口,创建需要的变量,还包含集群的配置信息等)
– 将用户提交的job转换为DAG图(类似数据处理的流程图)
– 根据策略将DAG图划分为多个stage,根据分区从而生成一系列tasks
– 根据tasks要求向RM申请资源
– 提交任务并检测任务状态
• Executor:
– 真正执行task的单元,一个Work Node上可以有多个Executor
Scala语言
Spark源码由Scala语言开发
• 变量定义:有两种变量val和var
• val 类似于Java里的final变量。一旦初始化后就不能再赋值。
• var 如同Java里面的非final变量。 var可以在它生命周期中被多次赋值。
• 与Java不同的是类型声明在变量后面
,用一个” :” 分隔
,如果没有指定变量类型,编译器将会自动推断
。
• 注意:当val被声明为lazy时,它的初始化将被推迟,直到首次取用它的值。
支持的数据类型:
复合类型:
– 数组(Array)、列表(List)、元组(Tuple)、集合(Set)、映射(Map)