MySQL導入Hive可以用sqoop或者dump到本地再load into的方式導入Hive。
還有一種方式就是用阿里開源的DataX,試了一下還挺方便的。用sqoop經常會出現數據傾斜的情況,DataX暫時還沒有遇見。
要使用DataX只需要填寫一個json格式的配置文件即可,整個安裝和使用的方法參照官方給出的Quick Start即可。
配置文件中,主要填寫mysqlreader與hdfswriter的信息。雖然是MySQL導入Hive表,但因爲Hive的數據實際上是存在HDFS中,因此沒有單獨的hivewriter,用hdfswriter即可。相關參數的文檔見:https://github.com/alibaba/DataX/blob/master/hdfswriter/doc/hdfswriter.md
但是每個任務都去填JSON文件也比較繁瑣,比如jdbcUrl的配置,MySQL的username和password等,當然希望以參數的形式填寫,這樣以後要換隻要改配置文件就好。還有DataX導入HDFS的形式只有append
與nonConflict
,不支持insert overwrite
這種形式,重跑數據還要手動去truncate就太麻煩了。所以爲了方便做一些前後處理以及傳入參數,還是使用shell來封裝一系列的命令,中間再使用python來動態生成json配置文件更好。
python的代碼大概如下
import json
import argparse
# JSON模板
template_json = {...}
# 接收參數傳入
parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument('--output_json_path', type=str, default='/data/datadev/tmp/mysql2hive.json',help='生成的DataX JSON配置文件存放路徑')
parser.add_argument('--mysql_jdbc_url', type=str, default=None, help='MYSQL JDBC URL,若有多個用","隔開')
# 省略若干參數
...
args = parser.parse_args()
# 填入參數
template_json['job']['content'][0]['reader']['parameter']['column'] = args.mysql_jdbc_url # 爲了健壯性可以再對參數做一些檢查
# 輸出JSON配置文件
with open(args.output_json_path,'w') as f:
f.write(json.dumps(template_json))
shell腳本的寫法就可以寫得像用sqoop一樣了
source ../mysql_config
hive_table=table_name
hive_db=db_name
python mysql_hive.py \
--mysql_columns field_1,field_2,field_3 \
--mysql_jdbc_url jdbc:mysql://${mysql_host}:${mysql_port}/${mysql_db} \
--mysql_tables ${mysql_table} \
--mysql_username ${mysql_user} \
--mysql_password ${mysql_pw} \
--hive_columns field_1:bigint,field_2:string,field_3:int \
--path /path/to/your/warehouse/${hive_db}.db/${hive_table} \
--fileName ${hive_table} \
--output_json_path /path/to/your/output_json \
# 如果需要事先清空HIVE表
hive -e "truncate ${hive_db}.${hive_table}"
# 執行導入
python ${YOUR_DATAX_HOME}/bin/datax.py /path/to/your/output_json
# 後處理
# ...