sqoop学习笔记

一、概述
Sqoop是一款开源的数据导入导出工具,可以将传统的关系型数据库导出至HDFS,也可以将HDFS中的数据导出至关
系型数据库。
官网: http://sqoop.apache.org/
原理:在Hadoop生态体系中,计算基本依赖于MR,那么Sqoop也是如此,Sqoop就是将Sqoop语句翻译成MR程
序,来实现一个数据导入和导出的操作。那就不难理解到Sqoop就是一个对于InpuFormat和OutputFormat进行特
殊定制的MR程序。
二、Sqoop安装

2.1 下载

官方下载地址:http://www.apache.org/dyn/closer.lua/sqoop/1.4.7

2.2 解压

上传至Linux 服务器,解压在相关位置即可。

2.3 修改配置文件

将conf目录下的sqoop-env.template.sh改名
mv sqoop-env-template.sh sqoop-env.sh
vi sqoop-env.sh
#Set path to where bin/hadoop is available
export HADOOP_COMMON_HOME=/home/hadoop/hadoop-2.8.4
#Set path to where hadoop-*-core.jar is available
export HADOOP_MAPRED_HOME=/home/hadoop/hadoop-2.8.4
#set the path to where bin/hbase is available

2.4 拷贝JDBC驱动

将Mysql或者其他使用到的数据的JDBC驱动拷贝到Sqoop根目录下lib目录。

3.5 验证启动

三、使用

3.1 导出数据

导入数据使用export关键字,指的就是从大数据集群导入至传统的关系型数据库

3.1.1 HDFS 到RDBMS

#export HBASE_HOME=/home/hadoop/hadoop-2.8.4
#Set the path to where bin/hive is available
export HIVE_HOME=/home/hive/hive-1.2.2
#Set the path for where zookeper config dir is
#export ZOOCFGDIR=
sqoop-version
预期的输出:
15/12/17 14:52:32 INFO sqoop.Sqoop: Running Sqoop version: 1.4.6
Sqoop 1.4.6 git commit id 5b34accaca7de251fc91161733f906af2eddbe83
Compiled by abe on Fri Aug 1 11:19:26 PDT 2015
./sqoop-list-databases --connect jdbc:mysql://192.168.134.1:3306 --username root –
password yhm1211.
预期输出:
18/10/23 17:09:44 INFO sqoop.Sqoop: Running Sqoop version: 1.4.7
18/10/23 17:09:44 WARN tool.BaseSqoopTool: Setting your password on the command-line is
insecure. Consider using -P instead.
18/10/23 17:09:45 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.
information_schema
hive
mysql
performance_schema
shortvideo
test
这里以 MySQL 为例
准备数据
准备数据需要在Mysql中建立新表
数据导出
这里数据是使用MR进行清洗后得到的数据

3.2 导入数据

导入数据使用import关键字,指的就是从传统的关系型数据库导入至大数据集群

3.2.1 RDBMS 到 HDFS

准备数据
数据库中还是上述文档中创建的logs。将logs中的数据导入至HDFS
导入数据
DROP TABLE IF EXISTS logs;
CREATE TABLE logs (
uuid varchar(255) NOT NULL,
userid varchar(255) DEFAULT NULL,
fromUrl varchar(255) DEFAULT NULL,
dateString varchar(255) DEFAULT NULL,
timeString varchar(255) DEFAULT NULL,
ipAddress varchar(255) DEFAULT NULL,
browserName varchar(255) DEFAULT NULL,
pcSystemNameOrmobileBrandName varchar(255) DEFAULT NULL,
systemVersion varchar(255) DEFAULT NULL,
language varchar(255) DEFAULT NULL,
cityName varchar(255) DEFAULT NULL,
PRIMARY KEY (uuid)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
sqoop export
–connect jdbc:mysql://192.168.134.1:3306/sqoop_test
–username root
–password yhm1211.
–table logs
–export-dir /clean01
–input-fields-terminated-by ’ ’
–m 1
(1)全部导入
(2)条件导入
通过手动指定查询条件导入数据 ,在查询语句中必须包含$CONDITIONS关键字
(3)导入指令列
其实和手动输入查询条件时一样的效果 注意: 多列之间使用逗号进行分割
sqoop import
–connect jdbc:mysql://192.168.134.1:3306/sqoop_test
–username root
–password yhm1211.
–table logs
–target-dir /sqoop_test/clean05
–num-mappers 1
–fields-terminated-by " "
–columns userid,cityName

3.2.2 RDBMS 到 Hive

准备数据
还是上述建表语句
导入数据
sqoop import
–connect jdbc:mysql://192.168.134.1:3306/sqoop_test
–username root
–password yhm1211.
–table logs
–target-dir /sqoop_test/clean01
–num-mappers 1
–fields-terminated-by " "
sqoop import
–connect jdbc:mysql://192.168.134.1:3306/sqoop_test
–username root
–password yhm1211.
–target-dir /sqoop_test/clean03
–delete-target-dir
–num-mappers 1
–fields-terminated-by " "
–query ‘select * from logs where $CONDITIONS limit 1,5’
sqoop import
–connect jdbc:mysql://192.168.134.1:3306/sqoop_test
–username root
–password yhm1211.
–table logs
–num-mappers 1
–hive-import
–fields-terminated-by " "
–hive-overwrite
–hive-database default
–hive-table logs
–delete-target-dir
填坑三部曲
解决办法: cp /home/hive/apache-hive-1.2.1-bin/lib/hive-common-1.2.1.jar /home/sqoop/sqoop-
1.4.7.bin__hadoop-2.6.0/lib/
解决办法: cp /home/hive/apache-hive-1.2.1-bin/lib/hive-exec-1.2.1.jar /home/sqoop/sqoop-
1.4.7.bin__hadoop-2.6.0/lib/
这里可以看出当前使用hive中logs是带有分区的,但是在导入的时候没有去指定具体是哪个分区,所以问题就在这里。
从 sqoop import --help 给出帮助指令可以看到sqoop也提供了相关的解决方案,那只需要在上述语句中加入
相关字段即可:–hive-partition-key day|–hive-partition-value 19-06-20
sqoop import
–connect jdbc:mysql://192.168.134.1:3306/sqoop_test
–username root
–password yhm1211.
–table logs
–num-mappers 1
–hive-import
–fields-terminated-by " "
–hive-overwrite
–hive-database default
–hive-table logs
–delete-target-dir
–hive-partition-key day
–hive-partition-value 19-06-20
3.2.3 RDBMS 到 HBase
sqoop import
–connect jdbc:mysql://192.168.134.1:3306/sqoop_test
–username root
–password yhm1211.
–table logs
–columns “uuid,userid,fromurl”
–column-family “log_basic”
–hbase-create-table
–hbase-row-key “uuid”
–hbase-table “logs”
–num-mappers 1
–split-by uuid
很幸运,使用Sqoop1.4.7中可以在HBase1.2.4中自动建立相关表
四、常见参数详解
https://blog.csdn.net/myrainblues/article/details/43673129
https://blog.csdn.net/wtzhm/article/details/81810159
4.1 顶级命令列举
来源 sqoop-help
命令 说明
codegen 数据生成Java并打包
createhive-table 获取数据库中某张表
eval 查看 SQL 执行结果
export 将集群数据导出
help 打印 sqoop 帮助信息
import 将数据导入到集群
import-alltables 导入某个数据库下所有表到 HDFS 中
importmainframe
将数据集从大型机服务器导入到HDFS
job 用来生成一个 sqoop的任务,生成后,该任务并不执行,除非使用命令执行该任务。
listdatabases 列出所有数据库名
list-tables 列出某个数据库下所有表
merge 将 HDFS 中不同目录下面的数据合在一起,并存放在指定的目录中
metastore
记录 sqoop job 的元数据信息,如果不启动 metastore 实例,则默认的元数据存储目录为:
~/.sqoop,如果要更改存储目录,可以 在 配 置 文 件sqoop-site.xml中进行更改。
version 打印 sqoop 版本信息
4.2 顶级命令详解
export是导出至RDBMS
4.2.1 共用参数:数据库
序号 参数 说明
1 --connect 连接关系型数据库的 URL
2 --connection-manager 指定要使用的连接管理类
3 --driver Hadoop 根目录
4 --help 打印帮助信息
5 --password 连接数据库的密码
6 --username 连接数据库的用户名
7 --verbose 在控制台打印出详细信息


参数 说明
1 --enclosed-by 给字段值前加上指定的字符
2 --escaped-by 对字段中的双引号加转义符
3
–fieldsterminated-by
设定每个字段是以什么符号作为结束,默认为逗号
4
–linesterminated-by
设定每行记录之间的分隔符,默认是\n
5
–mysqldelimiters
Mysql 默认的分隔符设置,字段之间以逗号分隔,行之间以\n 分隔,默认转义符
是\,字段值以单引号包裹
6
–optionallyenclosed-by
给带有双引号或单引号的字段值前后加上指定字符
序号 参数 说明
1 --input-enclosed-by 对字段值前后加上指定字符
2 --input-escaped-by 对含有转移符的字段做转义处理
3 --input-fields-terminated-by 字段之间的分隔符
4 --input-lines-terminated-by 行之间的分隔符
5 --input-optionally-enclosed-by 给带有双引号或单引号的字段前后加上指定字符
4.2.2 共用参数:import
4.2.3 共用参数:export
序号 参数 说明
1 --hive-delims-replacement 用自定义的字符串替换掉数据中的\r\n和\013 \010等字符
2 --hive-drop-import-delims 在导入数据到 hive 时,去掉数据中的\r\n\013\010 这样的字符
3 --map-column-hive 生成 hive 表时,可以更改生成字段的数据类型
4 --hive-partition-key 创建分区,后面直接跟分区名,分区字段的默认类型为string
5 --hive-partition-value 导入数据时,指定某个分区的值
6
–hive-home hive 的安装目录,可以通过该参数覆盖之前默认配置的目录
7 --hive-import 将数据从关系数据库中导入到 hive 表中
8 --hive-overwrite 覆盖掉在 hive 表中已经存在的数据
9 --create-hive-table 默认是 false,即,如果目标表已经存在了,那么创建任务失败
10 --hive-table 后面接要创建的 hive 表,默认使用 MySQL 的表名
11 --table
4.2.4 共用参数:hive
4.3 次级参数详解
次级参数值得就是使用导出或者导入时使用的相关参数,均可使用–help来获得
4.3.1 import
import导入命令在上述文档中已经提到过,在这里就不再列举基本的操作,而是对数据进行增量操作
增量导入
首先是增量导入数据至Hive,但是指的注意的是现在不能指定hive相关的参数,说白了就是使用导入HDFS的方
式导入hive,在此基础上加上增量导入相关参数
准备数据
开始导入
sqoop import
–connect jdbc:mysql://192.168.134.1:3306/sqoop_test
–username root
–password yhm1211.
–table user01
–hive-import
sqoop import
–connect jdbc:mysql://192.168.134.1:3306/sqoop_test
–username root
–password yhm1211.
–table logs
–target-dir /user/hive/warehouse/logs/day=19-06-20
–num-mappers 1
–fields-terminated-by " "
–incremental append
–check-column uuid
-m 1
sqoop import
–connect jdbc:mysql://192.168.134.1:3306/sqoop_test
–username root
–password yhm1211.
–table logs
–target-dir /user/hive/warehouse/logs/day=19-06-20
–num-mappers 1
–fields-terminated-by " "
–append
-m 1

增量数据的同步:

Sqoop也提供了一种比较方面的方式,那就是直接创建一个Sqoop job,通过job来管理特定的同步任务。就像我们前面提到的增量同步问题,通过创建sqoop job可以保存上一次同步时记录的–last-value的值,也就不用再费劲去解析获取了,每次想要同步,这个job会自动从job保存的数据中获取到。

sqoop job命令使用

Sqoop job相关的命令有两个:

bin/sqoop job
bin/sqoop-job

使用这两个都可以。我们先看看sqoop job命令的基本用法:
创建job:–create
删除job:–delete
执行job:–exec
显示job:–show
列出job:–list

下面,我们基于增量同步数据这个应用场景,创建一个sqoop job,命令如下所示:
bin/sqoop job --create your-sync-job – import --connect jdbc:mysql://10.95.3.49:3306/workflow --table project --username shirdrn -P --hive-import --incremental append --check-column id --last-value 1 – --default-character-set=utf-8
复制代码

创建了job,id为“your-sync-job”,它是将MySQL数据库workflow中的project表同步到Hive表中,而且–incremental append选项使用append模式,–last-value为1,从MySQL表中自增主键id=1开始同步。然后我们根据这个job的id去查询job详细配置情况:
bin/sqoop job --show your-sync-job
如果你想通过并行的方式导入结果,每个map task需要执行sql查询语句的副本,结果会根据sqoop推测的边界条件分区。query必须包含$CONDITIONS。这样每个scoop程序都会被替换为一个独立的条件。同时你必须指定–split-by.分区

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值