Sqoop
1)Sqoop介绍
Sqoop即 SQL to Hadoop ,是一款方便的在传统型数据库与Hadoop之间进行数据迁移的工具,充分利用MapReduce并行特点以批处理的方式加快数据传输,发展至今主要演化了二大版本,Sqoop1和Sqoop2,我们以Sqoop1为案例进行讲解,Sqoop2商用不太稳定。Sqoop工具是Hadoop下连接关系型数据库和Hadoop的桥梁,支持关系型数据库和hive、hdfs,hbase之间数据的相互导入,可以使用全表导入和增量导入。
2)sqoop安装---安装很简单-->主要是给个jdbc的jar包。然后将bin目录下的hive_home和zookeeper_home注释掉,当然也得配置环境变量
①解压tar包
②配置环境变量
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HIVE_HOME/lib/*:$HIVE_HOME/conf
export SQOOP_HOME=/opt/sqoop
③把MySQL的JDBC驱动包复制到Sqoop的lib目录下
④给jdk环境下的/opt/jdk/jre/lib/security/java.policy 文件中加入
permission javax.management.MBeanTrustPermission "register";
⑤使用sqoop list-databases --connect jdbc:mysql://127.0.0.1:3306/ --username root --password root 测试是否安装成功
3)sqoop导入导出(hdfs)
A、导入
a、普通导入
sqoop import --connect jdbc:mysql://192.168.1.101:3306/库名 --username 数据库用户名 --password 密码 --table 表名 --columns '列1, 列2...'
b、指定输出路径、指定数据分隔符
sqoop import --connect jdbc:mysql://192.168.1.101:3306/库名 --username 数据库用户名 --password 密码 --table 表名 --target-dir '目标路径' --fields-terminated-by '\001'
c、指定Map数量 -m
sqoop import --connect jdbc:mysql://192.168.1.101:3306/库名 --username 数据库用户名 --password 密码 --table 表名 --target-dir '目标路径' --fields-terminated-by '\t' -m 2
d、增加where条件
sqoop import --connect jdbc:mysql://192.168.1.101:3306/库名 --username 数据库用户名 --password 密码 --table 表名 --where '条件' --target-dir '目标路径'
e、使用query语句
sqoop import --connect jdbc:mysql://192.168.1.101:3306/库名 --username 数据库用户名 --password 密码 --table 表名 --query 'SELECT语句' --split-by user.age --target-dir '目标路径'
使用query语句必须指定split-by和--target-dir
f、使用 \将语句换行
sqoop import \
--connect jdbc:mysql://192.168.1.101:3306/库名 \
--username 数据库用户名 \
--password 密码 \
--query 'SELECT语句' \
--split-by user.age \
--target-dir '目标路径'
g、增量导入
◇根据id
sqoop import --connect jdbc:mysql://192.168.1.101:3306/库名 --username 数据库用户名 --password 密码 --table 表名 --target-dir '目标路径' --incremental append --check-column id --last-value 10 -m 1
--incremental append选项使用append模式,
--check-column id 使用id字段来做增量
--last-value为10,从MySQL表中主键id>10开始同步。
◇根据时间戳
--incremental lastmodified --check-column last_update --last-value '2017-03-20 11:00:00'
B、导出
先建好相对应的表,才能导出
sqoop export --connect jdbc:mysql://192.168.1.101:3306/库名 --username 数据库用户名 --password 密码 --export-dir '要导出的数据所在的路径' --table 表名 -m 1 --fields-terminated-by '\t'
4)sqoop导入导出(hive)
A、导入
a、普通导入
sqoop import --connect jdbc:mysql://192.168.1.101:3306/库名 --username 数据库用户名 --password 密码 --table 表名 --hive-import
内部执行实际分三部,1.将数据导入hdfs(可在hdfs上找到相应目录),2.创建hive表名相同的表,3,将hdfs上数据导入hive表中
b、创建hive表
sqoop create-hive-table --connect jdbc:mysql://192.168.1.101:3306/库名 --username 数据库用户名 --password 密码 --table 表名 --hive-table hive表名 --fields-terminated-by "\t"
c、指定hive表名、指定数据分隔符
sqoop import --connect jdbc:mysql://192.168.1.101:3306/库名 --username 数据库用户名 --password 密码 --table 表名 --hive-import --hive-table hive表名 --fields-terminated-by '\t'
d、通过create-hive-table创建表
sqoop import --connect jdbc:mysql://192.168.1.101:3306/库名 --username 数据库用户名 --password 密码 --table 表名 --hive-import --create-hive-table --hive-table hive表名 --fields-terminated-by '\t'
可以通过 --create-hive-table 创建表,如果表已经存在则会执行失败
如果提示目录已存在,可以在导入脚本后面追加:--delete-target-dir
f、覆盖hive表的内容
sqoop import --connect jdbc:mysql://192.168.1.101:3306/库名 --username 数据库用户名 --password 密码 --table 表名 --hive-import --hive-overwrite --hive-table hive表名 --fields-terminated-by '\t'
g、增加where条件
sqoop import --connect jdbc:mysql://192.168.1.101:3306/库名 --username 数据库用户名 --password 密码 --table 表名 --where '条件' --hive-import --hive-table hive表名 --fields-terminated-by '\t'
h、指定编码格式
sqoop import --connect jdbc:mysql://192.168.1.101:3306/库名 --username 数据库用户名 --password 密码 --table 表名 --where '条件' --hive-import --hive-table hive表名 --fields-terminated-by '\t' --default-character-set=utf-8
i、使用query语句
sqoop import --connect jdbc:mysql://localhost:3306/库名 --username 数据库用户名 --password 密码 --query 'select语句' --hive-import --hive-table hive表名 --fields-terminated-by '\t' --target-dir '目标路径' --split-by user.age
使用query语句必须指定split-by和--target-dir
j、增量导入
◇根据id
sqoop import --connect jdbc:mysql://192.168.1.101:3306/库名 --username 数据库用户名 --password 密码 --table 表名 --hive-import --hive-table hive表名 --incremental append --check-column id --last-value 11 --fields-terminated-by '\t'
◇根据时间戳
通过时间戳来增量导入的脚本:
--incremental lastmodified --check-column last_update --last-value '2017-03-20 11:00:00'
完整脚本:
sqoop import --connect jdbc:mysql://192.168.1.101:3306/库名 --username 数据库用户名 --password 密码 --table 表名 --hive-import --hive-table hive表名 --incremental lastmodified --check-column last_update --last-value '2017-03-20 11:00:00' --fields-terminated-by '\t'
B、导出
sqoop export --connect jdbc:mysql://localhost:3306/库名 --username 数据库用户名 --password 密码 --export-dir '要导出的数据的路径' --table 表名 -m 1 --fields-terminated-by '\t'