zoukankan      html  css  js  c++  java
  • spark新能优化之数据本地化

    数据本地化的背景:

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

    数据本地化,指的是,数据离计算它的代码有多近。基于数据距离代码的距离,有几种数据本地化级别:
    1、PROCESS_LOCAL:数据和计算它的代码在同一个JVM进程中。
    2、NODE_LOCAL:数据和计算它的代码在一个节点上,但是不在一个进程中,比如在不同的executor进程中,或者是数据在HDFS文件的block中。
    3、NO_PREF:数据从哪里过来,性能都是一样的。
    4、RACK_LOCAL:数据和计算它的代码在一个机架上。
    5、ANY:数据可能在任意地方,比如其他网络环境内,或者其他机架上。

    数据本地化的设置:

    Spark倾向于使用最好的本地化级别来调度task,但是这是不可能的。如果没有任何未处理的数据在空闲的executor上,那么Spark就会放低本地化级别。这时有两个选择:第一,等待,直到executor上的cpu释放出来,那么就分配task过去;第二,立即在任意一个executor上启动一个task。

    Spark默认会等待一会儿,来期望task要处理的数据所在的节点上的executor空闲出一个cpu,从而将task分配过去。只要超过了时间,那么Spark就会将task分配到其他任意一个空闲的executor上。

    可以设置参数,spark.locality系列参数,来调节Spark等待task可以进行数据本地化的时间。spark.locality.wait(3000毫秒)、spark.locality.wait.node、spark.locality.wait.process、spark.locality.wait.rack。

  • 相关阅读:
    [编写高质量代码:改善java程序的151个建议]建议34:构造函数尽量简化
    [编写高质量代码:改善java程序的151个建议]建议33:不要覆写静态方法
    [编写高质量代码:改善java程序的151个建议]建议32-静态变量一定要先声明后赋值
    u3d_shader_surface_shader_3
    u3d_shader_surface_shader_2
    u3d_shader_surface_shader_1
    Linux Yum仓库源配置
    Linux计划任务
    Vim学习笔记
    Linux Shell学习笔记
  • 原文地址:https://www.cnblogs.com/yaohaitao/p/5667240.html
Copyright © 2011-2022 走看看