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

# 后处理
# ... 

你可能感兴趣的:(Data)