
# 配置流式读取Spark Driver执行结果
#### 配置场景
在执行查询语句时，返回结果有可能会很大（10万数量以上），此时很容易导致JDBCServer OOM（Out of Memory）。因此，提供数据汇聚功能特性，在基本不牺牲性能的情况下尽力避免OOM。
#### 配置描述
提供两种不同的数据汇聚功能配置选项，两者在Spark JDBCServer服务端中进行设置，设置完后需要重启JDBCServer。
表1参数说明 
| **参数**                                        | **说明**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | **默认值** |
|:---|:---|:---|
| spark.sql.bigdata.thriftServer.useHdfsCollect | 是否将结果数据保存到HDFS中而不是内存中。 优点：由于查询结果保存在hdfs端，因此基本不会造成JDBCServer的OOM。 缺点：速度慢。 - true：保存至HDFS中  - false：不使用该功能 须知： spark.sql.bigdata.thriftServer.useHdfsCollect参数设置为true时，将结果数据保存到HDFS中，但JobHistory原生页面上Job的描述信息无法正常关联到对应的SQL语句，同时spark-beeline命令行中回显的Execution ID为null，为解决JDBCServer OOM问题，同时显示信息正确，建议选择 spark.sql.userlocalFileCollect参数进行配置。    | false   |
| spark.sql.uselocalFileCollect                 | 是否将结果数据保存在本地磁盘中而不是内存里面。 优点：结果数据小数据量情况下和原生内存的方式相比性能损失可以忽略，大数据情况下（亿级数据）性能远比使用hdfs，以及原生内存方式好。 缺点：需要调优。大数据情况下建议JDBCServer driver端内存10G，executor端每个核心分配3G内存。 - true：使用该功能  - false: 不使用该功能                                                                                                                                                                                                                                                                                                             | false   |
| spark.sql.collect.Hive                        | 该参数在spark.sql.uselocalFileCollect开启的情况下生效。直接序列化的方式，还是间接序列化的方式保存结果数据到磁盘。 优点：针对分区数特别多的表查询结果汇聚性能优于直接使用结果数据保证在磁盘的方式。 缺点：和spark.sql.uselocalFileCollect开启时候的缺点一样。 - true：使用该功能  - false：不使用该功能                                                                                                                                                                                                                                                                                                     | false   |
| spark.sql.collect.serialize                   | 该参数在spark.sql.uselocalFileCollect， spark.sql.collect.Hive同时开启的情况下生效。 作用是进一步提升性能 - java：采用java序列化方式收集数据。  - kryo：采用kryo序列化方式收集数据，性能要比采用java好。                                                                                                                                                                                                                                                                                                                                                                            | java    |
   
![](https://support.huaweicloud.com/cmpntguide-mrs/public_sys-resources/note_3.0-zh-cn.png)
参数spark.sql.bigdata.thriftServer.useHdfsCollect和spark.sql.uselocalFileCollect不能同时设置为true。
