1. 程式人生 > >sqoop從mysql匯入超大表(3億資料)出錯記錄

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表的分隔符一直;做了個輸出合併,較小輸出檔案數量。