Sqoop --m(--num-mappers)參數使用及優化

 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 任務併發抽取。

 

參考:

https://www.jianshu.com/p/be33f4b5c62e

https://www.cnblogs.com/zhnagqi-dream/p/11792612.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章