sqoop简介及详细命令

一、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中
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值