spark笔记-submit提交&调试程序

文章目录

  • 1. Spark 提交应用程序
  • 2. Spark的调试

1. Spark 提交应用程序

1、 进入到spark安装目录的bin,调用Spark-submit脚本
2、 在脚本后面传入参数
   		1、--class你的应用的主类
   		2、--master 你的应用运行的模式,Local、Local[N]、Spark://hostname:port 、Mesos、Yarn-client、Yarn-cluster
   		3、[可选] 你可以指定--deploy-mode client模式或者Cluster模式。
   		4、你的应用jar包的位置
   		5、你的应用的参数

例如:

spark-submit \
  --master local[5]  \
  --driver-cores 2   \
  --driver-memory 8g \
  --executor-cores 4 \
  --num-executors 10 \
  --executor-memory 8g \
  --class PackageName.ClassName XXXX.jar \
  --name "Spark Job Name" \
  --conf spark.default.parallelism=1000 \
  InputPath      \
  OutputPath
  
如果这里通过--queue 指定了队列,那么可以免去写--master
  • 参数设置
# 总核数 = 物理CPU个数 X 每颗物理CPU的核数 
# 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数
 
# 查看物理CPU个数
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
 
# 查看每个物理CPU中core的个数(即核数)
cat /proc/cpuinfo| grep "cpu cores"| uniq
 
# 查看逻辑CPU的个数
cat /proc/cpuinfo| grep "processor"| wc -l
 
是否为超线程?
    如果有两个逻辑CPU具有相同的”core id”,那么超线程是打开的。
 
2、由以上知识计算出单台机器的逻辑总核数。
 
公理:每个executor分配2~4个core比较合适。但是也要受资源队列的限制。
 
executor_cores*num_executors表示的是能够并行执行Task的数目
不宜太小或太大!一般不超过总队列 cores 的 25%,比如队列总 cores 400,最大不要超过100,最小不建议低于 40,除非日志量很小。

executor_cores
不宜为1!否则 work 进程中线程数过少,一般 2~4 为宜。

executor_memory
一般 6~10g 为宜,最大不超过20G,否则会导致GC代价过高,或资源浪费严重。

driver-memory
driver 不做任何计算和存储,只是下发任务与yarn资源管理器和task交互,除非你是 spark-shell,否则一般 1-2g
 
3、关于spark.default.parallelism并行度设置
 
spark.storage.memoryFraction
    参数说明:该参数用于设置RDD持久化数据在Executor内存中能占的比例,默认是0.6。也就是说,默认Executor 60%的内存,可以用来保存持久化的RDD数据。根据你选择的不同的持久化策略,如果内存不够时,可能数据就不会持久化,或者数据会写入磁盘。
参数调优建议:如果Spark作业中,有较多的RDD持久化操作,该参数的值可以适当提高一些,保证持久化的数据能够容纳在内存中。避免内存不够缓存所有的数据,导致数据只能写入磁盘中,降低了性能。但是如果Spark作业中的shuffle类操作比较多,而持久化操作比较少,那么这个参数的值适当降低一些比较合适。此外,如果发现作业由于频繁的gc导致运行缓慢(通过spark web ui可以观察到作业的gc耗时),意味着task执行用户代码的内存不够用,那么同样建议调低这个参数的值。
spark.shuffle.memoryFraction
    参数说明:该参数用于设置shuffle过程中一个task拉取到上个stage的task的输出后,进行聚合操作时能够使用的Executor内存的比例,默认是0.2。也就是说,Executor默认只有20%的内存用来进行该操作。shuffle操作在进行聚合时,如果发现使用的内存超出了这个20%的限制,那么多余的数据就会溢写到磁盘文件中去,此时就会极大地降低性能。
参数调优建议:如果Spark作业中的RDD持久化操作较少,shuffle操作较多时,建议降低持久化操作的内存占比,提高shuffle操作的内存占比比例,避免shuffle过程中数据过多时内存不够用,必须溢写到磁盘上,降低了性能。此外,如果发现作业由于频繁的gc导致运行缓慢,意味着task执行用户代码的内存不够用,那么同样建议调低这个参数的值。

2. Spark的调试

  • 本地调试【以单节点的方式来运行整个Spark应用】
1、写好你的程序
    2、将master设置为local或者local[n]
    3、如果你用到了HDFS,可能会遇到winuntils找不到的问题,需要将HADOOP_HOME环境变量加入到IDEA中。
    4、打断点
    5、Debug模式运行你的程序
  • 远程调试【把IDEA当做你的Driver来运行,保持和整个Spark集群的连接关系】
前提:你的本机和Spark集群是在同一网段。
    1、写好你的程序
    2、修改Master地址为你的Spark集群的地址
    3、将最终需要运行的jar包加入到setJars方法中
    4、设置你的本地地址到 spark.driver.host 这个变量里面
    5、打断点
    6、Debug模式运行你的程序

比如:wordcount代码

def main(args: Array[String]){
    val conf = new SparkConf().setMaster("spark://master:7077) //spark master ip地址
    .setAppName("aaa")
    .setJars(List(C:\\User\\XXXX.jar)) //jar包地址
    .setIfMissing("spark.driver.host", "192.186.56.1") //本机ip
    
    val = sc SparkContext(conf)
    
    val result = sc.textFile("hdfs://master:9000/readme.txt")
    .flatmap(_,split(""))
    .map((_,1))
    .reduceByKey(_+_, 1)
    .sortBy(_,_2,false)
    
    result.collect().foreach(printIn _)
    
    logger.info("complete!")
    
    sc.stop()
}

你可能感兴趣的:(大数据组件,spark,spark,大数据)