运行该模式非常简单,只需要把Spark的安装包解压后,改一些常用的配置即可使用,而不用启动Spark的Master、Worker守护进程( 只有采用集群的Standalone方式时,才需要这两个角色),也不用启动Hadoop的各服务(除非要用到HDFS文件系统)。 Spark不一定非要跑在hadoop集群,可以在本地,起多个线程的方式来指定。将Spark应用以多线程的方式直接运行在本地,一般都是为了方便调试,本地单机模式分三类: local: 只启动一个executor local[k]: 启动k个executor local[*]: 启动跟cpu数目相同的 executor
即独立模式, 自带完整的服务,可单独部署到一个集群中,资源管理和任务监控是Spark自己监控,无需依赖任何其他资源管理系统。这个模式也是其他模式的基础. 不使用其他调度工具时会存在单点故障,使用Zookeeper等可以解决
这是一种最有前景的部署模式。但限于YARN自身的发展,目前仅支持**粗粒度模式(**Coarse-grained Mode)。这是由于YARN上的Container资源是不可以动态伸缩的,一旦Container启动之后,可使用的资源不能再发生变化,不过这个已经在YARN计划中了。
考虑到尽量用一个统一的资源调度模式来运行多种任务, 这样可以减轻运维的工作压力, 同时也可以减少资源调度之间的配合(基于集群考虑)
这是很多公司采用的模式,官方推荐这种模式(当然,原因之一是血缘关系)。正是由于Spark开发之初就考虑到支持Mesos,因此,目前而言,Spark运行在Mesos上会比运行在YARN上更加灵活,更加自然。目前在Spark On Mesos环境中,用户可选择两种调度模式之一运行自己的应用程序:
1)、 粗粒度模式(Coarse-grained Mode):每个应用程序的运行环境由一个Dirver和若干个Executor组成,其中,每个Executor占用若干资源,内部可运行多个Task(对应多少个“slot”)。应用程序的各个任务正式运行之前,需要将运行环境中的资源全部申请好,即使不用, 运行过程中也要一直占用这些资源,,最后程序运行结束后,回收这些资源。
2)、细粒度模式(Fine-grained Mode):鉴于粗粒度模式会造成大量资源浪费,Spark On Mesos还提供了另外一种调度模式:细粒度模式,这种模式类似于现在的云计算,思想是按需分配。 与粗粒度模式一样,应用程序启动时,先会启动executor,但每个executor占用资源仅仅是自己运行所需的资源,不需要考虑将来要运行的任务,之后,mesos会为每个executor动态分配资源,每分配一些,便可以运行一个新任务,单个Task运行完之后可以马上释放对应的资源。每个Task会汇报状态给Mesos slave和Mesos Master,便于更加细粒度管理和容错,这种调度模式类似于MapReduce调度模式,每个Task完全独立,优点是便于资源控制和隔离,但缺点也很明显,短作业运行延迟大。
Docker是一种相比虚拟机更加轻量级的虚拟化解决方案,所以在Docker上搭建Spark集群具有可行性。
需要通过公司需求和运行速度来综合衡量
standalone模式
1.考虑到尽量用一个统一的资源调度模式来运行多种任务, 2.这样可以减轻运维的工作压力, 3.同时也可以减少资源调度之间的配合(基于集群考虑)
1、client向ResourceManager注册并提交任务 2、ResourceManager向NodeManager进行通信,开始在某个NodeManager启动AppMaster 3、AppMaster启动后开始向ResourceManager申请资源 4、ApplicationManager开始资源调度,开始通知NodeManager启动YarnChild 5、YarnChild开始和AppMaster进行通信,AppMaster对所有YarnChild进行监控 6、MR执行完成以后,YarnChild被AppMaster回收,AppMaster把自己回收掉
Standalone的模式下,spark的资源管理和调度是自己来管理和调度的,主要由master来管理。
ResourceManager
NodeManager
ApplicationMaster
Container(资源)
Task
Hadoop集群上面 Yarn执行任务的流程:
Client提交任务给resourceManager,resourceManager会选择一台机器开启一个container,在container里面开启一个applicationaster服务进程,applicationMaster进行任务的管理和调度,applicationMaster会向resourceManager申请资源,resourcemanager会在其他的机器上开启container进行资源分配。applicationMaster在resourcemanager分配的资源进行任务调度,在container里面运行task(map和 reduce)
Spark集群基于yarn的时候任务的执行流程:
(1)client模式
Client提交任务给resourceManager,在提交任务的时候,在提交任务的那台机器上面开启一个driver服务进程,resourcemanager在接收到client提交的任务以后,在集群中随机选择一台机器分配一个container,在该container里面开启一个applicationmaster服务进程,driver去找applicationmaster,applicationmaster去找resourcemanager申请资源,resourcemanager会分配container,在其中开启excuter,excuter会反向向driver注册,driver把task放入到excuter里面执行。
(2)Cluster模式
Spark集群会在集群中开启一个driver,此时开启就是applicationmaster和driver合二为一了。其他的都相同。
注:Standalone和yarn上运行的业务的执行流程都是相同的,只是资源的分配和管理的方式不一样了。
方式类似yarn
见《hive优化(最全)》
parquet发展 parquet是面向分析型业务的列式存储格式,由Twitter和Cloudera合作开发, Parquet的灵感来自于2010年Google发表的Dremel论文,文中介绍了一种支持嵌套结构的存储格式,并且使用了列式存储的方式提升查询性能,在Dremel论文中还介绍了Google如何使用这种存储格式实现并行查询的。
官网介绍 无论数据处理框架,数据模型或编程语言的选择如何,Apache Parquet都是Hadoop生态系统中任何项目可用的列式存储格式。
特点 1、可以跳过不符合条件的数据,只读取需要的数据,降低IO数据量。 2.压缩编码可以降低磁盘存储空间。。 3.只读取需要的列,支持向量运算,能够获取更好的扫描性能。
一个Parquet文件是由一个header以及一个或多个block块组成,以一个footer结尾。 header中只包含一个4个字节的数字PAR1用来识别整个Parquet文件格式。 文件中所有的metadata都存在于footer中。footer中的metadata包含了格式的版本信息,schema信息、key-value paris以及所有block中的metadata信息。 footer中最后两个字段为一个以4个字节长度的footer的metadata,以及同header中包含的一样的PAR1。
《Nginx 介绍》