Sqoop並行化是啓多個map task實現的,-m(或--num-mappers)參數指定map task數,默認是四個。當指定爲1時,可以不用設置split-by參數,不指定num-mappers時,默認爲4,當不指定或者num-mappers大於1時,需要指定split-by參數。並行度不是設置的越大越好,map task的啓動和銷燬都會消耗資源,而且過多的數據庫連接對數據庫本身也會造成壓力。在並行操作裏,首先要解決輸入數據是以什麼方式負債均衡到多個map的,即怎麼保證每個map處理的數據量大致相同且數據不重複。--split-by指定了split column,在執行並行操作時(多個map task),Sqoop需要知道以什麼列split數據,其思想是:
1、先查出split column的最小值和最大值
2、然後根據map task數對(max-min)之間的數據進行均勻的範圍切分
例如id作爲split column,其最小值是0、最大值1000,如果設置4個map數,每個map task執行的查詢語句類似於:SELECT * FROM sometable WHERE id >= lo AND id < hi,每個task裏(lo,hi)的值分別是 (0, 250), (250, 500), (500, 750), and (750, 1001)。
Sqoop不能在多列字段上進行拆分,如果沒有索引或者有組合鍵,必須顯示設置splitting column;默認的主鍵作爲split column,如果表裏沒有主鍵或者沒有指定--split-by,就要設置num-mappers 1或者--autoreset-to-one-mapper,這樣就只會啓動一個task。
從上面的分析過程可以看到Sqoop以理想化方式根據split column將數據切分成多個範圍,如果split鍵的值不是均勻分佈,每個任務分配的數據量可能相差很大、導致數據傾斜。
耗時快慢和源端RDBMS服務器,表大小,列數量、網絡帶寬有較大關係,生產環境中,爲了防止主庫被Sqoop抽崩,一般從備庫中抽取數據。
一般RDBMS的導出速度控制在60~80MB/s,每個 map 任務的處理速度5~10MB/s 估算,即 -m 參數一般設置4~8,表示啓動 4~8 個map 任務併發抽取。
參考: