叀いMapReduceが新しいTezよりも優れおいる堎合





誰もが知っおいるように、䞖界のデヌタ量は増え続けおおり、情報の流れを収集しお凊理するこずがたすたす困難になっおいたす。 これを行うには、MapReduceパラダむムを䜿甚しお、マルチスレッドアプリケヌションの開発ずデバッグの方法を簡玠化するずいう考えで、人気のあるHadoop゜リュヌションを䜿甚したす。 このパラダむムは垞にそのタスクで成功するずは限りたせん。しばらくするず、Hadoopを超える「䞊郚構造」がありたす DAGパラダむムを備えたApache Tez 。 Tezの倖芳は、Hive HDFS-SQLハンドラヌにも適応したす。 しかし、垞に新しいものが叀いものより優れおいるわけではありたせん。 ほずんどの堎合、HiveOnTezはHiveOnMapReduceよりも倧幅に高速ですが、いく぀かの萜ずし穎は゜リュヌションのパフォヌマンスに倧きく圱響したす。 ここで、私が遭遇したニュアンスをお䌝えしたいず思いたす。 これがETLたたは別のHadoop UseCaseの高速化に圹立぀こずを願っおいたす。



MapReduce、Tez、Hive



先ほど蚀ったように、䞖界にはたすたす倚くのデヌタがありたす。 たた、ストレヌゞず凊理のために、Hadoopなどのたすたすトリッキヌな゜リュヌションが登堎したす。 HDFSに保存されたデヌタを凊理するプロセスを平均的なアナリストでも簡単に行えるようにするために、Hadoopにはいく぀かのSQLアドオンがありたす。 それらの䞭で最も叀く「単玔な」ものはHiveです。 Hiveの本質は次のずおりです。わかりやすい列ストア圢匏のデヌタがあり、それらに関する情報をメタデヌタに入力し、いく぀かの制限付きの暙準SQLを蚘述し、問題を解決するMapReduceゞョブのチェヌンを生成したす。 玠晎らしく、快適ですが、遅いです。 たずえば、簡単なク゚リを次に瀺したす。



select t1.column1, t2.column2 from table1 t1 inner join table2 t2 on t1.column1 = t2.column1 union select t3.column1, t4.column2 from table3 t3 inner join table4 t4 on t3.column1 = t4.column1 order by column1;
      
      





このク゚リは4぀のゞョブを生成したす。









ステップは順次実行され、各ステップはHDFSにデヌタを曞き蟌むこずで終了したす。 非垞に最適に芋えたせん。 たずえば、ステップ1ず2は䞊行しお実行できたす。 たた、耇数のステップで同じマッパヌを適甚し、これらのマッパヌの結果に耇数のタむプのレデュヌサヌを適甚するこずが賢明な堎合がありたす。 しかし、1぀のゞョブのフレヌムワヌク内でのMapReduceの抂念では、これは蚱可されおいたせん。 この問題を解決するために、DAGコンセプトのApache Tezがすぐに登堎したす。 DAGの本質は、Mapper-Reducerのペア+むプシロンの代わりに、非巡回有向グラフを䜜成するこずです。各頂点はMapper.ClassたたはReduser.Classであり、゚ッゞはデヌタフロヌ/実行順序を瀺したす。 TAGはDAGに加えお、さらにいく぀かのボヌナスを提䟛したした。ゞョブの起動の高速化既に実行䞭のTez-Engineを介しおDAGゞョブを送信できたす、ステップ間でノヌドメモリのリ゜ヌスを保持する機胜、独立しお䞊列化を起動する機胜などです。 Tezが登堎し、察応するアドオンがHiveに远加されたした。 このアドむンを䜿甚するず、ク゚リはほが次の構造のDAGゞョブになりたす。



  1. マッパヌはtable1を読み取りたす。
  2. マッパヌはtable2を読み取り、ステップ1の結果ず結合したす。
  3. マッパヌはtable3を読み取り、column1 IS NOT NULLをフィルタヌしたす。
  4. マッパヌはtable4を読み取り、column1 IS NOT NULLをフィルタヌしたす。
  5. レデュヌサヌは、ステップ3ず4の結果を結合したす。
  6. レデュヌサヌは結合を行いたす。
  7. レデュヌサヌのグルヌプ化ず䞊べ替え。
  8. 結果を収集したす。






実際、ステップ1ず2は最初の結合であり、2、3ず4は2番目の結合です結合が異なる方法で凊理されるように、異なるサむズのテヌブルを特別に遞択したした。 この堎合、2぀のブロックは互いに独立しおおり、䞊行しお実行できたす。 これはすでに非垞にクヌルです。 Tezは、耇雑なク゚リの凊理速床を倧幅に向䞊させたす。 ただし、 set hive.execution.engine=tez



はMapReduceよりも悪い堎合があるため、本番set hive.execution.engine=tez



に送信する前に、 set hive.execution.engine=mr



ずset hive.execution.engine=mr



䞡方でク゚リを実行する必芁がありたす。



それで、テスずは䜕ですか



Tezに぀いお知っおおくべきこずMapReduceロゞックをDAG有向非巡回グラフに倉曎し、マッパヌたたはリデュヌサヌにかかわらず、同じDataFlow内でいく぀かの異なるプロセスを同時に実行する機胜を提䟛したす。 䞻なこずは、その入力が準備できおいるこずです。 デヌタは、ステップ間でノヌドにロヌカルに保存でき、ディスク操䜜に頌らずにノヌドのRAMに保存するこずもできたす。 マッパヌずリデュヌサヌの数ず堎所を最適化しお、マルチステップ蚈算を考慮しおもネットワヌク䞊のデヌタ転送を最小限に抑え、1぀のTez-Jobのフレヌムワヌク内で隣接プロセスで既に動䜜しおいるコンテナヌを再利甚し、統蚈に䞊列実行を調敎できたす。前のステップで収集されたした。 さらに、この゚ンゞンにより、゚ンドナヌザヌはMapReduceず同じシンプルさでDAGタスクを䜜成できたすが、圌自身はリ゜ヌス、再起動、クラスタヌのDAG管理に埓事したす。 Tezは非垞にモバむルであり、Tezサポヌトを远加しおも既に実行䞭のプロセスが䞭断されるこずはありたせん。たた、叀いバヌゞョンのTezがすべおのクラスタヌタスクで動䜜する堎合、ロヌカルで「クラむアント偎」で新しいバヌゞョンをテストできたす。 最埌になりたしたが、Tezはクラスタヌ䞊でサヌビスずしお実行し、バックグラりンドで実行できるため、MapReduceが正垞に起動されたずきよりもはるかに高速にタスクを送信できたす。 Tezを詊したこずがなく、ただ疑問がある堎合は、 HortonWorks プレれンテヌションで公開されおいる速床比范をご芧ください。







そしお、Hiveずペアになりたした







しかし、グラフず説明のすべおの矎しさには、HiveOnTezに問題がありたす。



Tezは、MapReduceよりも䞍均䞀なデヌタ分垃に察する耐性が䜎い



最初の最倧の問題は、DAG-jobずMapReduce-jobの䜜成の違いにありたす。 それらには1぀の原則がありたす。マッパヌずリデュヌサヌの数は、ゞョブの開始時に蚈算されたす。 MapReduce-jobsのチェヌンによっおク゚リが実行される堎合にのみ、Hadoopは前のステップの結果ず゜ヌスによっお収集された分析に基づいお必芁なタスク数を蚈算したす。DAG-jobの堎合、これはすべおのステップが分析に基づいおのみ蚈算される前に行われたす。



䟋で説明したす。 ク゚リの途䞭のどこかで、ネストされたク゚リを実行するず、2぀のテヌブルがありたす。 統蚈によるず、それぞれにはn行ずk個の䞀意の結合キヌ倀がありたす。 出力では、玄n * k行が予想されたす。 そしお、この数量が1぀のコンテナにうたく収たり、Tezが次のステップ゜ヌトなどで1぀のReducerを匷調衚瀺するずしたす。 そしお、このReducerの数は、䜕があっおも実行プロセス䞭に倉化したせん。 ここで、実際にはこれらのテヌブルのスキュヌが非垞に悪いず仮定したす。1぀の倀に察しおn-k + 1行があり、残りはすべお1行に察しおです。 したがっお、出力ではn ^ 2 + k ^ 2-2kn-k + 2n行になりたす。 ぀たり、n + 2-2k/ k +k-1/ nはn / kの2倍の倧きさです。 そしお、そのような量の1぀のReducerは氞遠を実行したす。 MapReduceの堎合、このステップの出力でn ^ 2 + k ^ 2-2kn-k + 2nを受け取ったHadoopは、その匷床を客芳的に評䟡し、必芁な数のMapperずReducerを提䟛したす。 その結果、MapReduceを䜿甚するず、すべおがはるかに高速に動䜜したす。



ドラむな蚈算は非垞に手間がかかるように芋えるかもしれたせんが、実際にはこの状況は珟実です。 そしお、それが起こらなかった堎合、あなたは幞運だず考えおください。 耇雑なク゚リたたはカスタムマッパヌでラテラルビュヌを䜿甚するず、同様のTez-DAG効果に遭遇したした。



Tezのチュヌニング機胜



皮肉なこずに、私が知っおいる最埌の重芁なTez機胜は、そのDAGパワヌです。 ほずんどの堎合、クラスタヌは単なる情報のリポゞトリではありたせん。 たた、デヌタが凊理されるシステムでもあり、アクティビティの残りがクラスタのこの郚分に圱響を䞎えないこずが重芁です。 ノヌドはリ゜ヌスであるため、通垞、コンテナの数は無制限ではありたせん。 したがっお、ゞョブを実行するずきは、通垞のプロセスを倧幅に遅くしないために、すべおのコンテナを詰たらせない方が良いです。 そしお、ここでDAGはあなたにブタを眮くこずができたす。 DAGでは、再利甚やスムヌズな装填などにより、必芁なコンテナの数がチャンバヌあたり平均少なくなりたす。しかし、倚くのクむックステップがあるず、コンテナは指数関数的に増加し始めたす。 最初のマッパヌはただ完成しおいたせんが、デヌタはすでに他のマッパヌに配垃されおおり、コンテナはすべおこれに割り圓おられおいたす-ブヌム クラスタヌが倩井に詰たっおいるため、他の誰も単䞀のゞョブを開始できたせん。 十分なリ゜ヌスがなく、進行状況バヌの数倀がどれだけゆっくり倉化するかを確認したす。 䞀貫性があるため、MapReduceはこの効果を免れたすが、い぀ものように、高速で料金を支払いたす。



暙準のMapReduceがあたりにも倚くのコンテナを占有するずいう事実に察凊する方法を長い間知っおいたす。 パラメヌタヌを調敎したす。





ご泚意 DAGでは、すべおのリデュヌスステップに、ここで指定した数のプロセスが含たれたす ただし、Tezパラメヌタヌはより耇雑であり、MapReduceに蚭定したパラメヌタヌが垞に圱響するわけではありたせん。 たず、 hive.tez.container.size



に非垞に敏感であり、むンタヌネットはyarn.scheduler.minimum-allocation-mb



ずyarn.scheduler.maximum-allocation-mb



間の倀を取るこずをyarn.scheduler.minimum-allocation-mb



おいたす。 次に、未䜿甚のコンテナヌの保持パラメヌタヌを確認したす。





tez.am.container.reuse.enabled



オプションは、コンテナの再利甚を有効たたは無効にしたす。 無効にするず、前の2぀のパラメヌタヌは機胜したせん。 そしお第䞉に、グルヌプ化オプションを芋おください。





実際には、倖郚デヌタの読み取りを䞊列化するために、Tezはタスクを圢成するプロセスを倉曎したした。最初に、 tez.grouping.split-waves



はクラスタヌで実行できる波数wを掚定し、次にこの数にtez.grouping.split-waves



パラメヌタヌを乗算し、積Nを分割したすタスクごずの暙準分割数。 アクションの結果がtez.grouping.min-size



ずtez.grouping.max-size



間にある堎合、すべおが正垞であり、タスクはN個のタスクで開始されたす。 そうでない堎合、番号はフレヌムに適合したす。 Tezのドキュメントでは、「実隓ずしおのみ」 tez.grouping.split-count



パラメヌタヌを蚭定するこずをtez.grouping.split-count



たす。これにより、䞊蚘のすべおのロゞックがキャンセルされ、パラメヌタヌで指定されたグルヌプ数に分割がグルヌプ化されたす。 しかし、私はこのプロパティを䜿甚しないようにしたす。特定の入力デヌタを最適化するためにTezずHadoop党䜓に柔軟性を䞎えたせん。



テュスのニュアンス



倧きな問題に加えお、テズは小さな欠陥を免れたせん。 たずえば、http Hadoop ResourceManagerを䜿甚する堎合、Tez-jobがコンテナヌを占有する量は衚瀺されたせん。さらに、マッパヌずリデュヌサヌの状態は衚瀺されたせん。 クラスタヌの状態を監芖するには、次の小さなPythonスクリプトを䜿甚したす。



 import os import threading result = [] e = threading.Lock() def getContainers(appel): attemptfile = os.popen("yarn applicationattempt -list " + appel[0]) attemptlines = attemptfile.readlines() attemptfile.close() del attemptlines[0] del attemptlines[0] for attempt in attemptlines: splt = attempt.split('\t'); if ( splt[1].strip() == "RUNNING" ): containerfile = os.popen("yarn container -list " + splt[0] ) containerlines = containerfile.readlines() containerfile.close() appel[2] += int( containerlines[0].split("Total number of containers :")[1].strip() ) e.acquire() result.append(appel) e.release() appfile = os.popen("yarn application -list -appStates RUNNING") applines = appfile.read() appfile.close() apps = applines.split('application_') del apps[0] appsparams = [] for app in apps: splt = app.split('\t') appsparams.append(['application_' + splt[0],splt[3], 0]) cnt = 0 threads = [] for app in appsparams: threads.append(threading.Thread(target=getContainers, args=(app,))) for thread in threads: thread.start() for thread in threads: thread.join() result.sort( key=lambda x:x[2] ) total = 0 for app in result: print(app[0].strip() + '\t' + app[1].strip() + '\t' + str(app[2]) ) total += app[2] print("Total:",total)
      
      





HortonWorksの保蚌にもかかわらず、私たちのプラクティスは、Hiveで単玔なSELECT smth FROMテヌブルWHERE smthを実行するず、ほずんどの堎合MapReduceがより速く動䜜するこずを瀺しおいたす。 さらに、蚘事の冒頭で、私はあなたを少しだたしたした。HiveOnMapReduceでの䞊列化は可胜ですが、それほどスマヌトではありたせん。 必芁なこずは、 set hive.exec.parallel=true



にset hive.exec.parallel.thread.number=



...にset hive.exec.parallel.thread.number=



です-そしお、独立したステップマッパヌ+レデュヌサヌペアが䞊列に実行されたす。 はい、1぀のMapperの出力で耇数のReducerたたは次のMapperが起動される可胜性はありたせん。 はい、䞊列化ははるかに原始的ですが、䜜業を高速化したす。



Tezのもう1぀の興味深い機胜は、クラスタヌで゚ンゞンを実行し、しばらく゚ンゞンを保持するこずです。 䞀方では、タスクがノヌド䞊ではるかに高速に実行されるため、これにより䜜業が本圓に高速化されたす。 ただし、䞀方で、予期しないマむナスがありたす。重芁なプロセスは、このモヌドでは開始できたせん。TEZ゚ンゞンは、時間の経過ずずもに倚くのクラスを生成し、GCオヌバヌフロヌでクラッシュするためです。 そしお、それは次のようになりたす nohup hive -f ....hql > hive.log &



し、倜になっお午前䞭に来たした。 䞍快です。



叀き良きMapReduceが既に安定版リリヌスに含たれおいるずいう小さな問題の貯金箱に远加され、TEZは人気ず進歩性にもかかわらず、バヌゞョン0.8.4のたたであり、どの段階でもバグに遭遇する可胜性がありたす。 私にずっお最悪のバグは情報の削陀ですが、そのようなこずは芋たこずがありたせん。 しかし、Tezで誀った蚈算が発生し、MapReduceはそれを正しいず芋なしたす。 たずえば、私の同僚は、䞀意のEntityIdフィヌルドを持぀2぀のテヌブルtable1ずtable2を䜿甚したした。 Tezを通じおリク゚ストを行いたした。



 select table1.EntityId, count(1) from table1 left join table2 on table1.EntityId = table2.EntityId group by EntityId having count(1) > 1
      
      





そしお、出力にいく぀かの行がありたした ただし、MapReduceは空の結果を返したす。 同様の問題に関するバグレポヌトがありたす。



おわりに



Tezは無条件の利点であり、ほずんどの堎合、生掻が楜になり、Hiveでより耇雑なク゚リを蚘述し、それらに察する迅速な回答を期埅できたす。 しかし、他の善ず同様に、慎重なアプロヌチ、慎重さ、およびいく぀かのニュアンスの知識が必芁です。 その結果、叀い、実瞟のある、信頌できるMapReduceを䜿甚する方がTezを䜿甚するよりも優れおいる堎合がありたす。 HiveOnTezのマむナスに関する蚘事RuNetでも英語でもないが1぀も芋぀からなかったこずに非垞に驚き、このギャップを埋めるこずに決めたした。 この情報が誰かに圹立぀こずを願っおいたす。 よろしくお願いしたす みなさん、さようなら



All Articles