前提條件:
數據庫容量上億級別,索引只有id,沒有創建時間索引
達到目標:
- 把阿里雲RDS Mysql表數據同步到hive中,按照mysql表數據的創建時間日期格式分區,每天一個分區方便查詢
- 每天運行crontab定時的增量備份數據,還是依據自增的id
遇到的問題:
- 沒法建立創建時間的索引,不能按時間范圍去查詢,那樣會嚴重影響線上數據庫的性能?
只能按照id的方式去增量的讀取索引,存儲到臨時表,然后在轉儲到正式表,動態的寫入時間分區 - 使用sqoop直接導入hive?還是把數據導入到hdfs以內建表的形式把數據寫入到指定的臨時表?
如果直接使用sqoop hive import 不支持,query 語句,沒法自定義抽取字段,沒辦法按照id范圍去鎖定部分數據,
使用hive import只能全量同步表而且id條件只能配到各個地方,我個人感覺query比較適合我靈活一些所以就使用
sqoop導入hdfs內建表的方式來同步數據
- 讀取和寫入一次要分配,不能一次讀取太多,影響線上數據庫的性能,線上數據庫用的阿里雲RDS?
1. 首先查詢mysql max(id),和 hive max(id),計算差值后分批去加載,查詢hive max 沒有直接連接hive,而是使用了一個迂回策略,
使用python調用系統命令行執行hive -e 查詢最大值,並寫入到本地文件系統,然后查詢本地文件系統最大值
2.我這里是按每次300萬一次,單次差值小於300萬執行一次加載
3.用sqoop分4個map任務去執行,300萬數據大概需要1-2分鍾左右讀取到本地
4. mysql中需要5秒左右查詢min,max,id 確定本次數據分割的id范圍,
5.單個map任務大概需要15秒左右來讀取和發送數據到sqoop,sqoop到hdfs內建表很快不會有壓力這里就不寫了 - hive表初次創建同步的時候需要從臨時表重建動態分區到正式表,數據跨度太大,一天天重建太耗時間?
步驟一:數據剛開始同步的時候先不開啟轉正式表並動態分區,先把全量的數據同步到hive的臨時表中,同步完成后,把全量的臨時表轉到正式表,動態寫入分區數據
步驟二:數據已經全量同步進來了,此時創建crontab任務,定時調用同步腳本,把增量的數據插入到臨時表,然后把指定時間的數據轉入正式分區,此步驟會把當前id最新的數據同步過來,范圍是從上次同步的id到今天最大的id,日期有昨天有今天,這邊正式表篩選出昨天的全部數據就行