zoukankan      html  css  js  c++  java
  • 【Spark调优】数据本地化与参数调优

      数据本地化对于Spark Job性能有着巨大的影响,如果数据以及要计算它的代码是在一起的,那么性能当然会非常高。但是,如果数据和计算它的代码是分开的,那么其中之一必须到另外一方的机器上。移动代码到其匹配的数据节点,会比移动大量数据到代码所在的节点上去,速度要快得多,因为代码比较小。Spark也正是基于这个数据本地化的原则来构建task调度算法。

     

      数据本地化,是指数据离计算它的代码距离有多近,有几种数据本地化级别:

    1、PROCESS_LOCAL:数据和计算它的代码在同一个JVM进程中,对应spark是指的在一个executor内,这种距离最近,性能最好。
    2、NODE_LOCAL:数据和计算它的代码在一个节点上,但是不在一个进程中,比如在不同的executor进程中,或者是数据在HDFS文件的block中,这种距离远些,性能次之。

    尽量控制在前2种。 如下计算代码和匹配数据距离依次更远,性能依次变的更差。
    3、NO_PREF:从任何地方访问数据速度都是一样,不关心数据的位置。
    4、RACK_LOCAL:数据和计算它的代码在一个机架上。
    5、ANY:数据可能在任意地方,比如其他网络环境内,或者其他机架上。

    注:Spark UI中,在stage中看task列表,Locality Level列可以看到该task的数据本地化级别。  

     

      实际使用过程中,资源是有限的。

      例如,如果一个executor在某一时刻已经启动了很多task,没有资源可以继续启动新task。此时,应该选择等待一段时间。

    • 如果等待时间内,有task完成处理释放了资源,那么executor为新task分配资源,此时保持PROCESS_LOCAL。
    • 如果超出等待时间,所有task都还没完成,新task未获取到资源,此时需要降级为NODE_LOCAL,由Node分配资源来运行新task。 

     

      Spark为task资源等待时间提供了配置参数:

    • spark.locality.wait

      是spark切换每个级别的等待间隔时间,默认值3秒过短,生产上目前配置在50~60秒。

     

      也可以细化到每个级别的等待间隔时间配置:

    • spark.locality.process
    • spark.locality.node
    • spark.locality.rack

      建议越在前面的配置略大些好,例如50~60秒。

  • 相关阅读:
    一款漂亮的表格样式(简约版)
    性能测试工具 Jmeter GET 请求 参数为 Json 串且参数中存在变量的转化
    _groovy
    Linux SElinux
    Jmeter-后置处理器(Json extractor)
    jmeter处理接口加密和解密
    nmon内存分析
    jmeter 非GUI执行测试,没有响应数据保存到jtl文件办法
    如何隐藏电脑里的文件或者文件夹
    详解JMeter函数和变量
  • 原文地址:https://www.cnblogs.com/wwcom123/p/10533994.html
Copyright © 2011-2022 走看看