2017-02-15 169 views
1

我正在使用Sqoop 1.4.6將數據從MySQL導入到Hive,使用import-all-tables選項。結果是好的,但導入過程本身很慢。例如,其中一個數據庫包含40-50張表,遠遠低於100萬行,並且需要大約25-30分鐘才能完成。經過調查,似乎大部分時間都花在初始化每個導入表的Hive上。在同一個數據庫上測試一個普通的mysqldump在下在1分鐘內完成。所以問題是如何減少初始化時間,如果是這種情況,例如使用單個Hive會話?使用import-all-tables優化Sqoop數據從MySQL導入到Hive

進口的命令是:

sqoop import-all-tables -Dorg.apache.sqoop.splitter.allow_text_splitter=true --compress --compression-codec=snappy --num-mappers 1 --connect "jdbc:mysql://..." --username ... --password ... --null-string '\\N' --null-non-string '\\N' --hive-drop-import-delims --hive-import --hive-overwrite --hive-database ... --as-textfile --exclude-tables ... --warehouse-dir=... 

更新:

Sqoop版本:1.4.6.2.5.3.0-37

蜂巢版本:1.2.1000.2.5.3.0 -37

可能涉及到:

https://issues.apache.org/jira/browse/HIVE-10319

回答

1

remove選項--num-mappers 1與默認運行進口4名映射器OR將其更改爲一些較大的數字--num-mappers 8(如果硬件允許) - 這是一種用於具有主鍵的表上運行更多的中並行作業進口,AND使用--autoreset-to-one-mapper選項 - 它將爲沒有主鍵的表使用1個映射器。還可以使用--direct模式:

sqoop import-all-tables \ 
--connect "jdbc:mysql://..." --username ... \ 
--password ... \ 
-Dorg.apache.sqoop.splitter.allow_text_splitter=true \ 
--compress --compression-codec=snappy \ 
--num-mappers 8 \ 
--autoreset-to-one \ 
--direct \ 
--null-string '\\N' 
... 

讓我們知道,如果這提高性能...


更新:

--fetch-size=<n> - 當代表的條目數 Sqoop必須一次讀取。默認值爲1000.

根據需要讀取的數據量增加fetch-size參數的值。根據可用內存 和帶寬設置值。


從當前值增加的映射器存儲器一些更高數目: 例如:sqoop import-all-tables -D mapreduce.map.memory.mb=2048 -D mapreduce.map.java.opts=-Xmx1024m <sqoop options>


Sqoop Performance Tuning Best Practices

調諧下面在JDBC連接或Sqoop映射Sqoop參數以優化性能

  • 批次(出口)
  • 分裂由和邊界查詢(不需要因爲我們 正在起訴--autoreset-to-one-mapper,不能與import-all-tables
  • 直接
  • 取尺寸
  • NUM映射器
+0

它l使用ooks like I can not use'--direct' with'--hive-drop-import-delims',但會嘗試你的其他建議,然後找回... –

+0

幾乎相同的結果;每個數據庫大約25分鐘。我也試着用總行數不同的數據庫,但數據量大致相同,所花費的總時間相當接近。似乎每個表有一些不變的時間,這與其中的數據量無關。 –

+0

您可以嘗試將mapper內存從當前值增加到更高的數字嗎?:'sqoop import-all-tables -D mapreduce.map.memory.mb = 2048 -D mapreduce.map.java.opts = -Xmx1024m ' –