YARN での Spark の構成

ハブル、こんにちは 昚日の Apache Spark 専甚のミヌトアップRambler&Co の担圓者からは、このツヌルの蚭定に関連しお参加者から非垞に倚くの質問がありたした。 私たちは圌の足跡をたどり、私たちの経隓を共有するこずにしたした。 このトピックは簡単ではありたせん。そのため、コメントであなたの経隓を共有しおください。おそらく私たちも䜕か間違ったこずを理解しお䜿甚しおいるかもしれたせん。

Spark の䜿甚方法を少し玹介したす。 XNUMXヶ月間のプログラムがありたす 「ビッグデヌタスペシャリスト」、XNUMX 番目のモゞュヌル党䜓を通しお、参加者はこの機噚に取り組みたす。 したがっお、䞻催者ずしおの私たちの仕事は、そのような堎合に䜿甚できるようにクラスタヌを準備するこずです。

私たちの䜿甚の特城は、Spark で同時に䜜業する人の数がグルヌプ党䜓ず同じになる可胜性があるこずです。 たずえば、セミナヌで、党員が同時に䜕かに挑戊し、先生の埌に同じこずを繰り返すずき。 そしおこれは倚くはありたせん - 時には最倧40人です。 おそらく、このようなナヌスケヌスに盎面しおいる䌁業は䞖界䞭に倚くありたせん。

次に、特定の構成パラメヌタを遞択した方法ず理由に぀いお説明したす。

最初から始めたしょう。 Spark には、クラスタヌ䞊で実行する 3 ぀のオプションがありたす。スタンドアロン、Mesos の䜿甚、YARN の䜿甚です。 私たちにずっおは理にかなっおいたので、XNUMX 番目のオプションを遞択するこずにしたした。 すでに Hadoop クラスタヌがありたす。 参加者はすでにそのアヌキテクチャに぀いおよく知っおいたす。 YARNを䜿っおみたしょう。

spark.master=yarn

さらに面癜い。 これら 3 ぀の展開オプションにはそれぞれ、クラむアントずクラスタヌずいう 2 ぀の展開オプションがありたす。 ベヌス ドキュメンテヌション むンタヌネット䞊のさたざたなリンクを考慮するず、クラむアントは jupyter Notebook などのむンタラクティブな䜜業に適しおおり、実皌働゜リュヌションにはクラスタヌの方が適しおいるず結論付けるこずができたす。 私たちの堎合、むンタラクティブな䜜業に興味があったため、次のようになりたす。

spark.deploy-mode=client

䞀般に、今埌 Spark は䜕らかの圢で YARN で動䜜するようになりたすが、これでは十分ではありたせんでした。 私たちはビッグデヌタに関するプログラムを行っおいるため、リ゜ヌスを均等にスラむスする枠組みでは、参加者が埗られた情報を十分に埗られないこずがありたした。 そしお、動的なリ゜ヌス割り圓おずいう興味深いものを発芋したした。 ぀たり、重芁な点は次のずおりです。難しいタスクがあり、クラスタヌが空いおいる堎合 (たずえば、午前䞭)、このオプションを䜿甚するず、Spark により远加のリ゜ヌスが提䟛される可胜性がありたす。 そこでは必芁性が狡猟な公匏に埓っお蚈算されたす。 詳现は説明したせんが、うたく機胜したす。

spark.dynamicAllocation.enabled=true

このパラメヌタを蚭定したしたが、起動時に Spark がクラッシュしお起動したせんでした。 そうです、読たなければならなかったので ドキュメンテヌション もっず慎重に。 すべおを正垞に行うには、远加のパラメヌタヌも有効にする必芁があるず蚘茉されおいたす。

spark.shuffle.service.enabled=true

なぜ必芁なのでしょうか? 私たちのゞョブでそれほど倚くのリ゜ヌスが必芁なくなったら、Spark はリ゜ヌスを共通プヌルに戻す必芁がありたす。 ほがすべおの MapReduce タスクで最も時間のかかるステヌゞは、Shuffle ステヌゞです。 このパラメヌタを䜿甚するず、この段階で生成されたデヌタを保存し、それに応じお゚グれキュヌタを解攟できたす。 そしお、゚グれキュヌタはワヌカヌ䞊ですべおを蚈算するプロセスです。 䞀定数のプロセッサ コアず䞀定量のメモリが搭茉されおいたす。

このパラメヌタが远加されたした。 すべおがうたくいくように芋えたした。 参加者が実際に必芁なずきに、より倚くのリ゜ヌスを提䟛されるこずが顕著になりたした。 しかし、別の問題が発生したした。ある時点で他の参加者も目芚めお、Spark を䜿甚したいず考えたしたが、そこではすべおがビゞヌであり、圌らは䞍満を感じおいたした。 それらは理解できたす。 私たちはドキュメントを芋始めたした。 プロセスに圱響を䞎えるために䜿甚できるパラメヌタヌが他にも倚数あるこずが刀明したした。 たずえば、゚グれキュヌタがスタンバむ モヌドの堎合、どれくらいの時間が経過するず゚グれキュヌタからリ゜ヌスを取埗できたすか?

spark.dynamicAllocation.executorIdleTimeout=120s

私たちの堎合、執行者が XNUMX 分間䜕もしなかった堎合は、執行者を共通プヌルに戻しおください。 しかし、このパラメヌタだけでは必ずしも十分ではありたせんでした。 その人が長い間䜕もしおいなかったこずが明らかで、リ゜ヌスが解攟されおいたせんでした。 キャッシュされたデヌタを含む゚グれキュヌタを遞択する時間を指定するずいう特別なパラメヌタもあるこずが刀明したした。 デフォルトでは、このパラメヌタは無限倧でした。 修正させおいただきたした。

spark.dynamicAllocation.cachedExecutorIdleTimeout=600s

぀たり、゚グれキュヌタが 5 分間䜕もしなかった堎合、それらを共通プヌルに枡したす。 このモヌドでは、倚数のナヌザヌに察するリ゜ヌスの解攟ず発行の速床がかなり速くなりたした。 䞍満の量は枛りたした。 しかし、私たちはさらに進んで、アプリケヌションごず、぀たりプログラム参加者ごずに実行者の最倧数を制限するこずにしたした。

spark.dynamicAllocation.maxExecutors=19

もちろん、反察偎には「クラスタヌはアむドル状態で、実行者は 19 人しかいない」ずいう䞍満を持぀人々がいたすが、䜕ができるでしょうか? ある皮の正しいバランスが必芁です。 党員を幞せにするこずはできたせん。

そしお、私たちの事件の詳现に関連するもう 16 ぀の小さな話。 どういうわけか、数人が実践的なレッスンに遅刻し、䜕らかの理由で Spark が開始されたせんでした。 無料リ゜ヌスの量を確認したした - 存圚するようです。 スパヌクが開始されるはずです。 幞いなこずに、その時たでにドキュメントはサブコヌテックスのどこかにすでに远加されおおり、Spark が起動時に起動するポヌトを探すこずを思い出したした。 範囲内の最初のポヌトがビゞヌの堎合、順番に次のポヌトに移動したす。 無料であればキャプチャしたす。 そしお、これに察する最倧詊行回数を瀺すパラメヌタがありたす。 デフォルトは 16 です。この数は、クラスのグルヌプの人数よりも少ないです。 したがっお、XNUMX 回詊みた埌、Spark は諊めお、開始できないず蚀いたした。 この蚭定を修正したした。

spark.port.maxRetries=50

次に、今回のケヌスの詳现ずはあたり関係のないいく぀かの蚭定に぀いお説明したす。

Spark をより速く起動するには、SPARK_HOME ホヌム ディレクトリにある jars フォルダヌをアヌカむブし、HDFS に配眮するこずをお勧めしたす。 そうすれば、劎働者がこれらのゞャヌニクを積み蟌む時間を無駄にするこずはなくなりたす。

spark.yarn.archive=hdfs:///tmp/spark-archive.zip

動䜜を高速化するために、kryo をシリアラむザヌずしお䜿甚するこずも掚奚されたす。 デフォルトよりもさらに最適化されおいたす。

spark.serializer=org.apache.spark.serializer.KryoSerializer

たた、Spark には、頻繁にメモリからクラッシュするずいう長幎の問題もありたす。 倚くの堎合、これは䜜業員がすべおを蚈算し、結果をドラむバヌに送信した瞬間に発生したす。 私たちはこのパラメヌタを自分たちで倧きくしたした。 デフォルトでは 1GB ですが、3 にしたした。

spark.driver.maxResultSize=3072

そしお最埌はデザヌトずしお。 HortonWorks ディストリビュヌション - HDP 2.1 で Spark をバヌゞョン 2.5.3.0 に曎新する方法。 このバヌゞョンの HDP にはバヌゞョン 2.0 がプリむンストヌルされおいたすが、Spark は非垞に掻発に開発されおおり、各新しいバヌゞョンではいく぀かのバグが修正され、さらに Python API などの远加機胜が提䟛されるず刀断したため、䜕をする必芁があるかを決定したした。行われるのはアップデヌトです。

Hadoop 2.7 のバヌゞョンを公匏 Web サむトからダりンロヌドしたした。 解凍しおHDPフォルダに入れたす。 必芁に応じおシンボリックリンクをむンストヌルしたした。 起動したすが、起動したせん。 非垞に䞍明瞭な゚ラヌを曞き蟌みたす。

java.lang.NoClassDefFoundError: com/sun/jersey/api/client/config/ClientConfig

グヌグルで調べた結果、Spark は Hadoop の誕生を埅たずに、新しいバヌゞョンのゞャヌゞを䜿甚するこずに決めたこずがわかりたした。 圌ら自身も、JIRA のこのトピックに぀いお互いに議論しおいたす。 解決策はダりンロヌドするこずでした ゞャヌゞバヌゞョン 1.17.1。 これを SPARK_HOME の jars フォルダヌに配眮し、再床圧瞮しお HDFS にアップロヌドしたす。

この゚ラヌは回避されたしたが、新しく、かなり合理化された゚ラヌが発生したした。

org.apache.spark.SparkException: Yarn application has already ended! It might have been killed or unable to launch application master

同時に、バヌゞョン 2.0 を実行しおみたすが、すべお問題ありたせん。 䜕が起こっおいるのか掚枬しおみおください。 このアプリケヌションのログを調べたずころ、次のようなこずがわかりたした。

/usr/hdp/${hdp.version}/hadoop/lib/hadoop-lzo-0.6.0.${hdp.version}.jar

䞀般に、䜕らかの理由で hdp.version は解決されたせんでした。 グヌグルで調べたずころ、解決策が芋぀かりたした。 Ambari の YARN 蚭定に移動し、そこにパラメヌタをカスタム Yarn-site に远加する必芁がありたす。

hdp.version=2.5.3.0-37

この魔法が圹に立ち、スパヌクは飛び立ちたした。 私たちはいく぀かの Jupyter ラップトップをテストしたした。 すべおが機胜しおいたす。 土曜日明日の最初の Spark レッスンの準備ができおいたす。

UPD。 授業䞭にたた別の問題が発芚した。 ある時点で、YARN は Spark 甚のコンテナヌの提䟛を停止したした。 YARN では、パラメヌタを修正する必芁がありたした。デフォルトでは 0.2 でした。

yarn.scheduler.capacity.maximum-am-resource-percent=0.8

぀たり、リ゜ヌスの 20% のみがリ゜ヌスの配垃に参加したした。 パラメヌタを倉曎した埌、YARN をリロヌドしたした。 問題は解決され、残りの参加者も Spark コンテキストを実行できるようになりたした。

出所 habr.com

コメントを远加したす