点一下关注吧!!!非常感谢!!持续更新!!!
目前已经更新到了:
- Hadoop(已更完)
- HDFS(已更完)
- MapReduce(已更完)
- Hive(已更完)
- Flume(已更完)
- Sqoop(已更完)
- Zookeeper(已更完)
- HBase(已更完)
- Redis (已更完)
- Kafka(已更完)
- Spark(新开的坑!正在更新!)
章节内容
上节我们完成了如下的内容:
- Kafka集群监控方案
- JConsole
- Kafka Eagle
- JavaAPI获取集群指标
简单介绍
在技术的不断迭代中,一路发展,三代技术引擎:
- MapReduce 昨天
- Spark 今天
- Flink 未来
MapReduce和Spark都是类MR的处理引擎,底层原理非常相似。
什么是Spark
Spark的发展历程如下图:
Spark特点
- 速度快,与MapReduce相比,Spark基于内存运算要快100倍以上,基于硬盘运算也要快10倍以上。Spark实现了高效的DAG执行引擎,可以通过基于内存来高效的处理流数据
- 使用简单,Spark支持Scala、Java、Python、R的API,还支持超过80种算法,使用户可以快速构建不同的应用。而且Spark支持交互式的Python和Scala的Shell,可以非常方便的在这些Shell中使用Spark集群来验证解决问题的方法
- 通用性好,Spark提供了统一的解决方案,Spark可以用于批处理、交互式查询(SparkSQL)、实时流处理(SparkStreaming)、机器学习(SparkMLlib)和图计算(GraphX)。这些不同类型的处理都可以在同一个应用中无缝衔接。Spark统一解决方案非常具有吸引力,企业想用统一的平台去处理遇到的问题,减少开发和维护人力的成本和部署平台的物力成本。
- 兼容性好,Spark可以非常方便的和其他开源的产品进行融合,Spark可以使用YARN、Mesos作为它的资源管理和调度器。可以处理所有Hadoop支持的数据,包括HDFS、HBase、Cassandra等。这对于已经部署Hadoop集群的用户特别重要,因为不需要任何的数据迁移就可以使用Spark。Spark也可以不依赖于其它第三方的资源管理和调度器,它实现了Standalone作为其内置的资源管理和调度框架,这样进一步降低了Spark的使用门槛,使得所有人可以非常容器的部署和使用Spark。
Spark与Hadoop
狭义上
从狭义上看:Hadoop是一个分布式框架,由存储、资源调度、计算三部分组成
Spark是一个分布式计算引擎,是由Scala编写的计算框架,基于内存的快速、通用、可扩展的大数据分析引擎。
广义上
从广义上看:Spark是Hadoop生态中不可或缺的一部分。
MapReduce不足
- 表达能力有限
- 磁盘IO开销大
- 延迟高:任务之间有IO开销,在前一个任务完成之前,另一个任务无法开始。
相对于Spark,Spark的设计要更高效,Spark在借鉴MapReduce优点的同时,很好的解决了MapReduce所面临的问题:
两者对比
Spark的计算模式也属于MapReduce,是对MR框架的优化。
- 数据存储结构:MapReduce是磁盘HDFS,Spark是内存构建的弹性分布式数据集RDD
- 编程范式:Map+Reduce表达力欠缺,Spark提供了丰富操作使数据处理代码很短
- 运行速度:MapReduce计算中间结果存磁盘,Spark中间结果在内存中
- 任务速度:MapReduce任务以进程,需要数秒启动,Spark是小数据集读取在亚秒级
实际应用
- 批量处理(离线处理):通常时间跨度在分钟到小时
- 交互式查询:通常时间跨度在十秒到数十分钟
- 流处理(实时处理):通常跨度在数百毫秒到数秒
在面对上述的三个场景中,我们通常的解决方案是:
- MapReduce
- Hive
- Impala 或 Storm
但是对应的也带来一些新的问题:
- 不同场景之间输入输出数据无法做到无缝共享,通常需要进行数据格式的转换、
- 不同的软件需要不同的开发和维护团队,带来了较高的维护和使用成本
- 比较难以通一个集群中的各个系统进行统一的资源协调和分配
系统架构
Spark运行包括如下:
- Cluster Manager
- Worker Node
- Driver
- Executor
ClusterManager
ClusterManager 是集群资源的管理者,Spark支持3中集群部署模式:
- Standalone
- YARN
- Mesos
WorkerNode
WorkerNode是工作节点,负责管理本地资源。
Driver Program
运行应用的 main() 方法并且创建了 SparkContext。由ClusterManager分配资源,SparkContext发送Task到Executor上执行。
Executor
Executor在工作节点上运行,执行Driver发送的Task,并向Driver汇报计算结果。
部署模式
Standalone
- 独立模式,自带完整的服务,可单独部署到一个集群中,无需依赖其他任何的资源管理系统,从一定程度上说,该模式是其他模式的基础
- Cluster Manager: Master
- WorkerNode:Worker
- 仅支持粗粒度的资源分配方式
SparkOnYARN
- YARN拥有强大的社区支持,且逐步成为大数据集群资源管理系统的标准
- 在国内生产环境中运用最广泛的部署模式
- SparkOnYARN 支持的两种模式:yarn-cluster(生产环境),yarn-client(交互和调试)
- Cluster Manager:ResourceManager
- WorkNode:NodeManager
- 仅支持粗粒度的资源分配方式
SparkOnMesos
- 官方推荐模式,Spark开发之初就考虑到了支持Mesos
- Spark运行在Mesos上会更加的灵活,更加自然
- ClusterManager:MesosMaster
- WorkNode: MesosSlave
- 支持粗粒度、细粒度的资源分配方式
粗粒度模式
Coarse-grained Mode:每个程序的运行由一个Driver和若干个Executor组成,其中每个Executor占用若干资源,内部可以运行多个Task。应用程序的各个任务正式运行之前,需要将运行环境中的资源全部申请好,且运行过程中需要一直占用着这些资源,即使不用,最后程序运行结束后,自动回收这些资源。
细粒度模式
鉴于粗粒度模式造成的大量资源的浪费,SparkOnMesos还提供了另一个调度模式就是细粒度模式。
这种模式类似于现在的云计算思想,核心是按需分配。
如何选择
- 生产环境中原则YARN,国内使用最广的模式
- Spark的初学者,Standalone模式,简单
- 开发测试环境可选Standalone
- 数据量不太大、应用不复杂,可使用Standalone
相关术语
- Application 用户提交的Spark应用程序,由集群中的一个Driver和许多的Executor组成
- ApplicationJAR 一个包含Spark应用程序的JAR,JAR不应该包含Spark或者Hasoop的JAR
- DriverProgram运行应用程序的main(),并创建SparkContext
- ClusterManager管理集群资源的服务,如Standalone、YARN、Mesos
- DeployMode区分Driver进程在何处运行,在Cluster模式下,在集群内部运行Driver,在Client模式下,Driver在集群外部运行
- Worker Node 运行应用程序的工作节点
- Executor 运行应用程序Task和保存数据,每个应用程序都有自己的Executors,并且和Executor相互独立
- Task Executors 应用程序的最小单元
- Job,在用户程序中,每次调用Action函数都会产生一个新的Job,也就是说每一个Action都会生成一个Job
- Stage,一个Job被分解为多个Stage,每个Stage是一系列Task的集合