spark安装与运行模式
Spark 的运行模式有 Local(也称单节点模式),Standalone(集群模式),Spark on Yarn(运行在Yarn上),Mesos以及K8s等常用模式,本文介绍前三种模式。
Spark-shell 参数
Spark-shell 是以一种交互式命令行方式将Spark应用程序跑在指定模式上,也可以通过Spark-submit提交指定运用程序,Spark-shell 底层调用的是Spark-submit,二者的使用参数一致的,通过- -help 查看参数:
sparkconf的传入有三种方式:
1通过在spark应用程序开发的时候用set()方法进行指定
2通过在spark应用程序提交的时候用过以上参数指定,一般使用此种方式,因为使用较为灵活
3通过配置spark-defaultconf,spark-envsh文件进行指定,此种方式较shell方式级别低
Local模式
Local 模式是最简单的一种Spark运行方式,它采用单节点多线程(cpu)方式运行,local模式是一种OOTB(开箱即用)的方式,只需要在spark-envsh导出JAVA_HOME,无需其他任何配置即可使用,因而常用于开发和学习
方式:/spark-shell - -master local[n] ,n代表线程数
Standalone模式
Spark on Yarn
on Yarn的俩种模式
客户端的Driver将应用提交给Yarn后,Yarn会先后启动ApplicationMaster和excutor,另外ApplicationMaster和executor都装在在container里运行,container默认的内存是1g,ApplicationMaster分配的内存是driver-memory,executor分配的内存是executor-memory同时,因为Driver在客户端,所以程序的运行结果可以在客户端显示,Driver以进程名为SparkSubmit的形式存在。
Cluster 模式
1由client向ResourceManager提交请求,并上传Jar到HDFS上
这期间包括四个步骤:
a)连接到RM
b)从RM ASM(applicationsManager)中获得metric,queue和resource等信息。
c)upload app jar and spark-assembly jar
d)设置运行环境和container上下文
2ResourceManager向NodeManager申请资源,创建Spark ApplicationMaster(每个SparkContext都有一个ApplicationManager)
3NodeManager启动Spark App Master,并向ResourceManager ASM注册
4Spark ApplicationMaster从HDFS中找到jar文件,启动DAGScheduler和YARN Cluster Scheduler
5ResourceManager向ResourceManager ASM注册申请container资源(INFO YarnClientImpl: Submitted application)
6ResourceManager通知NodeManager分配Container,这是可以收到来自ASM关于container的报告。(每个container的对应一个executor)
7Spark ApplicationMaster直接和container(executor)进行交互,完成这个分布式任务。
进入spark安装目录下的conf文件夹
[atguigu@hadoop102 module] mv slavestemplate slaves
[atguigu@hadoop102 conf] vim slaves
hadoop102
hadoop103
hadoop104
4)修改spark-envsh文件,添加如下配置:
[atguigu@hadoop102 conf]$ vim spark-envsh
SPARK_MASTER_HOST=hadoop102
SPARK_MASTER_PORT=7077
5)分发spark包
[atguigu@hadoop102 module] sbin/start-allsh
注意:如果遇到 “JAVA_HOME not set” 异常,可以在sbin目录下的spark-configsh 文件中加入如下配置:
export JAVA_HOME=XXXX
官方求PI案例
spark-submit
--class orgapachesparkexamplesSparkPi
--master spark://server-2:7077
--executor-memory 1G
--total-executor-cores 2
/home/xxx/software/spark-244-bin-hadoop27/examples/jars/spark-examples_211-244jar
100
spark-shell
--master spark://server-2:7077
--executor-memory 1g
--total-executor-cores 2
spark-shell --master spark://server-2:7077 --executor-memory 1g --total-executor-cores 2
参数:--master spark://server-2:7077 指定要连接的集群的master
Spark客户端直接连接Yarn,不需要额外构建Spark集群。有yarn-client和yarn-cluster两种模式,主要区别在于:Driver程序的运行节点。
yarn-client:Driver程序运行在客户端,适用于交互、调试,希望立即看到app的输出
yarn-cluster:Driver程序运行在由RM(ResourceManager)启动的AP(APPMaster)适用于生产环境。
安装使用
1)修改hadoop配置文件yarn-sitexml,添加如下内容:
2)修改spark-envsh,添加如下配置:
[atguigu@hadoop102 conf]$ vi spark-envsh
YARN_CONF_DIR=/opt/module/hadoop-272/etc/hadoop
3)分发配置文件
[atguigu@hadoop102 conf] xsync spark-envsh
4)执行一个程序
spark-submit
--class orgapachesparkexamplesSparkPi
--master yarn
--deploy-mode client
/home/xxx/software/spark-244-bin-hadoop27/examples/jars/spark-examples_211-244jar
100
注意:在提交任务之前需启动HDFS以及YARN集群。
日志查看
修改配置文件spark-defaultsconf
添加如下内容:
sparkyarnhistoryServeraddress=server-2:18080
sparkhistoryuiport=18080
2)重启spark历史服务
[atguigu@hadoop102 spark] sbin/start-history-serversh
starting orgapachesparkdeployhistoryHistoryServer, logging to /opt/module/spark/logs/spark-atguigu-orgapachesparkdeployhistoryHistoryServer-1-hadoop102out
3)提交任务到Yarn执行
spark-submit
--class orgapachesparkexamplesSparkPi
--master yarn
--deploy-mode client
/home/xxx/software/spark-244-bin-hadoop27/examples/jars/spark-examples_211-244jar
100
服务运行时将服务信息展示出来方便用户查看时服务易用性的重要组成部分。特别时对于分布式集群服务。
spark服务本身有提供获取应用信息对方法,方便用户查看应用信息。Spark服务提供对master,worker,driver,executor,Historyserver进程对运行展示。对于应用(driver/executor)进程,主要提供metric和restapi对访问方式以展示运行状态。
服务/进程通过Metric将自身运行信息展示出来。spark基于Coda Hale Metrics Library库展示。需要展示的信息通过配置source类,在运行时通过反射实例化并启动source进行收集。然后通过配置sink类,将信息sink到对应的平台。
以driver为例:driver进程启动metricSystem的流程:
SparkContext在初始化时调用 : MetricsSystemcreateMetricsSystem("driver", conf, securityManager)
然后等待ui启动后启动并绑定webui(executor则是初始化后直接启动)
metricsSystemstart()
metricsSystemgetServletHandlersforeach(handler => uiforeach(_attachHandler(handler)))
创建MetricConfig, val metricsConfig = new MetricsConfig(conf)
初始化MetricConfig,首先设置默认的属性信息:
propsetProperty("sinkservletclass","orgapachesparkmetricssinkMetricsServlet")
propsetProperty("sinkservletpath","/metrics/json")
propsetProperty("mastersinkservletpath","/metrics/master/json")
propsetProperty("applicationssinkservletpath","/metrics/applications/json")
加载conf/metricproperties文件或者通过sparkmetricsconf制定的文件。读取相关配置,metricsConfiginitialize()
在启动metricSystem时,则会注册并启动source和sink
registerSources()
registerSinks()
sinksforeach(_start)
默认启动对source如下:
可配置的source如下:
配置方法:修改$SPARK_HOME/conf目录下的metricsproperties文件:
默认相关source已经统计在列。可添加source为jvmsource。添加之后则相关进程的jvm信息会被收集。配置方法
添加如下行:
driversourcejvmclass=orgapachesparkmetricssourceJvmSource
executorsourcejvmclass=orgapachesparkmetricssourceJvmSource
或者sourcejvmclass=orgapachesparkmetricssourceJvmSource
source信息的获取比较简单,以DAGSchedulerSource的runningStages为例,直接计算dagscheduler的runningStages大小即可。override def getValue: Int = dagSchedulerrunningStagessize
通过这些收集的信息可以看到,主要是方便查看运行状态,并非提供用来监控和管理应用
Metric信息展示方法:
收集的目的是方便展示,展示的方法是sink。
常用的sink如下:
a) metricserverlet
spark默认的sink为metricsserverlet,通过driver服务启动的webui绑定,然后展示出来。ip:4040/metrics/json(ip位driver节点的ip)展示:由于executor服务没有相关ui,无法展示metricsource的信息。 下图是配置过JVMsource后,通过driver节点的看到的metric信息。
b) CSV方式(将进程的source信息,写入到csv文件,各进程打印至进程节点的相关目录下,每分钟打印一次):
sinkcsvclass=orgapachesparkmetricssinkCsvSink
sinkcsvperiod=1
sinkcsvdirectory=/tmp/
c) console方式(将进程的source信息写入到console/stdout
,输出到进程的stdout):
sinkconsoleclass=orgapachesparkmetricssinkConsoleSink
sinkconsoleperiod=20
sinkconsoleunit=seconds
d) slf4j方式(直接在运行日志中查看):
sinkslf4jclass=orgapachesparkmetricssinkSlf4jSink
sinkslf4jperiod=10
sinkslf4junit=seconds
e) JMX方式(此情况下,相关端口要经过规划,不同的pap使用不同的端口,对于一个app来说,只能在一个节点启动一个executor,否则会有端口冲突):
executorsinkjmxclass=orgapachesparkmetricssinkJmxSink
JMX方式在配置后,需要在driver/executor启动jmx服务。 可通过启动应用时添加如下操作实现--conf "sparkdriverextraJavaOptions=-Dcomsunmanagementjmxremote -Dcomsunmanagementjmxremoteport=8090 -Dcomsunmanagementjmxremotermiport=8001 -Dcomsunmanagementjmxremoteauthenticate=false -Dcomsunmanagementjmxremotessl=false --conf "sparkexecutorextraJavaOptions=-Dcomsunmanagementjmxremote -Dcomsunmanagementjmxremoteport=8002 -Dcomsunmanagementjmxremotermiport=8003 -Dcomsunmanagementjmxremoteauthenticate=false -Dcomsunmanagementjmxremotessl=false"
可通过jconsole工具链接至对应driver进程所在ip和端口查看jmx信息。
除例metrics之外,用户还可以通过restApi接口查看应用运行信息。可以查询的信息如下(参见 http://sparkapacheorg/docs/latest/monitoringhtml ):
运行中的应用:通过driver进程查看:
ip:port/api/v1/
其中Ip为driver所在节点ip,端口为4040 如果一个节点运行多个driver,端口会以此累加至4040,4041,4042 如:10123665:4041/api/v1/applications/application_1512542119073_0229/storage/rdd/23(on yarn 模式会自动跳转至如下页面)
对于运行完的应用,可通过jobhistory服务查看
此场景下,需要提交应用时打开eventlog记录功能
打开方法在应用的spark-defaultsconf中添加如下配置sparkeventLogenabled为true,sparkeventLogdir为hdfs:///spark-history 。
其中/spark-history可配置,需要和jobhistory进程的路径配置一致 ,该路径可通过historyserver页面查看。
ip:port/api/v1/(其中Ip为spark服务的jobhistory进程所在节点ip,默认端口为18080) 可通过如下方式访问:
Spark作为计算引擎,对于大数据集群来说,作为客户端向Yarn提交应用来完成数据的分析。所使用的资源一般在yarn控制之下。其应用场景并非作为服务端为其他组件提供服务。其所提供的信息通常是针对app级别,如job,stage,task等信息。一般的信息监控需求均可通过其ui页面查看。对于一些应用的运行情况,可通过restapi获取和分析。
进入其他战局。根据代号spark游戏官网介绍显示,在进入游戏时若显示战局人数已满,可以进入其他战局进行匹配游戏。《代号:Spark》一个服最长只能玩7天,7天结算一次,然后重新加入新的服务器开始求生。
SparkContext是spark功能的主要入口点。
SparkContext是Spark功能的主要入口,它代表了与Spark集群的连接,可以用于在集群上创建RDD、累加器、广播变量等。在Spark应用程序中,每个JVM里只能存在一个处于激活状态的SparkContext,在创建新的SparkContext之前必须调用stop()来关闭之前SparkContext。
在SparkContext的初始化过程中,Spark会分别创建DAGScheduler作业和TaskScheduler任务调度两级调度模块。可以说,SparkContext是Spark的入口,相当于应用程序的main函数。在一个JVM进程中可以创建多个SparkContext,但是只能有一个处于激活状态。
另外,SparkContext还可以与Spark的DAGScheduler和TaskScheduler进行交互,这两个调度器是Spark任务调度的核心部分。DAGScheduler负责将任务转化为DAG(有向无环图)形式,并根据数据依赖关系进行任务划分和调度。而TaskScheduler则负责将DAG中的任务分发给集群中的各个节点进行执行。
spark的起源和特点:
Spark是一个基于内存计算的开源集群计算系统,旨在让数据分析更加高速和高效。Spark于2009年由加州大学伯克利分校AMP实验室开发,并于2010年开源,2013年6月成为Apache孵化项目,2014年2月成为Apache顶级项目。
Spark使用了Scala语言进行编写,它不仅与Scala紧密集成,而且与Java、Python等编程语言也能够进行无缝集成。Spark采用了基于内存的分布式计算架构,使得它能更高效地处理大规模数据,同时支持多种计算模型,包括交互式查询和流处理等。
Spark的Web监控页面 在SparkContext中可以看到如下代码: 首先是创建一个Spark Application的Web监控实例对象: 然后bind方法会绑定一个web服务器: 可以看出我们使用Jetty服务器来监控程序的运行和显示Spark集群的信息的。
0条评论