2017-10-12 14 views
0

Hiveクエリを実行するためにSpark2 Thriftを使用します。複数のHiveクエリを同時に実行する場合のThriftドライバOutOfMemory

スレリフトはHDP 2.6の一部として提供され、スパークバージョンは2.1.0.2.6.0.3-8です。

複数のクエリを同時に実行するほど、ドライバでOOMが発生する速度が速くなります。これらのクエリには、JOINとUNIONも含まれています。

jstatからはメモリリークはないようですが、ドライバにどのくらいのメモリが与えられても、それは十分ではないようです。同時に実行されるクエリが多いほど、高速なThriftドライバはクラッシュするまで完全なGCを実行し始めます。これは、完全なGCが(使用されているので)古いメモリをクリーンアップできないためです。

OOMはエグゼキュータでは発生せず、ドライバでのみ発生します。

誰もがThrift over sparkでこの問題に遭遇しますか?もしそうなら、複数のクエリを同時に実行しているときに、ThriftドライバをOOMでクラッシュさせないように構成する方法はありますか?

リサイクルスパークドライバ:

  • spark.driver.memory = 15グラム

リサイクルスパークエグゼキュータ:

    これらは我々が使用する構成であります

  • spark.executor.memory = 10グラム

  • NUMコア/usr/hdp/current/spark2-thriftserver/conf/spark-thrift-sparkconf.confから= 7つの

構成パラメータ:

  • spark.broadcast.blockSizeの32メートル

  • 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。/// spark2履歴/

  • spark.eventLog.enabled真

  • spark.executor.extraLibraryPathは/ usr/HDP /現在/ Hadoopの:

  • spark.eventLog.dir HDFS 1S schedulerBacklogTimeout -client/libに/ネイティブ:は/ usr/HDP /現在/ Hadoopのクライアント/ libに/ネイティブ/ Linuxの-amd64-64

  • spark.executor.memory 10グラム

  • 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.max 2000m

  • spark.master糸-クライアント

  • spark.memory.offHeap.size 104857600

  • spark.scheduler.allocation.fileは/ usr

  • を真spark.memory.offHeap.enabled /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.memoryMapThresholdの8メートル

+0

「Spark over Thrift」と言えば、より適切な用語になります。 – JensG

答えて

0

スケジューラモードをFIFOに変更してみてください。ストレージ - - 実行

ストレージドライバメモリの60%défautによって使用されますので、あなたは決してキャッシュデータならば、ヨーヨーは、より多くのメモリを与えることを減らす :以下も

、メモリ内の2つの異なるゾーンがあることを忘れていけませんどこが必要なのか(彼らは自動的に行われますが...)。

可能であれば、スパークシャッフルパーティションを100に、次に10に減らしてみてください。

試してみてください(テストはしませんでしたが、助けになるかもしれません)。

+0

なぜFIFOはFAIRよりも優れていますか?また、100の代わりに10つのシャッフルパーティションを使用することを意味しますか? –

+0

FIFOは、単一のクエリが一度に実行されるため、リソースの方が優れています。私は小さなワークロードのSparkパーティションを小さくする方が良いことが分かりました。それを試してみてください.WAUIのパーティションのサイズを確認してください。最大値は2Goです。パーティションが少ないほどシャッフル操作が少なくなります。 –

+0

私たちは同時に実行する必要がある複数のクエリを持つマルチユーザ環境を持っています。このような環境でFAIRからFIFOに変更することをお勧めしますか?シャッフルパーティションの数を100から10に減らすことができますか? –

関連する問題