私はそれが基本的にこのロジックを使用して、Sqoopはマッパーの間で作業を分割する方法を知っている:(= 1(1)mytableはSELECT * FROM)T1からmixとmaxを使ってデータを分割する理由は何ですか?
MIN(ID)を選択し、MAX(ID)
ここで、idは--split by
で定義された値です。私は--boundary-query
を使って別のロジックを使ってこのロジックを変更できることも知っています。
たとえば、キー列の値が均一に分散されていない場合、たとえばレコードが10個あり、これを5つのマッパーで実行するとしたらどうなるでしょうか(OK、これは一例です):
id_column: 1,200,201,202,203,204,205,206,207, 208, 209, 210, 211
splits: (211 - 1)/5 = 42
mapper1 = from 1 to 42 ==> 1 record processed
mapper2 = from 42 to 84 ==> 0 records processed
mapper3 = from 84 to 126 ==> 0 records processed
mapper4 = from 126 to 168 ==> 0 records processed
mapper5 = from 168 to 211 ==> 12 records processed
は、たぶん私は一例でミスを犯したが、私が言及したいのは、我々はなりませんレコードの数と、マッパーの間でアンバランスの仕事を持っているということです大したことではありませんが、何百万ものレコードについて話しているときは、パフォーマンスに大きな影響を与えます。言われていること
、私は二つのことを知りたい:
言及したロジックの背後にある考え方は何ですか? (おそらく、私が見ていないものがあるかもしれません)
例のように一様に分布していないidsカラムを持っている場合、私は回避策をどのように構築できますか?