暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

大数据 | 利用sqoop将hive和mysql数据互导入

testDemo 2018-11-07
513

最近做的项目中有接触到hadoop、hive、hdfs相关知识。以此做个总结笔记。

一、sqoop 将数据从mysql 导入 hive

导入步骤为:

a.先将mysql数据用sqoop导入到hdfs中,

 1sqoop import 
2--connect jdbc:mysql://xxx:3306/xxx \
3--username xxx \
4--password xxx \
5--query 'select columns from table_name where $CONDITIONS' \
6--target-dir /user/hdfs/imp \
7--delete-target-dir \
8--num-mappers 1 \
9--compress \
10--compression-codec org.apache.hadoop.io.compress.SnappyCodec \
11--fields-terminated-by '\t'

如果导出的数据库是mysql  则可以添加一个 属性  --direct ,数据导出速度会快一点,我在uat环境中测试了此参数,似乎在数据不大的导出时,对速度的影响不太明显。

--direct 使用直接导出模式(优化速度)

若执行成功后,可在hive验证是否导入成功,命令为

1dfs -ls /user/hdfs/imp 

b.在hive中创建一张表

1drop table if exists default.testDemo;
2create table default.testDemo(
3    id string,
4    name string,
5    branch_name string
6)
7ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' ;

c.将hdfs中的数据导入到hive中

1load data inpath '/user/hdfs/imp' into table default.testDemo;

验证是否导入hive成功 :

1select * from default.testDemo;

二、sqoop 将数据从hive导出到 mysql

使用 staging-table(临时表)参数,保证数据完全成功导出到临时表(testDemo_tmp)表中,再把testDemo_tmp 中的数据move到目标表(testDemo)。这种方式的前提是:临时表和目标表表结构必须完全一致。

 1sqoop export \
2--connect jdbc:mysql://xxxx:3306/db_base \
3--username xxx \    
4--password xxx \
5--input-fields-terminated-by "\001" \
6--input-lines-terminated-by "\n" \
7--input-null-string "\\n" \
8--input-null-non-string "\\n" \
9--staging-table testDemo_tmp \
10--clean-staging-table \
11--table testDemo \
12--export-dir hdfs_url_xxx/hive_table_xxx \
13--columns "column,...,columns"

此种方法导出有个弊端,若mysql表有主键约束,就不能反复执行sqoop导出(会因为主键冲突导出失败)。当时我们的优化方案时,在执行sqoop export之前,调一段shell脚本根据导入条件delete一遍。

1#!/bin/bash
2function clearData(){
3    dateStr=`date -d 'yesterday' +%Y%m%d`
4    result=`mysql -h$1 -u$2 -p$3 <<EOF 
5             use $4;
6             delete from testDemo where data_date='${dateStr}';
7       exit
8EOF`
9}





文章转载自testDemo,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论