1-概述
ApacheSpark是一个用于大规模数据处理的统一分析引擎,它在Java、Scala、Python和R中的提供了高级api,以及一个支持通用执行图[generalexecutiongraphs]的优化引擎。它还支持一组丰富的高级工具,包括用于SQL和结构化数据处理的SparkSQL、用于机器学习的MLlib、用于图形处理的GraphX以及用于增量计算和流处理的结构化流。
在Spark2.0之前,Spark的主要编程接口是弹性分布式数据集(RDD)。在Spark2.0之后,RDDs被Dataset/DateFrame取代,它是像RDD一样的强类型,但在内部进行了更丰富的优化。RDD接口仍然受到支持,您可以在RDD编程指南中获得更详细的参考资料。但是,强烈建议您切换到使用Dataset/DataFrame,它比RDD具有更好的性能。有关Dataset/DataFrame的更多信息,请参阅SQL编程指南。
默认情况下,Spark中的安全性是关闭的。这可能意味着您在默认情况下容易受到攻击。运行Spark前请参阅Spark安全。
组件
Spark应用在集群中作为独立的一组进程集运行,由主程序中的SparkContext对象进行协调,主程序被称为driverprogram,即驱动程序。
Spark应用是在集群中运行的,SparkContext可以连接几种类型的集群管理器,比如spark自己的集群管理器standalone,Mesos,YARN,K8S等。集群管理器可以跨应用程序分配资源。一旦连接上集群管理器后,Spark在集群的节点上获得执行器,执行器是运行计算和存储数据的进程。下一步,Spark发送你的应用代码(在jar包或python文件中定义的,传递给SparkContext),最后SparkContext把任务发送到执行器中运行。
关于这个架构有几点需要注意:
每个应用程序都有自己的执行器进程。执行器在整个应用程序期间保持运行,并在多个线程中运行tasks。这样做的好处是可以将应用程序彼此隔离,不管是在调度方面(每个driver调度它自己的tasks)还是执行器方面(不同应用的tasks运行在不同的JVM)。这也意味着如果不将数据写入外部存储系统,就不能在不同的Spark应用(SparkContext实例)中共享数据。
Spark与底层集群管理器无关,只要集群管理器能够获得executor,且executor进程之间相互通信,即使在支持其他应用程序(如Mesos/YARN)的集群管理器上运行也是相对容易的。
驱动程序必须在其整个生命周期中侦听并接受来自执行器的连接(参考spark.driver.portinthenetworkconfigsection)。因此驱动程序必须能被工作结点访问到。
因为驱动程序在集群上调度任务,它应该在靠近工作节点的地方运行,最好在同一局域网络上。如果想远程发送请求到集群,最好是打开一个RPC,让驱动程序从附近提交操作,而不是在离工作节点很远的地方运行驱动程序。
集群管理器类型
Spark目前支持下面几个集群管理器:
Standalone-spark自带的一个简单的集群管理器,可以很容易的部署。
ApacheMesos-一个通用的集群管理器,此管理器也可以运行HadoopMapReduce和服务应用。
HadoopYARN-Hadoop2的资源管理器
Kubernetes-用于自动化部署、扩展和管理容器化应用程序的开源系统
提交应用程序
使用spark-submit脚本可以把应用提交到集群,详情参考应用提交指南。
监控
每个驱动程序都有一个WebUI,默认使用端口,界面会展示一些信息包括正在运行的tasks,executors,storageusage。在浏览器打开