spark运行架构
首先在分布式环境下,spark集群采用的主/从结构,即在一个集群中有一个节点负责中央协调,协调个分布式工作节点,这个节点被称为驱动器节点(Driver),与之对应的工作节点被称为驱动器节点(executor)
spark应用通过一个叫做集群管理器的外部服务在集群中的机器上启动。spark自带的集群管理器被称为独立集群管理器。除此之外还可以运行在hadoop的yarn和apache mesos上。
驱动器节点(driver)
driver驱动器执行的是你的代码中的main()方法,它执行用户编写的用来创建sparkcontext、创建RDD、转化RDD等操作的代码。主要负责两个职责。
- 把用户程序转化为任务
从上层上来开,所有的spark程序从数据输入创建RDD,在使用转化操作派生出新的RDD,最后使用行动操作收集或存储结果RDD,spark程序都隐形的生成了一个由操作组成的逻辑上的有向无环图,当驱动器程序运行时,它会把这个逻辑图转化为实际的物理执行计划。
spark会对这些逻辑执行计划进行一些优化,生成一系列步骤,每个步骤都是由多个任务组成,这些任务会被打包并发送到集群上。任务时spark中最小的工作单元。 - 为执行器节点调度任务
当执行器进程启动后,会向驱动器进程注册自己,因此,驱动器程序始终对所有执行器节点有完整的记录。每个执行器节点都代表一个能够处理任务和存储RDD的进程。
驱动器程序会尝试按照数据所在位置将任务分配给执行器进程。当任务执行时,执行器进程会把缓存数据存储下来。驱动器程序也会追踪这些缓存数据,为以后的任务分配最基础,以减少数据之间的网络传输。
执行器节点(executor)
执行器节点属于工作进程,负责在spark作业中运行任务,任务之间相互独立。spark应用启动时,执行器节点就会被启动
- 负责运行组成spark应用的任务,并将结果返回给驱动器进程。
- 通过自身的块管理器为用户程序中要求缓存的RDD提供内存式存储。
使用spark-submit部署应用
bin/spark-submit my_script.py
上面是最简单的示例,除了提交的.py脚本以外,没有设置任何参数,这个py程序只会在本地运行。
常见的设置参数
标记 | 描述 |
---|---|
–master | 表示要连接的集群管理器,可选yarn,local[N],mesos://host:port |
–deploy-mode | 可选client/cluster,表示选择在本地或者集群上启动驱动器程序,默认本地运行 |
–class | 运行Java或Scala程序是应用的主类 |
–name | 应用的显示名,会显示在spark的网页用户界面中 |
–jars | 需要上传并放在应用的CLASSPATH中的JAR包的列表。如果应用依赖于少量第三方的jar包,可以放在这个参数中 |
–files | 需要放到应用工作目录中的文件的列表,这个参数一般用于放需要分发到各节点的数据文件 |
–py-files | 需要添加到PYTHONPATH中的文件的列表 |
–executor-memory | 执行器进程使用的内存量,以字节为单位 |
–driver-memory | 驱动器进程使用的内存量 |
bin/spark-submit --master yarn --executor-memory 10g my_script.py
在yarn上运行spark
需要设置指向你的Hadoop配置目录的环境变量
export HADOOP_CONF_DIR = '...'
spark-submit --master yarn yourapp
sparkconf配置
conf = SparkConf() \
.setAppName("myapp") \
.setMaster("yarn") \
.set('spark.yarn.queue', "root.adhoc") \
.setExecutorEnv('PYTHONPATH', 'pyspark.zip:py4j-0.10.4-src.zip') \
.set('PYSPARK_PYTHON', '/usr/loacal/anaconda2/bin/python2.7')
conf.set("spark.executor.memory", "5g")
conf.set("spark.driver.memory","10g")
conf.set("spark.executor.cores","2")
conf.set("spark.dynamicAllocation.maxExecutors","5")
conf.set("spark.driver.maxResultSize","0")
conf.set("spark.dynamicAllocation.enabled","true")
conf.set("spark.shuffle.service.enabled", "true")
conf.set("spark.shuffle.service.port", "7338")
sc = SparkContext(conf=conf)
sqlContext = SQLContext(sc)
spark = SparkSession(sc)