更新时间:2025-06-11 GMT+08:00

配置流式读取Spark Driver执行结果

操作场景

Spark在执行查询语句时,返回结果有可能会很大(10万数量以上),在这种情况下,极易引发JDBCServer出现内存溢出(Out of Memory,简称 OOM)。为有效解决这一难题,我们提供了数据汇聚功能特性。该特性能够在基本不影响系统性能的前提下,最大程度地避免OOM情况的发生。

配置描述

提供两种不同的数据汇聚功能配置选项,两者在Spark JDBCServer服务端的tuning选项中进行设置,设置完后需要重启JDBCServer。

  1. 登录FusionInsight Manager系统。

    详细操作请参考访问集群Manager

  2. 选择“集群 > 服务 > Spark2x/Spark > 配置”,单击“全部配置”,搜索并调整以下参数。

    其中:参数spark.sql.bigdata.thriftServer.useHdfsCollect和spark.sql.uselocalFileCollect不能同时设置为true。

    表1 参数说明

    参数

    参数说明

    取值示例

    spark.sql.bigdata.thriftServer.useHdfsCollect

    是否将结果数据保存到HDFS中而不是内存中。

    • true:将结果数据保存到HDFS中,但JobHistory原生页面上Job的描述信息无法正常关联到对应的SQL语句,同时spark-beeline命令行中回显的Execution ID为null,为解决JDBCServer内存溢出问题,同时显示信息正确,建议选择spark.sql.userlocalFileCollect参数进行配置。

      优点:由于查询结果保存在HDFS端,因此基本不会造成JDBCServer的内存溢出。

      缺点:速度慢。

    • false:不使用该功能。

    false

    spark.sql.uselocalFileCollect

    是否将结果数据保存在本地磁盘中而不是内存里面。

    • true:JDBCServer的查询结果将汇聚到本地文件上。

      优点:结果数据在小数据量情况下和原生内存的方式相比性能损失可以忽略,大数据情况下(亿级数据)性能远比使用HDFS,以及原生内存方式好。

      缺点:需要调优。大数据情况下建议JDBCServer driver端内存10G,executor端每个核心分配3G内存。

    • false: 不使用该功能。

    false

    spark.sql.collect.Hive

    该参数在spark.sql.uselocalFileCollect开启的情况下生效。直接序列化的方式,还是间接序列化的方式保存结果数据到磁盘。

    • true:JDBCServer的查询结果将汇聚到本地文件上采用Hive的数据格式。

      优点:针对分区数特别多的表查询结果汇聚性能优于直接使用结果数据保证在磁盘的方式。

      缺点:和spark.sql.uselocalFileCollect开启时候的缺点一样。

    • false:不使用该功能。

    false

    spark.sql.collect.serialize

    该参数在spark.sql.uselocalFileCollect, spark.sql.collect.Hive同时开启的情况下生效。作用是进一步提升性能。

    • java:采用java序列化方式收集数据。
    • kryo:采用kryo序列化方式收集数据,性能要比采用java好。

    java

  1. 修改参数配置后,单击“保存”,根据界面提示操作后,等待配置保存成功。
  2. Spark服务端配置更新后,如果“配置状态”为“配置过期”,则需重启组件以使配置生效。

    图1 修改Spark配置
    在Spark服务概览页面,选择“更多 > 重启服务/滚动重启服务”,验证管理员密码后,等待服务重启成功。

    组件重启期间将无法对外提供服务,可能会影响集群的上层业务正常运行,请在业务空闲期或确认操作无影响后再执行本操作。