• spark2+的sql 性能调优


    1、在内存中缓存数据

    性能调优主要是将数据放入内存中操作,spark缓存注册表的方法

    版本 缓存 释放缓存
    spark2.+ spark.catalog.cacheTable("tableName")缓存表 spark.catalog.uncacheTable("tableName")解除缓存
    spark1.+ sqlContext.cacheTable("tableName")缓存 sqlContext.uncacheTable("tableName") 解除缓存

    Demo案例:

    (1)从Oracle数据库中读取数据,生成DataFrame

    val oracleDF = spark.read.format("jdbc")
    .option("url","jdbc:oracle:thin:@192.168.88.101:1521/orcl.example.com")
    .option("dbtable","scott.emp")
    .option("user","scott")
    .option("password","tiger").load

    (2)将DataFrame注册成表:   

     oracleDF.registerTempTable("emp")

    (3)执行查询,并通过Web Console监控执行的时间

    spark.sql("select * from emp").show

    (4)将表进行缓存,并查询两次,并通过Web Console监控执行的时间

    spark.catalog.cacheTable("emp")

    (5)清空缓存:

    spark.catalog.uncacheTable("emp")

    2、性能优化相关参数

    Sparksql仅仅会缓存必要的列,并且自动调整压缩算法来减少内存和GC压力。

    属性 默认值 描述
    spark.sql.inMemoryColumnarStorage.compressed true Spark SQL 将会基于统计信息自动地为每一列选择一种压缩编码方式。
    spark.sql.inMemoryColumnarStorage.batchSize 10000 缓存批处理大小。缓存数据时, 较大的批处理大小可以提高内存利用率和压缩率,但同时也会带来 OOM(Out Of Memory)的风险。
    spark.sql.files.maxPartitionBytes 128 MB 读取文件时单个分区可容纳的最大字节数(不过不推荐手动修改,可能在后续版本自动的自适应修改)
    spark.sql.files.openCostInBytes 4M 打开文件的估算成本, 按照同一时间能够扫描的字节数来测量。当往一个分区写入多个文件的时候会使用。高估更好, 这样的话小文件分区将比大文件分区更快 (先被调度)。

    3. 广播

    在进行表join的时候,将小表广播可以提高性能,spark2.+中可以调整以下参数、

    属性 默认值 描述
    spark.sql.broadcastTimeout 300 广播等待超时时间,单位秒
    spark.sql.autoBroadcastJoinThreshold 10M 用于配置一个表在执行 join 操作时能够广播给所有 worker 节点的最大字节大小。通过将这个值设置为 -1 可以禁用广播。注意,当前数据统计仅支持已经运行了 ANALYZE TABLE <tableName> COMPUTE STATISTICS noscan 命令的 Hive Metastore 表。

    注:在任务超多,广播变量在跨stage使用数据的时候才能凸显其真正作用。

    4. 分区数据的调控

    spark任务并行度的设置中,spark有两个参数可以设置

    属性 默认值 描述
    spark.sql.shuffle.partitions 200 用于配置 join 或aggregate混洗(shuffle)数据时使用的分区数。
    spark.default.parallelism

    对于分布式shuffle操作像reduceByKey和join,父RDD中分区的最大数目。

    对于无父RDD的并行化等操作,它取决于群集管理器:

    -本地模式:本地计算机上的核心数

    -Mesos fine grained mode:8

    -其他:所有执行节点上的核心总数或2,以较大者为准

    分布式shuffle操作的分区数

    看起来它们的定义似乎也很相似,但在实际测试中,

    • spark.default.parallelism只有在处理RDD时才会起作用,对Spark SQL的无效。
    • spark.sql.shuffle.partitions则是对sparks SQL专用的设置

    5. 文件与分区

    这个总共有两个参数可以调整:

    • 读取文件的时候一个分区接受多少数据;
    • 文件打开的开销,通俗理解就是小文件合并的阈值。

    文件打开是有开销的,开销的衡量,Spark 采用了一个比较好的方式就是打开文件的开销用,相同时间能扫描的数据的字节数来衡量。

    参数介绍如下:

    属性 默认值 描述
    spark.sql.files.maxPartitionBytes 134217728 (128 MB) 打包传入一个分区的最大字节,在读取文件的时候
    spark.sql.files.openCostInBytes 4194304 (4 MB) 用相同时间内可以扫描的数据的大小来衡量打开一个文件的开销。当将多个文件写入同一个分区的时候该参数有用。该值设置大一点有好处,有小文件的分区会比大文件分区处理速度更快(优先调度)

    spark.sql.files.maxPartitionBytes该值的调整要结合你想要的并发度及内存的大小来进行。

    spark.sql.files.openCostInBytes说直白一些这个参数就是合并小文件的阈值,小于这个阈值的文件将会合并

    6.文件格式

    建议使用parquet或者orc。

    parquet已经可以达到很大的性能了

  • 相关阅读:
    linux服务器挂掉自动重启脚本(转)
    shell中打印带有时间的日志的命令(转)
    libreoffice python 操作word及excel文档
    Python操作redis系列之 列表(list) (五)(转)
    docker占满linux磁盘根目录的解决办法
    docker 端口映射 及外部无法访问问题
    转:查看远端的端口是否通畅3个简单实用案例
    转: MAC认证码的说明
    取消Eclipse SVN的自动链接方式
    C++语法查询在线手册
  • 原文地址:https://www.cnblogs.com/yyy-blog/p/10260988.html
Copyright © 2020-2023  润新知