SparkCore4

来源:互联网 发布:淘宝键盘 编辑:程序博客网 时间:2024/05/20 13:09

1.为什么要有shuffle的,shuffle所带来的性能开销,hash sort 与tungten- sort的实现类是一样的,
shuffle过程的参数调优的,mapTask读取数据的buffer大小,reduceTask拉取数据的buffer大小,reduceTask是要经过网络传输的,网络传输的重试机制,重试多少次,每隔多久重试的,
HashShuffleManager中的consolidate的合并机制。否则中间的磁盘文件是非常多的。
SortShuffleManager中的中间有data磁盘文件和index索引文件的。
最终shuffle输出的文件个必然和计算公式是一样的。
以WordCount为例来调整textFile中partition大小,和reduceByKey中的partition大小。HashShuffleManager和SortShuffleManager去shuffle文件目录中查取。
生产上这些task个数都是要进行调优额,task少非常慢,task多小文件多。生产中是有非常非常讲究的。

Spark监控:调优的一个重要的前置条件。
Monitoring 监控:
There are serveral ways to monitor spark applications:web UIs,metrics,and external instrumentation
metrics需要整合其他的框架进行使用的。

web UIs中的port4040是由自动增长的机制的额,增长多少个是由阈值控制的。spark1.x中阈值是32的。有参数控制的,生产中的32个是不够的,32个作业的,生产过程中的port肯定要多的。一定要调整的。
a list of scheduler stages and tasks
wc:一个job俩个stage,mapTask2 reduceTask5
a summary of RDD sizes and memory usage
RDD中的记录数,文件的大小
mapTask中的InputSize/Records读取多少的数据
mapTask中的ShuffleWriteSize/Records写出去
这是调优的点至少可以知道数据进来多少了。
一分钟7亿条数据。
没有cache的是4040页面中Storage是没有的。
做了cache算子则页面上4040Storage是有显示的信息的。
Environmental information
Runtime Information运行时的信息
SparkProperties:Spark的应用程序内置的,或者是通过外部–conf传进来的
spark.app.id 取决于运行模式的额
local模式的作业是以local开头的+时间戳
standalone模式的作业是application
yarn模式的作业的是以application开头的。

spark.app.name===Spark Shell脚本中传进来的。
spark.driver.hostname
spark.dirver.port云主机的端口是有控制的。
spark.eventLogdir
spark.eventLog.enables
spark.executor.id=driver本地进行跑的作业的,driver和executor都是在一块的。
spark.home
spark.jars对应于–jars的。
spark.local.dir=/home/hadoop/data/shuffle自己配置的shuffle输出的文件的路径的。默认是在tmp目录下的。
spark.master对应于–master的参数的。
spark.scheduler.mode=FIFO
spark.shuffle.manager=sort可以在spark-defaults.conf配置文件进行配置的。

spark.sql.catalogImplementation=hive
spark.submit.deployMode=client

SystemProperties:可以不用关注的。JVM和操作系统的配置信息
Classpath Entries:在使用Spark的时候哪些东西是要自动传上去的,进入到Spark的运行中。
上传conf配置文件,conf下的hive-site.xml连接hive的。
jars中的所有的jar包上传的,很多的jar都要进行上传的。这种方式是不好的额,生产中是要放在HDFS上的,提交作业的时候spark on yarn 会自动的去目的地取的,不需要进行上传分发的。性能上要好的,找下参数的–jars
spark1.x中有个lib/assembly的jar的
spark2.x中是在jars中的。
Information about the running executors
4040页面上executors上,
Active RDD Blocks
Shuffle Read
Shuffle Write
DAG Visualization
Summary Metrics for completed Tasks
Duration
GC time数据量大的时候还是会有GC的处理的。GCtime是调优的非常重要的一个点的,内存参数设置不好的话,GCtime的时间是非常长的,我们要做的就是要大幅度地进行降低GCtime的,0.1-几秒的时间之内的。超过10秒的无法接受的。
GC的时候会stop the world,暂停业务的,Shuffle的过程是拉取不过来那个mapTask处理的数据的。
GC的时候可以设置重试机制,间隔以及次数的。

mapTask中读取数据量的参数Input Size/Records读入的数据量的,数据量大的时候MapTask是非常大的,成千上百的。某些MapTask中的task处理的数据超过了其他的task处理的数据就会有数据倾斜的。

web UI:http://:4040
Exectors界面上有显示driver的IP地址
if multiple SparkContext are running on the same host,they will bind to successive ports beginning with 4040。

Note that this information is only available for the duration of the application by default.作业运行的时候是可以访问到4040页面的,当作业运行结束后,4040页面是打不开的。

To view the web UI after the fact,set
spark.eventLog.enabled to true before starting the application ,this configures Spark to log Spark events that encode the information displayed in the UI to persisted storage.
设置spark.eventLog.enabled=true

作业运行完毕后,生命周期就会结束的额,UI打不开了,就要启用history-server的服务的。
It is still construct the UI of an application through Spark’s history server,provided that the application’s event logs exists
you can start the history server by executing:
./sbin/start-history-server.sh
MapReduce中的那个Job-histroy-server的开启,定位问题进行调优的,

spark中的historyServer的原理:
1.application在运行的时候,把event log记录到某个地方的,写的操作目录跟读的操作的目录是可以不在同一个目录路径下的。
2.historserver在使用的时候去那个地方将日志加载进来进行渲染的。读的操作的目录路径可以跟写的操作目录路径是不同的目录路径的。
启动historyServer的,./sbin/start-history-server.sh
this creates a web interface at http://:18080 by default,listing incomplete and completed applications and attempts
when using the file-system provider class 当我们的event-log存放在文件系统中额,historyServer读取的时候,要存在从文件系统中加载event-log的读取的spark.history.provider
the base logging directory must be supplied in the spark.history.fs.logDirectory configuration option ,and should contains sub-directories that each represents an application’s event logs
spark.eventLog.enabled=true开启event-log的
spark.history.fs.logDirectory表示的historyServer去文件系统fs中的哪个目录进行读取的

the spark jobs themselves must be configured to log events and to log them to the same shared,writable directory.if the server was configured with a log directory of hdfs://namenode/shared/spark-logs ,then the client-side options would be :
spark.eventLog.enabled=true
spark.eventLog.dir=hdfs://namenode/shared/spark-logs

the spark history server can be configured as follows:
SPARK_DAEMON_MEMORY:memory to allocate to the history server ,default 1g的,什么样的场景下需要进行放大SPARK_DAEMON_MEMORY这个内存参数的,job比较多的时候,作业是一个长服务的,开启了server类型的服务,典型的ThriftServer启动之后,ThriftServer是一天重启一次的,对于这主公长连接的服务的每天的日志内容是非常多的,日志多的情况下还要扩大SPARK_DAEMON_MEMORY内存参数的,否则的话是打不开的。

SPARK_DAEMON_JAVA_OPTS
SPARK_PUBLIC_DNS
SPARK_HISOTRY_OPTS表示的是spark.history.* configuration options for the history server,default none
sparkConfiguration Options:
spark.history.provider=org.apache.spark.deploy.history.FSHistoryProvider用来解析hdfs上的even-log的。本地也是可以的。
spark.history.fs.logDirectory=file:/tmp/spark-events这个目录一般的情况下是配置在hdfs上的。
spark.history.fs.update.interval=10s 更新的频率是多少的。日志写到HDFS上的额,historyServer进去读取日志文件,间隔多久去读取日志文件的。
the period at which the filesystem history provider checks for new or updated logs in the log directory.

spark.history.retainedApplications=50的理解

spark.history.ui.maxApplications=Int.MaxValue
spark.history.ui.port=18080
如果所有的spark的日志信息都写到了HDFS上了,那么运行时间久了那些旧的日志文件怎么办的,HDFS上的东西肯定是要进行清理的,不可能无限制的增加的。小文件的合并机制的。
日志文件一定是要有删除的额,定期的进行删除日志文件的
spark.history.fs.cleaner.enabled=false
spark.history.fs.cleaner.interval=1d间隔多久去删除
spark.history.fs.cleaner.maxAge=7d清理最大的
specifies whether the history server should periodically clean up event logs from storage
How often the fileSystem job history cleaner checks for files to delete,Files are only deleted if they are older than spark.history.fs.cleaner.maxAge:Job history files older than this will be deleted 文件的时间比当前时间的有7天之外的。

参数的使用:配置$SPARK_HOME/conf/spark-defaults.conf
spark.eventLog.enabled true
spark.eventLog.dir hdfs://hadoop000:8020/spark_log

$SPARK_HOME/sbin下放置着server服务的配置额:
启动historyserver的
./start-history-server.sh
hdfs dfs -rmr /spark_log
hdfs dfs -mkdir /spark_log
hdfsf dfs -ls /spark_log
启动HistoryServer服务的时候:
CausedBy:java.io.FileNotFoundException:Log directory specified does not exists:file:/tmp/spark-events
did you configure the correct one through spark.history.fs.logDirectory没有配置这个参数spark.hisotry.fs.logDirectory

vim $SPARK_HOME/conf/spark-env.sh
使用SPARK_HISTORY_OPTS “-Dx=y”
SPARK_HISTORY_OPTS =”-Dspark.history.fs.logDirectory=hdfs://hadoop000:8020/spark_log”

再次的启动historyServer
./sbin/start-history-server.sh
jps -m
jps -l
historyServer服务启动的是org.apache.spark.deploy.history.HistoryServer
源码中的HistoryServer翻阅的。
HistoryServer服务中的main函数中肯定有一个服务器的,启动在18080的端口上的

./start-history-server.sh启动服务的时候:
starting org.apache.spark.deploy.history.HistoryServer,logging to /home/hadoop/app/spark-2.2.0-bin-2.6.0-cdh5.7.0/logs/spark-hadoop-org.apache.spark.deploy.history.HistoryServer.out日志信息,善于观察日志信息的,所有的东西记录都是可以在日志中进行查找出来的。

Successfully started service on port 18080

sc.stop调用的,否则页面上是无法显示的。
作业:
spark.history.retainedApplications的理解的
测试spark on yarn以及standalone模式的在historyServer上的使用的。
local模式:local-xxxxx
standalone:…..作业的名称是什么样的。作业名称是知道运行模式的,
yarn:………

问题:难道所有的东西都通过HistoryServer的18080页面进行肉眼查看吗?
spark推出了一套RestfulAPI的使用的,
in addition to viewing the metrics in the UI,they are available as JSON, this gives developers an easy way to create new visualizations and monitoring tools for Spark,
借助于Restful已有的接口返回的数据来自己构建自己的监控系统的。
the JSON is available for both runnig applications and in the history server
for the history server:http://:18080/api/v1
for running application:http://localhost:4040/api/v1
Endpoints:
/applications
http://:18080/api/v1/applications通过RESTFUL方式进行构建你自己的监控页面的。zookeeper方式进行构建的或者是一种查询的页面方式的
http://:18080/api/v1/applications?status=completed|running

http://:18080/api/v1/applications/app-id/jobs/job-id

RESTAPI的实现就是去HDFS上读取event-log日志的文件。
hdfs dfs -ls /spark_log
/spark_log/作业的名称的+时间戳
hdfs dfs -text /spark_log/作业的名称+时间戳
json的数据的
json在线解析工具 解析一下拷贝的数据
每一个json都是一个event,配置有监听器的,监听数据的信息状态的。
shuffle read/write信息的,
event-log的所有的信息都是存在HDFS上的,
不同的event的类型通过json解析出来的,
页面上的所有的信息在event-log中全部都有的,RESTAPI就是读取HDFS上的event-log的信息解析json的信息即可的。
如何开发自定义的spark监控系统的:
监控所有的运行的applications信息,
一个表,每一行一个application
按钮view jobs,查看每个application对应的jobs,发送的请求http://:18080/api/v1/applications/app-id/jobs
applications
jobs
stages
做三层的请求服务。
爬html页面的,解析html页面的额,
用RESTAPI简单点的。
JavaWeb的东西:
技术选型,springBoot/Servlet+httpClient
HttpClient发送请求的,封装好了Request和Response,

思路要有的,如何做一个完整的,做一个设计的文档的,做哪些东西的,想好列出来的,
关键点是借助于RESTAPI的,我们相当于是做了一次转发的,我们的请求不是发送到Server端的,而是发送到我们的Spark服务上的。在我们的代码里面调用HistoryServer的,
1,我们的代码调用REST接口的,请求HistoryServer的是有风险的,万一不通了挂掉了怎么办的,怎么办的,所以会涉及到一个Cache的机制的。当我们请求的到REST接口的时候,我们就放到Cache里面的。类似一个Map的,拿到就拿,拿不到就去另外一个地方拿的。
拿到就从REST接口中拿,拿不到就从Cache缓存中拿。
Cache是有时间的timestamp的,

metrics跟第三方联系的,可以对接我们的ConsoleSink的,CSVSink的,Gangliasink:sends metrics to a Ganglia node or multicast Group
页面的监控的。

Spark on Yarn
support for running on yarn was added to spark in version 0.6.0
mesos是最开始的模式的,local,standalone,yarn的模式的
代码是完全一样的,只是spark-submit –master来决定不同的运行模式的。

Lanuching spark on yarn模式时候一定要进行配置如下的来个参数的其中一个的。
HADOOP_CONF_DIR
YARN_CONF_DIR:都是指向$HADOOP_HOME/etc/hadoop下的。

spark-submit –master yarn –class org.apache.spark.examples.SparkPi
–deploy-mode cluster
–executor-memory 1g
–executor-cores 1
–queue yarn
lib/spark-examples.jar 10

报错的:Exception in thread main java.lang.Exception when running with master ‘yarn’ either HADOOP_CONF_DIR or YARN_CONF_DIR must be set in the environment
使用export的方式进行也是可以的:
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/conf

启动的过程时候会uploading file以及jar的,很是耗费性能的。
启动过程的日志分析:
Added JAR file:上传到环境中去的。
Connecting to ResourceManager连接到ResourceManager8032的端口。
Requesting a new application from cluster with 1 nodemanager
1nodemanager是指向executor-memory=1g的,
spark-submit –help
–num-executors=default 2默认的是2的,
第一步申请的ApplicationMaster的,每一个作业对应一个ApplicationMaster的,ApplicationMaster是作为一个运行在NodeManager中的Container的,第一件事情是申请NodeManager给ApplicationMaster用的额,
检查一下应用程序有没有足够的资源的。
verifying our application has not requested more than the maximum memory capability of the cluster
为ApplicationMaster分配资源的。
allocate AM container with 896MB memory including 384MB overhead
作业:源码中寻找出处,Will allocate AM container,with 896MB memory including 384MB overhead
setting up container launch context for our AM
setting up the launch environment for our AM container
preparing resources for our AM container

neither spark.yarn.jars not spark.yarn.archive is set, falling back to uploading libraries under SPARK_HOME

uploading resource file上传所有的jar包的。
jars全部上传到HDFS上去的,传到一个文件夹上去的,然后通过spark.yarn.jars进行指定的,或者是spark.yarn.archive来进行指定的。

作业:将界面上显示的jars包全部上传到HDFS上的,通过spark.yarn.jars或者是spark.yarn.archive进行指定的。如果配置了,则日志是没有uploading resource file这些信息日志的。而是原目标相同不做拷贝操作的。
在生产中的优化点的,必须要进行这么做的,把所有的jars上传到HDFS上的,不可能每次提交作业的时候一个一个的上传分发之类的,

submitting application to ResourceManager
申请资源ACCEPTED的状态的,ACCEPTED之后就到了RUNNING的状态了。
SUBMITTED ACCEPTED RUNNING
FINISHED FAILED KILLED

export HADOOP_CONF_DIR=/home/hadoop/software/compile../etc/hadoop
export的作用域是当前的Session的。
建议配置到spark-env.sh里面去的。
HADOOP_CONF_DIR=/home/hadoop/software/compile/hadoop-2.6.0-cdh5.7.0/etc/hadoop

spark on yarn client/cluster
spark-shell –master yarn-cluster
Error:Cluster deploy mode is not applicable to spark shells
spark-sql/spark-shell这种交互式的命令行操作是不能够以cluster运行的。

spark on yarn的流程:
一种是client的:
driver就是一个spark程序打成了jar包的额,用spark-submit提交的时候的一个main类,一个main类一个进程的。driver在client上是运行在本地的。

一种是cluster的:
driver是跑在ApplicationMaster里面的

spark代码打包的,client模式的
driver是在本地运行的。driver是在提交作业的机器上的。
跑在yarn上的第一件事情就是申请启动ApplicationMaster的。到了ResourceManager之后,ResourceManager启动ApplicationManager必须要先拿到一个Container的,去找NodeManager启动用一个Container运行ApplicationMaster的,

ApplicationMaster向ResourceManager申请资源申请Executor申请Container的,要多少的Executor是取决于–num-executors参数值的。
则ApplicationMaster就知道在哪些NodeManager上去启动Executor了,向NodeManager申请启动Executor的进程。
Driver有了,Executor有了,
Executor跟Driver有通信的。
否则的话Driver的作业怎么发送到Executor上的。
Executor会反向的注册到Driver端的。

把我们的作业提交到Executor上去执行就可以了。

ApplicationMaster就是去ResourceManager拿资源,拿到资源去NodeManager上启动就可以了。

ApplicationMaster会去ResourceManager申请资源的,然后在对应的NodeManager上启动Executor的。

Driver主要就是负责将作业提交到Executor上去执行的。
Driver是否能退出的?
Driver在Client模式下是不能退出的,Driver退出那么作业是无法提交到Executor上运行的。

client网络通信
如果Driver是在集群之外的,那么NodeManager会与Driver进行网络通信的。NodeManager会与集群之外的Driver进行通信的。

Cluster模式,Driver会跑在NodeManager中的ApplicationMaster里面的。NodeManager中的Executor同样会与NodeManager中的Driver进行通信的。通信压力一样是大的。

如果Driver是在集群之内,同样的Executor会与Driver进行通信的,通信压力一样大的。
Driver必然是占Client端提交机器内存的。

–driver-memory占本机器的内存的。
提交机器的压力大的。
ThriftServer的那种作业一个作业占用的内存都是3-50G的内存的。机器压力大的,那么就只作为一个客户端来进行使用的。就是仅仅是一个DataNode或者NodeManager的。就专门跑作业用的,专门用来提交作业的。

spark on yarn 的Cluster模式:Driver是跑在ApplicationMaster里面的
那么AM不仅去ResourceManager上申请资源,启动在对应NodeManager上的Executor,与此同时AM还要负责作业的提交的。
Driver跑在ApplicationMaster中的,Executor同样会进行反向注册的,网络通信的。

client和cluster的优缺点:
client的运行日志是在客户端看见的,
cluster的运行日志是分散在集群中的各个地方的。看起来麻烦的。
我们所有的都是采用client的模式的。
通信压力一样大的,提交的压力肯定是client大的。
client模式提交的时候driver-memory全部都是本地的机器上的。
cluster模式提交的时候driver-memory应该都是yarn上面的资源的。

spark on yarn client:
第一步是去ResourceManager上面,申请资源启动AM,AM去ResourceManager上申请资源,找到对应的NodeManager启动Container跑Executor,Executor上面运行tasks的。

spark-shell –master yarn-client
val lines=sc.textFile(“input.txt”)
val words=lines.flatMap(_.split(“\t”))
val pairs=words.map((_,1))
val wordcount=pairs.reduceByKey(+,5)
wordcount.collect()
Running containers:3
Allocated CPU Vcores:3
Allocated Memory MB:5120
为什么是这样的参数的。
一个driver,俩个Executor是由–num-executors而来的,默认是2的,
Executor的StorageMemory为啥是384.1MB的,
启动spark程序之后,jps -l查看有哪些进程的。
org.apache.spark.executor.CoarseGrainedExecutorBackend对用的是Executor的。
org.apache.spark.deploy.SparkSubmit

ps -ef | grep 8041进程号,可以进行分析一些参数的含义的
spark.yarn.app.container.log.dir
–executor-id
–hostname
–cores 1:要学会去查的,由–executor-cores默认的是1的,spark-shell –help

如果跑在yarn-cluster上又有几个进程的,好好测试下好好分析下
spark on yarn cluster 启动作业,有多少个进程分别是什么的。

./start-yarn.sh启动yarn的服务的额,界面上的端口是8088,yarn界面上的ApplicationMaster是连接到Spark的UI界面的。ApplicationMaster只显示运行时候的作业的额,运行完毕是打不开的。

18080HistoryServer的端口的。
local模式的运行,AppId是以local开头的额
yarn模式的运行,AppId是以application开头的

HistoryServer源码分析:renders渲染,
cat sbin/start-history-server
start org.apache.spark.deploy.history.HistoryServer
用脚本启动一个类,必然有main方法的。

private val appCache=CacheBuilder.newBuilder().maximumSize(retainedApplications)
进行缓存的。

private val loaderServlet=new HttpServlet

ui模块中的有页面渲染的东西。env exec执行的,storage存储的。

原创粉丝点击