同时运行多个Hive查询时的节点驱动程序OutOfMemory

问题描述:

我们使用Spark2 Thrift来运行Hive查询。同时运行多个Hive查询时的节点驱动程序OutOfMemory

节俭作为HDP 2.6的一部分,我们的火花版本是2.1.0.2.6.0.3-8。

我们同时运行的查询越多,我们在驱动程序中遇到的OOM就越快。这些查询还包含JOIN和UNION。

从jstat似乎没有内存泄漏,但是无论给驱动程序多少内存,它似乎是永远不够的。更多的查询同时运行,更快的Thrift驱动程序开始执行完整的GC直到它崩溃,因为完整的GC无法清除旧内存(因为它正在被使用)。

OOM从未出现在执行者中,只出现在驱动程序中。

有没有人与Thrift合作过火花并遇到此问题?如果是这样 - 当同时运行多个查询时,Thrift驱动程序如何配置为不会在OOM上崩溃?

这些是我们使用配置:

节俭火花驱动程序:

  • spark.driver.memory =15克

节俭火花执行人:

  • spark.executor.memory =10克

  • NUM芯从/usr/hdp/current/spark2-thriftserver/conf/spark-thrift-sparkconf.conf = 7个

配置PARAMS:

  • spark.broadcast.blockSize32米

  • spark.driver.extraLibraryPath /美R/HDP /电流/ Hadoop的客户机/ LIB /天然:在/ usr/HDP /电流/ Hadoop的客户机/ LIB /天然的/ Linux的amd64-64

  • spark.driver.maxResultSize 0

  • spark.dynamicAllocation.enabled真正

  • spark.dynamicAllocation.executorIdleTimeout 45S

  • spark.dynamicAllocation.initialExecutors 2

  • spark.dynamicAllocation.maxExecutors 15个

  • spark.dynamicAllocation.minExecutors 0

  • spark.dynamicAllocation。schedulerBacklogTimeout 1S

  • spark.eventLog.dir HDFS:/// spark2历史/

  • spark.eventLog.enabled真正

  • spark.executor.extraLibraryPath在/ usr/HDP /电流/ Hadoop的-client/lib目录/原生:在/ usr/HDP /电流/ Hadoop的客户端/ lib目录/本地/ Linux的amd64-64

  • spark.executor.memory10克

  • spark.files.maxPartitionBytes 26843 5456

  • spark.files.openCostInBytes 33554432

  • spark.hadoop.cacheConf假

  • spark.history.fs.logDirectory HDFS:/// spark2历史/

  • 火花.history.provider org.apache.spark.deploy.history.FsHistoryProvider

  • spark.kryoserializer.buffer.max2000米

  • spark.master纱线客户

  • spark.memory.offHeap.enabled真

  • spark.memory.offHeap.size 104857600

  • spark.scheduler.allocation.file/USR /hdp/current/spark2-thriftserver/conf/spark-thrift-fairscheduler.xml

  • spark.scheduler.mode FAIR

  • 个spark.shuffle.service.enabled真正

  • spark.sql.autoBroadcastJoinThreshold 1073741824

  • spark.sql.shuffle.partitions 100

  • spark.storage.memoryMapThreshold8米

+0

我猜想“Spark to Thrift”将是更合适的术语。 – JensG

尝试将调度程序模式更改为FIFO。

而且,不要忘记内存中有2个不同的区域: - 存储 - 执行

存储将défaut驾驶员记忆中60%的人使用的,所以如果你从来没有缓存数据,减少它哟给更多的内存在需要的地方(他们会自动完成,但是......)。

尝试将火花洗牌分区降低到100,然后如果可能的话10。

尝试offheap(从未测试,但可能有所帮助)。

+0

为什么FIFO比FAIR更好?另外 - 你的意思是使用10个shuffle分区而不是100个? –

+0

FIFO对资源更好(因为一次只能运行一个查询)。我发现减小Spark分区对于小工作量可以更好,尝试一下,检查webUI分区的大小,最大值是2Go,分区越少意味着洗牌操作越少(所以资源利用率越低)。 –

+0

我们有多用户环境,应该同时运行多个查询。你是否建议在这样的环境下将FAIR改为FIFO?并将洗牌分区的数量从100减少到10? –