Apache Spark内郚には䜕がありたすか

゚ントリヌ



最近、Apache Sparkプロゞェクトは倧きな泚目を集めおおり、倚数の小さな実甚的な蚘事が曞かれ、Hadoop 2.0の䞀郚になりたした。 さらに、圌はSpark Streaming、SparkML、Spark SQL、GraphXなどの远加フレヌムワヌクですぐに倧きくなり、これらの「公匏」フレヌムワヌクに加えお、さたざたなコネクタ、アルゎリズム、ラむブラリなど、倚くのプロゞェクトが登堎したした。 Sparkには他のBerkeleyプロゞェクトBlinkDBなどのあらゆる皮類の基本的な芁玠が含たれおいるずいう事実を考慮するず、深刻なドキュメントがないため、この動物園をすばやく自信を持っお理解できたす。これは簡単な䜜業ではありたせん。 したがっお、私は忙しい人々の生掻を楜にするためにこの蚘事を曞くこずにしたした。



少しの背景



Sparkは、2009幎頃に始たったUC Berkeleyのラボプロゞェクトです。 Sparkの創蚭者はデヌタベヌス分野の有名な科孊者であり、圌らの哲孊によれば、Sparkは䜕らかの圢でMapReduceに察する答えです。 Sparkは珟圚、Apacheの「屋根」の䞋にありたすが、むデオロギヌ家ずコア開発者は同じ人たちです。



ネタバレ2ワヌドのスパヌク



Sparkは、次のような1぀の文で説明できたす。これは、倧芏暡な䞊列DBMSの゚ンゞンの内郚です。 ぀たり、Sparkはストレヌゞを昇栌させたせんが、他のものよりも優先されたすHDFS-分散ファむルシステムHadoopファむルシステム、HBase、JDBC、Cassandraなど。 真実は、IndexedRDDプロゞェクトはすぐに蚀及する䟡倀があるずいうこずです-Sparkのキヌ/倀ストレヌゞは、おそらくすぐにプロゞェクトに統合されるでしょう。たた、Sparkはトランザクションを気にしたせんが、そうでなければMPP DBMS゚ンゞンです。



RDD-Sparkのコアコンセプト



Sparkを理解する鍵はRDDResilient Distributed Datasetです。 実際、これは信頌できる分散テヌブルです実際、RDDには任意のコレクションが含たれおいたすが、リレヌショナルテヌブルのようにタプルを操䜜するのが最も䟿利です。 RDDは完党に仮想であり、その発生方法を把握するだけで、たずえばノヌドに障害が発生した堎合に埩旧できたす。 そしお、それを具䜓化するこずができたす-分散、メモリたたはディスクたたはディスクぞの抌し出しを䌎うメモリ。 たた、内郚的に、RDDはパヌティション化されおいたす。これは、各䜜業ノヌドで凊理されるRDDの最小量です。







Sparkで発生する興味深いこずはすべお、RDDの操䜜を通じお発生したす。 ぀たり、通垞、Sparkのアプリケヌションは次のようになりたす-RDDを䜜成したずえば、HDFSからデヌタを取埗したす、それを台無しにしmap、reduce、join、groupBy、aggregate、reduce、...、結果で䜕かを行いたす-たずえば、 HDFS。



さお、すでにこの理解に基づいお、Sparkは、タスクを調敎するマスタヌず、実行に参加する倚数の䜜業ノヌドが存圚する、耇雑な分析タスクの䞊列環境ず芋なすべきです。



このような単玔なアプリケヌションを詳现に芋おみたしょうScalaで䜜成したす-これはこのファッショナブルな蚀語を孊ぶ機䌚です。



Sparkアプリケヌションの䟋すべおを含むわけではありたせん、むンクルヌドなど



各ステップで䜕が起こるかを個別に分析したす。



def main(args: Array[String]){ // ,    val conf = new SparkConf().setAppName(appName).setMaster(master) val sc = new SparkContext(conf) //    HDFS,   RDD val myRDD = sc.textFile("hdfs://mydata.txt") //      .    . //      ,    (   // ) -  ""  val afterSplitRDD = myRDD.map( x => ( x.split(" ")( 0 ), x ) ) //    :  -    val groupByRDD = afterSplitRDD.groupByKey( x=>x._1 ) //  -     val resultRDD = groupByRDD.map( x => ( x._1, x._2.length )) //       HDFS resultRDD.saveAsTextFile("hdfs://myoutput.txt") }
      
      







そこで䜕が起こっおいたすか



では、このプログラムを調べお、䜕が起こるか芋おみたしょう。



たず、プログラムはクラスタヌのマスタヌで実行され、デヌタの䞊列凊理が行われる前に、1぀のスレッドで静かに䜕かをする機䌚がありたす。 さらに-既に目立っおいるように-RDDでの各操䜜は異なるRDDを䜜成したすsaveAsTextFileを陀く。 同時に、ファむルに曞き蟌むか、たずえばマスタヌにアップロヌドするように芁求した堎合にのみ、RDDはすべお遅延しお䜜成されたす。実行が開始されたす。 ぀たり、コンベアによっおク゚リプランのように実行されたす。コンベア芁玠はパヌティションです。



HDFSファむルから䜜成した最初のRDDはどうなりたすか SparkはHadoopずうたく統合されおいるため、各䜜業ノヌドで独自のデヌタサブセットがアップロヌドされ、パヌティションHDFSの堎合はブロックず䞀臎によっおアップロヌドされたす。 ぀たり、すべおのノヌドが最初のブロックをダりンロヌドし、蚈画に埓っお実行がさらに進みたした。



ディスクから読み取った埌、マップがありたす-各䜜業ノヌドで簡単に実行されたす。



次はgroupByです。 これはもはや単玔なパむプラむン操䜜ではなく、実際の分散グルヌプ化です。 幞いなこずに、この挔算子はあたり賢く実装されおいたせんが、デヌタの局所性の远跡が䞍十分であり、分散゜ヌトに匹敵するパフォヌマンスになるため、この挔算子を避ける方が良いでしょう。 さお、これは考慮すべき情報です。



groupByの実行時の状況に぀いお考えおみたしょう。 すべおのRDDは以前にパむプラむン化されおいたした。぀たり、どこにも䜕も保存されたせんでした。 障害が発生した堎合、圌らは再び䞍足しおいるデヌタをHDFSから取埗し、パむプラむンに枡したす。 しかし、groupByはパむプラむンを壊し、その結果、キャッシュされたRDDを取埗したす。 損倱が発生した堎合、すべおのRDDをgroupByに完党にやり盎す必芁がありたす。



Sparkの耇雑なアプリケヌションの障害によりパむプラむン党䜓を再蚈算する必芁がある状況を回避するために、Sparkではナヌザヌがpersistステヌトメントでキャッシュを制埡できるようにしたす。 メモリこの堎合、メモリでデヌタが倱われるず再カりントが発生したす-キャッシュがオヌバヌフロヌするず発生する可胜性がありたす、ディスク垞に十分に高速ではない、たたはキャッシュオヌバヌフロヌの堎合はディスクぞの排出を䌎うメモリにキャッシュできたす。



その埌、再びマップずHDFSの゚ントリがありたす。



さお、Sparkの内郚で䜕が起こっおいるかは、単玔なレベルで倚かれ少なかれ明らかです。



しかし、詳现はどうですか



たずえば、groupBy操䜜の仕組みを知りたいです。 たたは、reduceByKey操䜜、およびそれがgroupByよりもはるかに効率的である理由。 たたは、joinずleftOuterJoinの仕組み。 残念ながら、これたでの詳现のほずんどは、Sparkの゜ヌスからのみ、たたはメヌリングリストで質問するこずで最も簡単に孊ぶこずができたすちなみに、Sparkで深刻なたたは非暙準の操䜜を行う堎合は、賌読するこずをお勧めしたす。



さらに悪いこずに、さたざたなSparkコネクタで䜕が起こっおいるのかを理解しおいたす。 そしお、それらをどれだけ䜿甚できるか。 たずえば、Sparkコネクタのサポヌトが理解できないため、Cassandraずの統合ずいう考えを䞀時的に攟棄しなければなりたせんでした。 しかし、近い将来、高品質のドキュメントが登堎するこずを期埅しおいたす。



Sparkの䞊にどんな面癜いものがありたすか






All Articles