spark提交任务常见的两种模式:
1,local[k]:本地使用k个worker线程运行saprk程序.这种模式适合小批量数据在本地调试代码用.(若使用本地的文件,需要在前面加上:file://)
2,spark on yarn模式:
(1)yarn-client模式: 以client模式连接到yarn集群,该方式driver是在client上运行的;
(2)yarn-cluster模式:以cluster模式连接到yarn集群,该方式driver运行在worker节点上.
(3)对于应用场景来说,Yarn-Cluster适合生产环境,Yarn-Client适合交互和调试。
通用可选参数:
--master
MASTER_URL, 可 以 是 spark://host:port, mesos://host:port, yarn, yarn-cluster,yarn-client, local
--deploy-mode
DEPLOY_MODE, Driver 程序运行的地方,client 或者 cluster,默认是client。
--class
CLASS_NAME, 主类名称,含包名
--jars
逗号分隔的本地 JARS, Driver 和 executor 依赖的第三方 jar 包
--driver-class-path
驱动依赖的jar包
--files
用逗号隔开的文件列表,会放置在每个 executor 工作目录中
--conf
spark 的配置属性
例如:
spark.executor.userClassPathFirst=true
实验性)当在executor中加载类时,是否用户添加的jar比Spark自己的jar优先级高。这个属性可以降低Spark依赖和用户依赖的冲突。它现在还是一个实验性的特征。
spark.driver.userClassPathFirst=true
实验性)当在driver中加载类时,是否用户添加的jar比Spark自己的jar, 优先级高。这个属性可以降低Spark依赖和用户依赖的冲突。它现在还是一个实验性的特征。
--driver-memory
Driver 程序使用内存大小(例如:1000M,5G),默认 1024M
--executor-memory
每个 executor 内存大小(如:1000M,2G),默认 1G
仅限于Spark on Yarn模式
--driver-cores
driver 使用的 core,仅在 cluster 模式下,默认为 1。
--queue
QUEUE_NAME 指定资源队列的名称,默认:default
--num-executors
一共启动的 executor 数量,默认是 2 个。
--executor-cores
每个executor使用的内核数,默认为1。
几个重要的参数说明:
(1)executor_cores*num_executors
表示的是能够并行执行Task的数目不宜太小或太大!一般不超过总队列 cores 的 25%,比如队列总 cores 400,最大不要超过100,最小不建议低于40,除非日志量很小。
(2)executor_cores
不宜为1!否则 work 进程中线程数过少,一般 2~4 为宜。
(3)executor_memory
一般 6~10g 为宜,最大不超过20G,否则会导致GC代价过高,或资源浪费严重。
(4)driver-memory
driver 不做任何计算和存储,只是下发任务与yarn资源管理器和task交互,除非你是 spark-shell,否则一般 1-2g
增加每个executor的内存量,增加了内存量以后,对性能的提升,有三点:
(5)如果需要对RDD进行cache,那么更多的内存,就可以缓存更多的数据,将更少的数据写入磁盘,
甚至不写入磁盘。减少了磁盘IO。
(6)对于shuffle操作,reduce端,会需要内存来存放拉取的数据并进行聚合。如果内存不够,也会写入磁盘。
如果给executor分配更多内存以后,就有更少的数据,需要写入磁盘,甚至不需要写入磁盘。减少了磁盘IO,提升了性能。
(7)对于task的执行,可能会创建很多对象.如果内存比较小,可能会频繁导致JVM堆内存满了,然后频繁GC,垃圾回收 ,minor GC和full GC.(速度很慢).内存加大以后,带来更少的GC,垃圾回收,避免了速度变慢,性能提升。
spark提交参数的设置非常的重要,如果设置的不合理,会影响性能,所以大家要根据具体的情况适当的调整参数的配置有助于提高程序执行的性能
具体场景遇到的问题:
CDH5.15.0环境中Hbase的默认jar包hbase-client-1.2.0-cdh5.15.0会报错找不到addFamily方法
java.lang.NoSuchMethodError: org.apache.hadoop.hbase.HTableDescriptor.addFamily(Lorg/apache/hadoop/hbase/HColumnDescriptor;)Lorg/apache/hadoop/hbase/HTableDescriptor;
所以在提交spark任务时,上传自己的hbase包,这样会与CDH集群环境的包冲突,需要用到优先级参数
spark2-submit --master yarn --deploy-mode cluster --jars hbase-client-1.2.0.jar,hbase-common-1.2.0.jar,hbase-server-1.2.0.jar --conf spark.executor.userClassPathFirst=true --conf spark.driver.userClassPathFirst=true --class test_CDH.Main test_CDH.jar 2
--jars hbase-client-1.2.0.jar,hbase-common-1.2.0.jar,hbase-server-1.2.0.jar
把自己的依赖hbase包上传
--conf spark.executor.userClassPathFirst=true
--conf spark.driver.userClassPathFirst=true
设置自己上传的jar包在executor和driver上优先级高于集群自己jar包,俩个参数都要配,只配一个不好使。