一、sqoop简介
1、产生背景:
没有大数据平台之前,数据存储在传统的关系型数据库,随着数据量的增加,传统的关系型数据库以及无法满足需求,这时候需采用大数据(分布式)存储,这时候面临的一个问题,需要将传统的关系型数据库的数据迁移到大数据平台上(hdfs hive hbase),需要一个数据迁移的工具,然后就出现了sqoop
2、sqoop是什么?
传统的关系型数据库 和大数据平台之间进行数据迁移的工具
3、sqoop进行数据迁移方向
以大数据平台中心,分为迁入和迁出:
迁入 传统的关系型数据库 ---> 大数据平台上 import
迁出 大数据平台 ---> 传统的关系型数据库 针对结果数据 export
注意: 这里的大数据平台指的是hadoop平台(hdfs/hive/hbase)
hadoop:
狭义:hdfs mapreduce yarn ,也就是最初的hdfs-core
广义: hadoop生态
4、sqoop的本质
sqoop进行数据迁出、迁入就是将sqoop的迁入、迁出的命令转换为mapreduce任务
迁入: mysql —> hdfs|hive|hbase
从mysql读取数据 写出到hdfs上
Mapper 读取数据 从数据库读取 InputFormat-->DBInputFormat
map(){
context.write()
}
定义了mapreduce的 文件输入类 只需要maptask就可以完成
迁出:hdfs|hive|hbase —> mysql
从hdfs读取数据 --- 写出mysql中
Mapper端:
从hdfs读取数据
context.write() 写出mysql中 OutputFormat-->DBOutputFormat
定义了 mapreduce的输出类 只需要maptask就可以完成
sqoop的本质相当于定制了mapreduce的输入类和输出类
二、sqoop的相关命令
sqoop help 查看帮助文档
sqoop help 具体命令 查看某一个命令的帮助文档
import 数据导入
export 数据导出
例:sqoop help import
2.1mysql---->大数据平台
2.1.1导入到默认路径下
sqoop import \
--connect jdbc:mysql://mysql所在机器:mysql端口默认是3306/mysql \
--username mysql用户名 \
--password 密码 \
--table help_keyword \
-m 1
--table 指定需要导入到hdfs的mysql中的表名
-m 指定maptask的个数
默认导入的hdfs的路径:/user/hadoop/help_keyword
update user set password=password("密码") where user="用户名";
flush privileges;
2.1.2指定hdfs的路径
sqoop import \
--connect jdbc:mysql://mysql所在机器:mysql端口默认是3306/mysql \
--username mysql用户名 \
--password 密码 \
--table help_keyword \
--target-dir /data/sqoop/mydata/help_keyword \
--fields-terminated-by '\t' \
-m 1
--target-dir 指定需要导入的hdfs目录
--fields-terminated-by 指定导出文件 列之间的分割符 默认的分割符为,
2.1.3指定过滤条件 where 导入hdfs
sqoop import \
--connect jdbc:mysql://mysql所在机器:mysql端口默认是3306/mysql \
--username mysql用户名 \
--password 密码 \
--where "help_keyword_id>200" \
--table help_keyword \
--target-dir /data/sqoop/mydata/help_keyword_where \
-m 1
--where “指定需要过滤的条件”
导入到hdfs的数据 仍然是全部列的数据
2.1.4指定导入hdfs的部分列 --columns
sqoop import \
--connect jdbc:mysql://mysql所在机器:mysql端口默认是3306/mysql \
--username mysql用户名 \
--password 密码 \
--columns "name" \
--where "help_keyword_id>300" \
--table help_keyword \
--target-dir /data/sqoop/mydata/help_keyword_where_columns \
-m 1
--columns "需要导入的列(多列之间,隔开)"
相当于 select name from help_keyword where help_keyword_id>200;
2.1.5指定一个sql查询的结果 导入到hdfs上
sqoop import \
--connect jdbc:mysql://mysql所在机器:mysql端口默认是3306/mysql \
--username mysql用户名 \
--password 密码 \
--target-dir /data/sqoop/mydata/help_keyword_query \
--query 'select * from mysql.help_keyword where help_keyword_id > 200 and $CONDITIONS' \
--split-by help_keyword_id \
--fields-terminated-by '\t' \
-m 4
-m 指定maptask的个数 个数>1
--split-by 指定每一个maptask切分数据的依据字段 mysql中主键,整型的
多个maptask之间就会按照指定的字段切分数据
切分的原则是按照指定的切分字段 (最大值-最小值+1) /4
例如:
1 1 1 1 1 2 2 3 4 4 4 4 4
4-1+1 /4 =1
每一个maptask 1个值
maptask0 1 1 1 1 1
maptask1 2 2
maptask3 3
maptask4 4 4 4 4 4
id 201 -- 452 452-201+1 /4=63
201-263
264-326
327-389
390-452
1 1 1 4 4 4 6 6 6 6 9 9 9
2maptask 9-1+1/2 =5
maptask0 1-5
maptask1 5-9
--query “sql查询语句”
注意:这个 --query不能和 --where --columns 一起用的
正常的sql执行的时候报错
Query [select * from mysql.help_keyword where help_keyword_id > 200] must contain '$CONDITIONS' in WHERE clause.
sqoop的语法要求,要求sql查询语句中的where过滤条件中 必须包含$CONDITIONS
$CONDITIONS 没有实际意义,纯属语法要求
2.1.6mysql—>hive
sqoop import \
--connect jdbc:mysql://mysql所在机器:mysql端口默认是3306/mysql \
--username mysql用户名 \
--password 密码 \
--table help_keyword \
--hive-import \
-m 1
--table 指定的是mysql中的 表
--hive-import 导入到hive中的
默认 数据库 default 的数据库
默认的表名 同mysql中的表名
报错:
FileAlreadyExistsException: Output directory hdfs://bd1901/user/hadoop/help_keyword already exists
说明mysql--hive的时候 :
1)首先会将数据导入到hdfs的默认路径下
2)再在hive中建表
3)将hdfs的数据加载到hive表,原来的hdfs的数据移动到hive的默认表目录下
指定数据库和表名
sqoop import \
--connect jdbc:mysql://mysql所在机器:mysql端口默认是3306/mysql \
--username mysql用户名 \
--password 密码 \
--table help_keyword \
--fields-terminated-by "\t" \
--lines-terminated-by "\n" \
--hive-import \
--hive-overwrite \
--create-hive-table \
--delete-target-dir \
--hive-database weibo \
--hive-table new_help_keyword
--create-hive-table 创建hive表的
--hive-database 指定hive的数据库的
--hive-table 指定hive中的表名的
注意:在mysql–hive的过程中 会创建hive中的表 但是不会创建hive中的数据库的 数据库需要已经存在(没有 hive中自己手动创建)
2.1.7增量数据导入的问题
2.1.7.1概念介绍
增量数据导入:
每次导入到大数据平台的数据,只是新增数据
全量数据导入:
每次导入到大数据平台,将所有数据全部导入
sqoop help import
Incremental import arguments:
--check-column <column> Source column to check for incremental change
指定用于标识增量的键 用于检验 一般指定主键
help_keyword_id
--incremental <import-type> Define an incremental import of type 'append' or 'lastmodified'
增量导入的方式 id
append 追加 *****
lastmodified 最后一次修改的时间
--last-value <value> Last imported value in the incremental check column
指定上一次的最后最后一个增量的建的值 500
这次导入则是从这个值的下一个值开始导入
sqoop import \
--connect jdbc:mysql://mysql所在机器:mysql端口默认是3306/mysql \
--username mysql用户名 \
--password 密码 \
--table help_keyword \
--target-dir /data/sqoop/mydata/help_increment \
--incremental append \
--check-column help_keyword_id \
--last-value 200 \
-m 1
2.2大数据平台---->mysql 数据导出export
2.3.1大数据平台结果数据—>mysql中
①hdfs-mysql
sqoop import \
--connect jdbc:mysql://mysql所在机器:mysql端口默认是3306/mysql \
--username mysql用户名 \
--password 密码 \
--table sqoopfur \
--export-dir /data/sqoop/mydata/help_keyword \
--fields-terminated-by '\t'
--table 指定mysql中的表 存储hdfs导出数据的表名
--export-dir 指定hdfs需要导出的路径的
--fields-terminated-by 指定hdfs文件 列之间的分割符的
注意: 导出数据的时候mysql中的库和表都不会进行创建,需要手动创建
②hive–mysql
sqoop import \
--connect jdbc:mysql://mysql所在机器:mysql端口默认是3306/mysql \
--username mysql用户名 \
--password 密码 \
--table uv_info \
--export-dir /user/myhive/warehouse/weibo.db/new_help_keyword \
--input-fields-terminated-by '\t'
--export-dir 指定hive的表数据存储的hdfs的目录
--input-fields-terminated-by 指定hive的表文件的分割符
③hbase—mysql 中
不支持
没有一种直接的方式可以将hbase的数据直接导出到mysql中