同时运行多个Hive查询时,Thrift驱动程序OutOfMemory

时间:2017-10-12 06:46:54

标签: out-of-memory thrift apache-spark-2.0

我们使用Spark2 Thrift来运行Hive查询。

Thrift是HDP 2.6的一部分,我们的Spark版本是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 cores = 7

来自/usr/hdp/current/spark2-thriftserver/conf/spark-thrift-sparkconf.conf的

config params

  • spark.broadcast.blockSize 32m

  • spark.driver.extraLibraryPath / usr / hdp / current / hadoop-client / lib / native:/ usr / hdp / current / hadoop-client / lib / native / Linux-amd64-64

  • spark.driver.maxResultSize 0

  • spark.dynamicAllocation.enabled true

  • 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-history /

  • spark.eventLog.enabled true

  • spark.executor.extraLibraryPath / usr / hdp / current / hadoop-client / lib / native:/ usr / hdp / current / hadoop-client / lib / native / Linux-amd64-64

  • spark.executor.memory 10g

  • spark.files.maxPartitionBytes 268435456

  • spark.files.openCostInBytes 33554432

  • spark.hadoop.cacheConf false

  • spark.history.fs.logDirectory hdfs:/// spark2-history /

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

  • spark.kryoserializer.buffer.max 2000m

  • spark.master yarn-client

  • spark.memory.offHeap.enabled true

  • 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 true

  • spark.sql.autoBroadcastJoinThreshold 1073741824

  • spark.sql.shuffle.partitions 100

  • spark.storage.memoryMapThreshold 8m

1 个答案:

答案 0 :(得分:0)

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

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

存储将由défaut使用60%的驱动程序内存,因此如果你从不缓存数据,请减少它,以便在需要时提供更多内存(他们说它自动完成但是......)。

如果可能的话,尝试将spark shuffle分区减少到100然后再减少10。

尝试offheap(从未测试但可以提供帮助)。