赞
踩
没有大数据平台之前,数据存储在传统的关系型数据库,随着数据量的增加,传统的关系型数据库以及无法满足需求,这时候需采用大数据(分布式)存储,这时候面临的一个问题,需要将传统的关系型数据库的数据迁移到大数据平台上(hdfs hive hbase),需要一个数据迁移的工具,然后就出现了sqoop
传统的关系型数据库 和大数据平台之间进行数据迁移的工具
以大数据平台中心,分为迁入和迁出:
迁入 传统的关系型数据库 ---> 大数据平台上 import
迁出 大数据平台 ---> 传统的关系型数据库 针对结果数据 export
注意: 这里的大数据平台指的是hadoop平台(hdfs/hive/hbase)
hadoop:
狭义:hdfs mapreduce yarn ,也就是最初的hdfs-core
广义: hadoop生态
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 help 查看帮助文档
sqoop help 具体命令 查看某一个命令的帮助文档
import 数据导入
export 数据导出
例:sqoop help import
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;
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 指定导出文件 列之间的分割符 默认的分割符为,
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的数据 仍然是全部列的数据
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;
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 没有实际意义,纯属语法要求
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中自己手动创建)
增量数据导入:
每次导入到大数据平台的数据,只是新增数据
全量数据导入:
每次导入到大数据平台,将所有数据全部导入
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
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中的库和表都不会进行创建,需要手动创建
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中
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。