sqoop從mysql匯入超大表(3億資料)出錯記錄
背景:
從mysql中將三張大表匯入到hive,分別大小為6000萬,3億,3億。
使用工具:
sqoop
匯入指令碼:
#!/bin/bash
source /etc/profile
source ~/.bash_profile
sqoop import -D mapred.job.queue.name=hadoop -D mapreduce.reduce.memory.mb=8192 -D mapreduce.map.memory.mb=8192 -D mapreduce.map.java.opts=-Xmx4096m -D hive.merge.mapfiles=true -D hive.merge.mapredfiles=true \
--connect jdbc:mysql://******:3306/**?dontTrackOpenResources=true\&defaultFetchSize=1000\&useCursorFetch=true\&useUnicode=true\&characterEncoding=utf8 \
--username *** \
--password **** \
--fields-terminated-by '\t' \
--lines-terminated-by '\n' \
-m 200 \
--delete-target-dir \
--target-dir ******** \
--null-string '\\N' \
--null-non-string '\\N' \
--hive-drop-import-delims \
--driver com.mysql.jdbc.Driver \
--split-by abc\
--query "select * from ***** WHERE \$CONDITIONS" \
--boundary-query "select min(abc),max(abc) from ****"
修改部分:
1、修改map數
2、修改引數-D mapreduce.reduce.memory.mb=8192 -D mapreduce.map.memory.mb=8192 -D mapreduce.map.java.opts=-Xmx4096m
3、修改--connect引數
問題:
記憶體溢位,container被kill,執行速度慢
測試過程:
修改m數,加快測試速度;修改split-by引數,避免資料傾斜;修改boundary-query,減少sqoop內部切分機制的時間損耗;
修改query語句,分批匯入資料,主要針對id為零的資料單獨匯入了-500萬個;
修改了下分隔符,主要是因為要與hive表的分隔符一直;做了個輸出合併,較小輸出檔案數量。