• [Spark]


    http://spark.apache.org/docs/1.6.1/tuning.html
    1) 代码优化
    a. 对于多次使用的RDD,进行数据持久化操作(eg: cache、persist)
    b. 如果对同一个份数据进行操作,那么尽量公用一个RDD
    c. 优先使用reduceByKey和aggregateByKey取代groupByKey
    原因:前两个API存在combiner,可以降低数据量;groupByKey可能存在OOM异常
    d. 对于Executor使用到Driver中的变量的情况,使用广播变量进行数据传递, 可以减少网络传输量,原理是:使用广播变量后,原来Driver传递给Task的数据,变成只需要传递给Executor即可。
    e. 当大表join小表,而且存在shuffle的时候,可以考虑使用map join来进行替换<使用广播变量将小表的数据广播出去,前提:Driver和单个的Executor的内存可以存储下小表的数据>;
    h. 启动kyro序列化机制

    2) 资源优化
    a. spark-submit脚本相关参数
    driver的内存:--driver-memory
    driver的cpu:
    standalone(cluster):--driver-cores
    yarn(cluster): --driver-cores
    executor的数量:
    yarn: --num-executors
    总的executor的CPU数量:
    standalone/mesos:--total-executor-cores
    单个executor的内存:--executor-memory
    单个executor的cpu:
    standalone/yarn:--executor-cores
    b. 资源相关参数
    spark.driver.cores:1
    spark.driver.memory:1g
    spark.executor.cores:1(yarn)/all(standalone)
    spark.executor.memory:1g
    spark.memory.fraction:0.75
    spark.memory.storageFraction:0.5
    Spark中执行和缓存的内存是公用的,执行可以争夺缓存的内存,就是可以将部分缓存自动清楚,用于执行过程中使用内存;这两个参数的含义分别是:spark.memory.fraction指定总内存占比((1g-300M)*0.75),spark.memory.storageFraction指定缓存部分最少占比内存((1g-300M)*0.75*0.5);当没有执行的情况下,缓存可以使用全部的公用内存,即缓存最多使用((1g-300M)*0.75),最少可占用((1g-300M)*0.75*0.5)
    1.5版本以前的采用固定内存设置:spark.storage.memoryFraction(0.6)以及spark.shuffle.memoryFraction(0.2)
    spark.default.parallelism: 默认的分区数量,默认两个,一般比较小;在实际环境中一般需要改大。
    spark.scheduler.mode:FIFO(默认,先进先出)/FAIR(公平调度)
    spark.task.cpus:每个Task执行需要的CPU数量(默认值1)
    spark.task.maxFailures:每个Task允许的最大失败次数(默认值4)
    spark.dynamicAllocation.enabled: false; 是否启动动态分配资源,默认为不启动
    spark.shuffle.service.enabled:false,当启动动态资源分配的时候,该参数必须设置为true,表示允许额外的shuffle服务管理
    spark.dynamicAllocation.initialExecutors:动态资源初始executor数量
    spark.dynamicAllocation.maxExecutors:动态资源设置最大允许分配资源
    spark.dynamicAllocation.minExecutors:动态资源设置最小允许分配资源,默认(0)

    Spark on Yarn:
    spark.yarn.am.memory:512m; 运行在Yarn上的时候ApplicationMaster运行的内存大小(client模式下)
    spark.yarn.am.cores:1; ApplicationMaster运行的CPU核数(client模式下)
    spark.executor.instances: Executor的数量,默认2个;该参数和动态参数参数互斥,当两者都存在的时候,动态参数设置无效。

    3) 数据倾斜优化
    a. 两阶段聚合
    b. 使用MAP JOIN替代REDUCE JOIN
    c. 数据重分区(更改分区数量)
    e. 扩容RDD及随机前缀JOIN方式

    4) shuffle过程优化(两种ShuffleManager,四种模式一定要懂)
    a. spark.shuffle.file.buffer:32k; 数据溢出磁盘的缓冲区内存大小
    b. spark.shuffle.manager: sort; 给定数据
    shuffle的管理器,sort(基于排序规则)或者hash(基于Hash值)
    c. spark.shuffle.sort.bypassMergeThreshold: 200; 当分区数量小于该值的时候,启动SortShuffleManager中的bypass模式
    d. spark.shuffle.consolidateFiles: false; 当该参数为true的时候,使用hash shuffle的时候,可以提高shuffle速度,原理是:合并shuffle过程中的数据输出文件

  • 相关阅读:
    《数据结构与算法Python语言描述》习题第二章第三题(python版)
    mysql中的视图
    mysql中列的增删改
    php隐藏WEBSHELL技巧
    php webshell常见函数
    MySQL join 用法
    BurpSuite 设置Hostname Resolution
    Linux mint 18.1 / Ubuntu 16.04 安装steam
    Linux SCIM/fcitx/ibus 输入法
    mysql 复制表结构 / 从结果中导入数据到新表
  • 原文地址:https://www.cnblogs.com/liuming1992/p/6554257.html
Copyright © 2020-2023  润新知