赞
踩
1、mapreduce基于磁盘进行数据处理,有更高的可靠性,减少了内存占用也降低了性能;
spark在内存中进行计算,牺牲内存提高了运行速度
2、mapreduce在shuffle操作时,每一次都要写入磁盘中;
spark不强制写入,可以将需要反复使用的数据缓存在内存中,减少了去磁盘中反复读写的时间
3、mapreduce是细粒度资源申请,每提交一个项目时,每一个task执行自己申请释放资源,执行完毕后,自己释放资源,task执行慢,application也就较慢;
spark是粗粒度资源申请,application提交时就会把所有的资源申请下来,申请不下就等待直至申请到再执行,当最后一个task执行后才会释放资源(也是不能充分利用集群的原因)
配置项 | 相关概念 |
---|---|
export SPARK_MAJOR_VERSION=2 | spark版本选择 |
/opt/spark24/bin/spark-sql --master yarn-client \ | spark提交模式的选择:
|
--driver-memory 1G \ | 主要用来存储一些DAG图信息,任务调动,资源划分等信息,还有一些CollectAsList等算子生成的数据也会放到Dirver memory中,如果进行大数据量的collect计算时需要调大driver的内存,避免内存溢出 |
--executor-memory 2G \ | 设置每一个executor进程的内存,executor的内存大小影响spark计算的性能 |
--executor-cores 2 \ | 设置一个executor中core的数量,一个core一次只能执行一个task |
--num-executors 50 \ | 设置当前作业的executor进程个数,这个参数和executor-memory共同影响着计算速度 (初始运行根据当前设置申请资源,若开启动态分配,启动后进行动态分配) |
--conf "spark.driver.extraJavaOptions=-Dlog4j.configuration= | 为driver端定义的log4j配置文件,log4j用来管理日志 |
--conf spark.sql.hive.caseSensitiveInferenceMode=NEVER_INFER \ | 据目前了解,spark本身具有一个特性,在对表第一次进行分区查询时,并不只是扫描该分区下的文件,而是对表的所有分区进行计算,当表内存在大量的分区时,会耗时十分严重,浪费资源。在版本2.2.0以后,该参数默认设置为全局扫描,所以谨慎起见,需要对此参数进行设定。 |
--conf spark.sql.auto.repartition=true \ | 开启自动分配分区资源,spark不同阶段分区不同,使用此配置可优化计算后分区数,避免分区数过大导致单个分区数据量过少,每个task运算分区数据时间过,从而导致task频繁调度消耗过多时间 |
--conf spark.sql.autoBroadcastJoinThreshold=104857600 \ | 数据做join过程中,两个表的大小差异过大容易产生数据倾斜,BroadcastJoin计算方式通过将小于设定值的表通过其他节点计算,不走shuffle,避免数据倾斜。 所以当前设定值为104857600(1024*1024*100,100M),当表小于100M时,自动走BroadcastJoin |
--conf spark.shuffle.service.enabled=true \ | 辅助服务。通过开启该服务来抓取shuffle数据,提供到其他Executor上进行处理,避免Executor既要运行task又要提供shuffle数据。提升计算性能 |
--conf "spark.sql.hive.metastore.try.direct.sql=true" \ | 未知 |
--conf spark.dynamicAllocation.executorIdleTimeout=10m\ | 设置动态移除executor的时间,在executor没有缓存数据的情况下,空闲时间超过10分钟被移除(需要设置,避免计算后在后台长期不退出,并长期占用资源) |
--conf spark.dynamicAllocation.enabled=true \ | 是否开启动态配置,根据计算量级动态调整executor的数量 |
--conf spark.dynamicAllocation.minExecutors=1 \ --conf spark.dynamicAllocation.maxExecutors=200 \ | 动态分配最小executor个数(经过测试,若设置了移除executor的时间,该设置就是自动释放后的executor个数) 动态分配最大executor个数(不可以设置太大,避免计算量较大时系统动态分配,占据全部资源) |
--conf spark.port.maxRetries=150 \ | Spark任务都会绑定一个端口来显示WebUI,如果被占用会进行+1端口重试,当前设定最多重试150次 |
--conf spark.ui.showConsoleProgress=true \ | 任务执行的进度条显示 |
--conf spark.hadoop.hive.exec.dynamic.partition=true \ | 是否开启动态分区(在分区数量过大,且分区名不明确的条件下使用) |
--conf spark.hadoop.exec.dynamic.partition.mode=nonstrict \ | 开启动态分区后,是否严格要求至少需要一个静态分区。strict:至少需要一个静态分区;nonstrict:不需要静态分区 |
--conf spark.sql.shuffle.partitions=10000 \ | 如果设置多个executor,但未指定分区数,导致多数executor空闲。该设置是shuffle在mapper端写出的partition个数,提高shuffle并行度 |
--conf spark.sql.adaptive.enabled=true \ --conf spark.sql.adaptive.shuffle.targetPostShuffleInputSize=134217728 \ | 该参数是用于开启spark的自适应执行,后面的targetPostShuffleInputSize是用于控制之后的shuffle 阶段的平均输入数据大小,防止产生过多的task。 134217728=1024*1024*128 |
--conf spark.executor.memoryOverhead=512M | 堆外内存量级设置,主要用于JVM自身,字符串, NIO Buffer等开销。不足时可通过调整参数解决 |
--queue qa | 执行队列选择 |
项目中遇到的 | |
spark.memory.fraction | 用于执行和存储的部分(堆空间-300MB)。值越低,溢出和缓存数据逐出的频率就越高。此配置的目的是为稀疏的,异常大的记录留出用于内部元数据,用户数据结构和大小估计不精确的内存。建议将其保留为默认值。 默认值:0.6 (Spark 1.6 默认为 0.75,Spark 2.0+ 默认为 0.6) |
spark.yarn.executor.memoryOverhead | executor执行的时候,用的内存可能会超过executor-memoy,所以会为executor额外预留一部分内存。spark.yarn.executor.memoryOverhead代表了这部分内存。这个参数如果没有设置,会有一个自动计算公式(位于ClientArguments.scala中),公式max(executor-memoy*0.1,384m) |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。