传统关系型数据库到大数据库平台之间的数据迁移的工具
传统关系型数据库:mysql oracle
大数据平台:hdfs hive hbase
mysql | oracle ---->hdfs|hive|hbase
hdfs|hive|hbase---->mysql | oracle
翻译器:将sqoop命令翻译成mr任务执行
数据迁入:mysql—>hdfs
从mysql读取任务,再将数据写出到hdfs
重新定义了FileInuputFormat–DBInputFormat,定制化输入inputformat
数据迁出:hdfs—>mysql
mr任务,从hdfs读取,将数据写出mysql
重新定义输出FileOutputFormat–DBOutputFormat,定制化outputFormat
注意:sqoop只有maptask任务,没有reducetask任务
mysql hadoop hive hbase jdk zookeeper 均正常
能够访问 hive|hdfs|hbase的客户端的节点
sqoop1 sqoop1.4.6
vi编辑器打开sqoop.sh文件
sudo vi /etc/profile.d/sqoop.sh添加环境变量
export SQOOP_HOME=/home/hadoop/apps/sqoop-1.4.6.bin__hadoop-2.0.4-alpha export PATH=PATH:SQOOP_HOME/bin重新加载sqoop.sh文件
source /etc/profile.d/sqoop.sh检查是否安装成功
sqoop version测试sqoop:显示mysql下所有的数据库
sqoop list-databases \ --connect jdbc:mysql://hadoop03:3306/ \ --username root \ --password 123456mysql:help_keyword
导入默认的hdfs的路径:/user/hadoop/help_keyword/part-m-00000 默认字段之间的分隔符: ,
–target-dir 指定hdfs的目标路径 –fields-terminated-by 指定字段之间的分隔符
sqoop import \ --connect jdbc:mysql://hadoop03:3306/mysql \ --username root \ --password 123456 \ --table help_keyword \ --target-dir /user/sqoop/data/my_help_keyword1 \ --fields-terminated-by '\t' \ -m 2–columns 字段 指定mysql表字段
sqoop import \ --connect jdbc:mysql://hadoop03:3306/mysql \ --username root \ --password 123456 \ --columns "name" \ --table help_keyword \ --target-dir /user/sqoop/data/my_help_keyword2 \ -m 1–where “” 指定mysql的过滤条件
sqoop import \ --connect jdbc:mysql://hadoop03:3306/mysql \ --username root \ --password 123456 \ --columns "name" \ --where "help_keyword_id>150" \ --table help_keyword \ --target-dir /user/sqoop/data/my_help_keyword3 \ -m 1where…等价于
select name from help_keyword where help_keyword_id>150;–query “sql” 指定sql查询语句 –split-by 指定maptask进行切分的字段 指定逻辑切片切分标准 尽量指定主键
sqoop import \ --connect jdbc:mysql://hadoop03:3306/mysql \ --username root \ --password 123456 \ --target-dir /user/sqoop/data/my_help_keyword4 \ --query 'select help_keyword_id,name from help_keyword where help_keyword_id>200 and $CONDITIONS' \ --split-by help_keyword_id \ --fields-terminated-by '\t' \ -m 41)–query 和 --columns|–where 不可以一起使用的,因为query后面指定sql查询语句,where和columns的作用可以直接在sql语句中实现
2)maptask如何按照 split-by字段切分的? 按照数据的范围区间平均分,例如指定的maptask的个数是4,split-by的字段是id,那么就会按照最大id和最小id之间的范围,将区间分为四个,如果split-by的字段是连续递增的就不会出现数据倾斜,如果不是连续递增的,有可能会出现map端的数据倾斜。
3)sqoop语法要求 sql查询中必须包含$CONDITIONS 在where子句中,如果没有,会报错:
Query [select help_keyword_id,name from help_keyword where help_keyword_id>200] must contain '$CONDITIONS' in WHERE clause.4)query后面的sql查询语句放在’ '中
1)先将数据导入hdfs的默认路径下/user/hadoop/help_keyword 2)hive中建表 3)将hdfs数据加载到hive的表中 默认导入hive的数据库:default 默认导入的hive表名:和mysql中的表名一致 help_keyword
注意:要确认默认的导出路径不存在,否则会报错
sqoop import \ --connect jdbc:mysql://hadoop03:3306/mysql \ --username root \ --password 123456 \ --table help_keyword \ --hive-import \ -m 1在hive中自动创建表 不会创建数据库的 数据库手动创建 create database mydb_test;
手动创建hbase的表 create “test_sqoop”,“info”
sqoop import \ --connect jdbc:mysql://hadoop03:3306/mysql \ --username root \ --password 123456 \ --table help_keyword \ --hbase-table test_sqoop \ --column-family info \ --hbase-row-key help_keyword_id全量数据导入|增量数据导入 全量数据导入:每次导入一个表的全部的数据 增量数据导入: 每次只导入新增的数据 Incremental import arguments:
–check-column 指定增量的参考字段 一般字段取主键–incremental 指定增量导入的类型 ‘append’ 追加–last-value 指定参考字段的上次的最后一个值增量导入: 指定字段的上一次最后一个值的下一个开始导入
sqoop import \ --connect jdbc:mysql://hadoop03:3306/mysql \ --username root \ --password 123456 \ --table help_keyword \ --target-dir /user/sqoop/data/my_help_keyword5 \ --incremental append \ --check-column help_keyword_id \ --last-value 300 \ -m 1类似于sql:
select * from help_keyword where help_keyword_id>300;–export-dir 指定hdfs的文件的路径 –fields-terminated-by hdfs文件的字段之间的分隔符
注意: mysql的库和表 都需要 手动手动创建
create database test_sqoop; use test_sqoop; CREATE TABLE sqoopstudent ( id INT NOT NULL PRIMARY KEY, name VARCHAR(20), sex VARCHAR(20), age INT, department VARCHAR(20) );–export-dir 指定hive的表在hdfs的存储路径 –input-fields-terminated-by 指定hive的hdfs的文件的字段分割符
sqoop export \ --connect jdbc:mysql://hadoop03:3306/test_sqoop \ --username root \ --password 123456 \ --table uv_info \ --export-dir /user/hive/warehouse/mydb_test.db/new_help_keyword \ --input-fields-terminated-by '\t'手动建表:
CREATE TABLE uv_info ( id INT NOT NULL PRIMARY KEY, name VARCHAR(200) );没有一种直接的方式 可以将hbase的数据直接导出mysql中,不支持
间接方式: hbase----hive----mysql
