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
#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=

2.4 拷贝JDBC驱动

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

3.5 验证启动

 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

三、使用

3.1 导出数据

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

3.1.1 HDFS 到RDBMS

这里以 MySQL 为例

准备数据

准备数据需要在Mysql中建立新表

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;

数据导出

这里数据是使用MR进行清洗后得到的数据

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

3.2 导入数据

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

3.2.1 RDBMS 到 HDFS

准备数据

数据库中还是上述文档中创建的logs。将logs中的数据导入至HDFS

导入数据
(1)全部导入
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 " " \
(2)条件导入

通过手动指定查询条件导入数据 ,在查询语句中必须包含$CONDITIONS关键字

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'
(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 \
--num-mappers 1 \
--hive-import \
--fields-terminated-by " " \
--hive-overwrite \
--hive-database default \
--hive-table logs \
--delete-target-dir 
填坑三部曲

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-APNwyP6t-1593839446284)(assets/1561101710156.png)]

解决办法: 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/

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1dvJ4GYF-1593839446287)(assets/1561101745739.png)]

解决办法: 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/ 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sHGNg56O-1593839446290)(assets/1561101798068.png)]

这里可以看出当前使用hive中logs是带有分区的,但是在导入的时候没有去指定具体是哪个分区,所以问题就在这里。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1bUrtR64-1593839446292)(assets/1561101986300.png)]

从 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并打包
create-hive-table获取数据库中某张表
eval查看 SQL 执行结果
export将集群数据导出
help打印 sqoop 帮助信息
import将数据导入到集群
import-all-tables导入某个数据库下所有表到 HDFS 中
import-mainframe将数据集从大型机服务器导入到HDFS
job用来生成一个 sqoop的任务,生成后,该任务并不执行,除非使用命令执行该任务。
list-databases列出所有数据库名
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–driverHadoop 根目录
4–help打印帮助信息
5–password连接数据库的密码
6–username连接数据库的用户名
7–verbose在控制台打印出详细信息

4.2.2 共用参数:import

序号参数说明
1–enclosed-by 给字段值前加上指定的字符
2–escaped-by 对字段中的双引号加转义符
3–fields-terminated-by 设定每个字段是以什么符号作为结束,默认为逗号
4–lines-terminated-by 设定每行记录之间的分隔符,默认是\n
5–mysql-delimitersMysql 默认的分隔符设置,字段之间以逗号分隔,行之间以\n 分隔,默认转义符是\,字段值以单引号包裹
6–optionally-enclosed-by 给带有双引号或单引号的字段值前后加上指定字符

4.2.3 共用参数:export

序号参数说明
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.4 共用参数:hive

序号参数说明
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.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

在这里插入图片描述
给自己加个油,给明天一个笑脸

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值