spark默认端口修改
修改WENUI 端口 :
在spark/conf/vim spark-env.sh 内写入
export SPARK_MASTER_WEBUI_PORT=8888(默认为8080,这里改为8888)
或
临时环境变量:
export SPARK_MASTER_WEBUI_PORT=9999`
export -n :删除零时变量
Master HA配置
两种方式
1.本地文件系统
存储原数据:(workers,applications,drivers)
需要每次手动切换Master
2.zookeeper
储存原数据
自动选举过功能
3.配置
在conf下的spark-env.sh内配置
export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoverMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=node01:2181,node02:2181,node03:2181 -Dspark.deploy.zookeeper.dir=/MasterHA"
Spark Shuffle
每一个key对应的value不一定都在一个partition中,也不太可能在同一个节点上,因为RDD是分布式弹性的数据集,它的partition极有可能分布在各个节点上
在1.6内有两种管理机制
hashshuffermanger
有两个版本 一个是(M*R),另外一个是(C * R)
sortshuffermanger
在2.0版本以上把hashshuffermanger给丢弃了
在2.0以后使用sortshuffermanger(为了解决磁盘IO的问题)
主要由两个组成
1.普通 运行机制
a) map task 的计算结果会写入到一个内存数据结构里面,内存数据结构默认是5M
b) 在shuffle的时候会有一个定时器,不定期的去估算这个内存结构的大小,当内存结构中的数据超过5M时,比如现在内存结构中的数据为5.01M,那么他会申请5.01*2-5=5.02M内存给内存数据结构。
c) 如果申请成功不会进行溢写,如果申请不成功,这时候会发生溢写磁盘。
d) 在溢写之前内存结构中的数据会进行排序分区
e) 然后开始溢写磁盘,写磁盘是以batch的形式去写,一个batch是1万条数据,
f) map task执行完成后,会将这些磁盘小文件合并成一个大的磁盘文件,同时生成一个索引文件。
g) reduce task去map端拉取数据的时候,首先解析索引文件,根据索引文件再去拉取对应的数据。
Ø 总结
产生磁盘小文件的个数: 2*M(map task的个数)
2.bypass运行机制(相对于普通的运行机制不用排序了,会更快一些,sortbyKey)
Ø 总结
① .bypass运行机制的触发条件如下:
shuffle reduce task的数量小于spark.shuffle.sort.bypassMergeThreshold的参数值。这个值默认是200。
② .产生的磁盘小文件为:2*M(map task的个数)
Shuffle文件寻址
1.名词解释:
- MapOutputTracker
MapOutputTracker是Spark架构中的一个模块,是一个主从架构。管理磁盘小文件的地址。
Ø MapOutputTrackerMaster是主对象,存在于Driver中。
Ø MapOutputTrackerWorker是从对象,存在于Excutor中。
- BlockManager
BlockManager块管理者,是Spark架构中的一个模块,也是一个主从架构。
Ø BlockManagerMaster,主对象,存在于Driver中。
BlockManagerMaster会在集群中有用到广播变量和缓存数据或者删除缓存数据的时候,通知BlockManagerSlave传输或者删除数据。
Ø BlockManagerSlave,从对象,存在于Excutor中。
BlockManagerSlave会与BlockManagerSlave之间通信。
¬ 无论在Driver端的BlockManager还是在Excutor端的BlockManager都含有三个对象:
① DiskStore:负责磁盘的管理。
② MemoryStore:负责内存的管理。
③ BlockTransferService:负责数据的传输。
2.Shuffle文件寻址流程
a) 当map task执行完成后,会将task的执行情况和磁盘小文件的地址封装到MpStatus对象中,通过MapOutputTrackerWorker对象向Driver中的MapOutputTrackerMaster汇报。
b) 在所有的map task执行完毕后,Driver中就掌握了所有的磁盘小文件的地址。
c) 在reduce task执行之前,会通过Excutor中MapOutPutTrackerWorker向Driver端的MapOutputTrackerMaster获取磁盘小文件的地址。
d) 获取到磁盘小文件的地址后,会通过BlockManager连接数据所在节点,然后通过BlockTransferService进行数据的传输。
e) BlockTransferService默认启动5个task去节点拉取数据。默认情况下,5个task拉取数据量不能超过48M。
Spark内存管理
Spark执行应用程序时,Spark集群会启动Driver和Executor两种JVM进程:
***Driver***负责创建SparkContext上下文,提交任务,task的分发等。
***Executor***负责task的计算任务,并将结果返回给Driver。同时需要为需要持久化的RDD提供储存。
Driver端的内存管理比较简单,这里所说的Spark内存管理针对Executor端的内存管理。
Spark内存管理分为静态内存管理和统一内存管理,Spark1.6之前使用的是静态内存管理,Spark1.6之后引入了统一内存管理。
静态内存管理中存储内存、执行内存和其他内存的大小在 Spark 应用程序运行期间均为固定的,但用户可以应用程序启动前进行配置。
统一内存管理与静态内存管理的区别在于储存内存和执行内存共享同一块空间,可以互相借用对方的空间。
Spark1.6以上版本默认使用的是统一内存管理,可以通过参数spark.memory.useLegacyMode 设置为true(默认为false)使用静态内存管理。
reduce 中OOM如何处理?
-
减少每次拉取的数据量
-
提高shuffle聚合的内存比例
-
提高Excutor的总内存
Shuffle调优
SparkShuffle调优配置项如何使用?
- 在代码中,不推荐使用,硬编码。
new SparkConf().set(“spark.shuffle.file.buffer”,”64”)
- 在提交spark任务的时候,推荐使用。
spark-submit --conf spark.shuffle.file.buffer=64 –conf ….
- 在conf下的spark-default.conf配置文件中,不推荐,因为是写死后所有应用程序都要用。