当前位置:   article > 正文

sqoop简介及详细命令_sqoop命令 csdn

sqoop命令 csdn

一、sqoop简介

1、产生背景:

没有大数据平台之前,数据存储在传统的关系型数据库,随着数据量的增加,传统的关系型数据库以及无法满足需求,这时候需采用大数据(分布式)存储,这时候面临的一个问题,需要将传统的关系型数据库的数据迁移到大数据平台上(hdfs hive hbase),需要一个数据迁移的工具,然后就出现了sqoop

2、sqoop是什么?

传统的关系型数据库 和大数据平台之间进行数据迁移的工具
  • 1

3、sqoop进行数据迁移方向

以大数据平台中心,分为迁入和迁出:
迁入  传统的关系型数据库 ---> 大数据平台上  import
迁出  大数据平台 ---> 传统的关系型数据库 针对结果数据  export
  • 1
  • 2
  • 3

注意: 这里的大数据平台指的是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就可以完成
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

迁出:hdfs|hive|hbase —> mysql

	从hdfs读取数据 --- 写出mysql中
	Mapper端:
		从hdfs读取数据 
		context.write()  写出mysql中  OutputFormat-->DBOutputFormat
	定义了 mapreduce的输出类  只需要maptask就可以完成
  • 1
  • 2
  • 3
  • 4
  • 5

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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

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  指定导出文件  列之间的分割符  默认的分割符为,
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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的数据  仍然是全部列的数据
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

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查询语句”
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

注意:这个 --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 没有实际意义,纯属语法要求
  • 1
  • 2
  • 3
  • 4
  • 5

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中的表名的
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

注意:在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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

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文件 列之间的分割符的
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

注意: 导出数据的时候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的表文件的分割符
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
③hbase—mysql 中
不支持
没有一种直接的方式可以将hbase的数据直接导出到mysql中
  • 1
  • 2
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/693462
推荐阅读
相关标签
  

闽ICP备14008679号