アリー雲大データの利器Maxcompute-mapjoinを使って最適化して検索します。

4155 ワード

もっと読む
ビッグデータ計算サービス(MaxComput,本名ODPS)は、高速で完全に信託されたGB/TB/PB級のデータストアソリューションです。https://help.aliyun.com/document_detail/27800.html?spm=5176.7840267.69.393.po 3 IvSは主に三つの操作データの方式SQL、UDF、MapReduceがあります。hadoopを知る人はこれらのことをよく知っています。
   Maxcompute SQL   SQL        Maxcompute SQL     MapReduce   ,         MapReduce     ,UDF        sql                ,            ,sql       。
このことから分かるように、底の計算はすべてMapReduceという計算エンジンによって実行されます。まず、MapReduceとは何かを知る。一つのデータが大きい場合は、MaxComputeに分散して保存されています。つまり、多くのサーバに別々に保管されています。一つのタスクが実行されると、これらのデータがあるサーバからプロセスを起動してこれらのデータを読み取り、計算などの操作を行います。また、一つのプロセスを起動してこれらのデータをまとめて分析して出力します。前者のプロセスをMapといい、後者のプロセスをReduceといい、合わせてMapReduceタスクといいます。sqlを使ってデータを操作するときは、ジョンをよく使います。例えば、select*from A join B on a.id=b.idというように、このsqlはMapReduceタスクに変換して実行する時:1、mapタスクはデータを読み、二つのテーブルのデータに対してマークを付けたデータを入力して、異なるマークのテーブルデータと同じ関連フィールドのデータを一緒に出力します。Bigテーブルのデータ量は比較的大きいです。分布はn台のインスタンスサーバにあります。Smallテーブルはサーバ1台に保存されています。まずMaxComputeはいくつかのMapのプロセス(Mapタスク)を起動して、これらのデータを読み出してそれぞれマークを付けます。Mapの個数は一つのパラメータで制御されます。ここでは説明しません。注意Bigテーブルを読み込むMapタスクごとに他のサーバでデータを引き出す必要があります。Smallテーブルも一つまたはいくつかのmapタスクを起動してファイルシステムのデータを読み込みます。読み取りが完了するとReduce側でデータを受信し、関連フィールドが等しいと判断して一緒に出力します。関連効果を達成する。私たちは例を見ることができます。比較的大きい時計のトレイを準備しました。アメリカ.lt、5 Gサイズ、データは約7億本です。比較的小さい時計を用意しました。ジョン.testは、3つのデータしかありません。
select a.* from train_user_lt a left outer join map_join_test b on a.user_id = b.user_id;
このsqlを実行しました。図のように実行するプロセス図はMaxcoput特有のユーザーがタスクの実行過程を確認するのを助けることができるlogviewといいます。ODPS Jobに提出した後、Debugタスクを確認するツールです。https://help.aliyun.com/document_detail/27987.html図から見ると、3つの部分の1、大きな時計train_に分けられています。アメリカ.ボルトは39のmapタスクを起動して、データ7070259条2を読みに行きます。小さいテーブルは一つのmapタスクを起動して、3つのデータを読みます。3,reduce段階は3+7070259=707025262本のデータを受信し、7070259本のデータを出力しました。left outerjinは左の大きいテーブルから出力します。でも、見ていると40分かかります。そうすると、かなり長い時間です。速度を上げるにはどう最適化すればいいですか?比較的に直接的に暴力的に最適化する方法がありますか?ここではポイントが来ました。Mapjoin:MAPJIONは小表を全部メモリに取り込んで、小表を複数コピーして、大表データの所在例の中に配布します。map段階で直接に他のテーブルのデータを持ってメモリのデータと一致します。mapではジョイン操作をしていますので、reduceを省いて運行する効率が高いです。大きな時計と一つ以上の小さな時計をジョインするときに使うのが条件です。SQLは、ユーザが指定したテーブルをすべてジョイン動作を実行するプログラムのメモリにロードし、ジョインの実行速度を速くします。注意が必要です。Maxcomputでmapjoinを使う時:left outer jinの左の表は大きい時計でなければなりません。ライトアウトジョンの右の時計は大時計でなければなりません。inner join左の表または右の表を大きな表として使用することができます。full outerjonはmapjoinを使用できません。mapjoinは、小表がサブクエリであることをサポートします。mapjoinを使用する場合は、小表またはサブクエリーを参照する必要があります。別名を参照する必要があります。mapjoinでは、不等値接続または使用or接続の複数の条件が使用されてもよい。現在MaxComputeはmapjoinの中で最大8枚の小さいテーブルを指定することを支持して、さもなくば文法の誤りを申し込みます;mapjoinを使用すると、すべてのテーブルが占有するメモリの合計は512 MHzを超えてはいけません。MaxComputeは圧縮メモリですので、小さいテーブルはメモリにロードされるとデータサイズが急激に膨張します。ここの512 MB制限はメモリにロードした後の空間サイズです。複数のテーブルジョンの場合、一番左の二つの表は同時にmapjoinの表ではありません。なぜleft outerjinの左の表は大きいテーブルでなければならないのですか?左の表は大きいテーブルの時、小さいテーブルの全部のデータと大きいテーブルのある実例のサーバーの中のデータを合わせて、ちょうど小さい時計はメモリの中にあります。左の表が小さい場合は、大きい表のすべてのデータを引き出して、小さな表と一致させる必要があります。性能はどうなりますか?書き方を見に来ました
select /* + mapjoin(b) */  a.* from train_user_lt a left outer join map_join_test b on a.user_id = b.user_id;
//   sql           mapjoin,          
最適化された効果タスクは二つの部分になります。map側は直接データを読み取り、メモリ内のテーブルと関連付けて出力します。つまり、関連はreduceからmap側に移動してjoinし、reduceを省略したことから、mapjoinと呼ばれています。実行時間を見てください。1分20秒以上です。40分前です。もちろん、こちらでテストします。二つの比較的極端なデータを比較しますので、効果は比較的にはっきりしています。このことから、大表関連小表の場合は、mapjoinを使って最適化されたクエリを行うことができます。では、Mapjoinは性能を最適化する以外に、何をすることができますか?MaxCompute SQLは、通常のjoinのon条件では不等値表式、or、likeなどのロジックを用いた複雑なjoin条件をサポートしていませんが、mapjoinでは上記のような動作が可能です。例えば
    select /*+ mapjoin(a) */
        a.total_price,
        b.total_price
    from shop a join sale_detail b
    on a.total_price < b.total_price or a.total_price + b.total_price < 500;
まとめ:mapjoinは小さな操作変化のように見えますが、実際には大きな効率をもたらします。また、関連しない業務シーンも解決できます。馬雲がよく言うように、smal is beautiful、small isパワーフル!