Spark Core 之监控和调优

Spark 程序监控

  • 当我们通过Spark-shell启动一个Spark应用程序时,可以通过对应的端口查看该应用程序的UI界面信息,但是当我们Stop掉或者使用Spark-submit提交应用程序之后,我们无法再通过UI界面查看到对于的程序信息,那么之前的一些应用程序中间的运行状况就无法查看和被记录,不过好在Spark为我们提供了一个Spark history server ,这方便我们可以在结束程序后很好的查看运行信息,并能通过他保留的信息定制化自己的监控界面,Spark history server默认端口号:18080 使用方式:

     ./sbin/start-history-server.sh
    
  • 开启服务后,还需要在相应的应用程序配置文件(默认Spark-default.conf)添加以下内容:

    spark.eventLog.enabled true
    spark.eventLog.dir hdfs://namenode/shared/spark-logs
    

    这个配置意思是Spark应用程序的日志记录在什么位置

  • 既然配置了日志的记录位置,那么相应的展示目录也要配置(俩目录可以不同),以spark.history.*开头的配置都是配置在Spark环境配置中的SPARK_HISTORY_OPTS,即spark-env.sh的配置文件的SPARK_HISTORY_OPTS配置选项,通过-D以key=value的形式传入,主要配置:

    SPARK_HISTORY_OPTS="-Dspark.history.fs.logDirectory=hdfs://192.138.137.130:9000/spark-logs"
    

其他重要配置解释:

  • spark.history.fs.update.interval 默认值10秒
    这个参数指定刷新日志的时间,更短的时间可以更快检测到新的任务以及任务执行情况,但过快会加重服务器负载

  • spark.history.ui.maxApplication 默认值intMaxValue
    这个参数指定UI上最多显示的作业的数目

  • spark.history.ui.port 默认值18080
    这个参数指定history-server的网页UI端口号

  • spark.history.fs.cleaner.enabled 默认为false
    这个参数指定history-server的日志是否定时清除,true为定时清除,false为不清除。这个值一定设置成true啊,不然日志文件会越来越大。

  • spark.history.fs.cleaner.interval 默认值为1d
    这个参数指定history-server的日志检查间隔,默认每一天会检查一下日志文件

  • spark.history.fs.cleaner.maxAge 默认值为7d
    这个参数指定history-server日志生命周期,当检查到某个日志文件的生命周期为7d时,则会删除该日志文件

  • spark.eventLog.compress 默认值为false
    这个参数设置history-server产生的日志文件是否使用压缩,true为使用,false为不使用。这个参数务可以成压缩哦,不然日志文件岁时间积累会过大

  • spark.history.retainedApplications  默认值:50
    在内存中保存Application历史记录的个数,如果超过这个值,旧的应用程序信息将被删除,当再次访问已被删除的应用信息时需要重新构建页面。

REST API

  • 通过REST API的方式,可以拿到Spark应用程序所有信息的json 格式文件,这样就可以定制化Spark 应用程序监控界面。
  • 使用方式:

    1)可以通过Spark history server 的UI界面,http://<server-url>:18080/api/v1,添加相关条件,拿到对应信息
    2)也可以通过正在运行的应用程序的UI界面,http://localhost:4040/api/v1,添加相关条件,拿到对应信息
    

    具体使用可以到Spark官网的Monitoring界面查看。

Spark 调优

  • 关于Spark调优点Spark官网也做了很好的说明,可以到Spark官网的Tuning Guide界面学习。如果实在看不懂英文,推荐看美团的俩篇博客,Saprk性能调优基础Spark性能调优高级
  • 这里对基础调优做出一个总结:
    • 尽量避免使用Shuffle的算子,如ReduceByKey,GroupBykey,Join
    • 使用高性能算子来代替其他算子,如mapPartitions代替普通的map,foreachPartitions替代foreach,reduceByKey/aggregateByKey替代groupByKey
    • 对需要重复使用的RDD做Cache
    • 广播变量
    • 使用kyro 的序列化方式代替java中的序列化方式
    • 优化数据结构

猜你喜欢

转载自blog.csdn.net/Realoyou/article/details/81042768