MySQL導入Hive - DataX方案

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的形式只有appendnonConflict,不支持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

# 後處理
# ... 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章