Sqoop概述及shell操作

一、Sqoop概述

1. 产生背景

基于传统关系型数据库的稳定性,还是有很多企业将数据存储在关系型数据库中;早期由于工具的缺乏,Hadoop与传统数据库之间的数据传输非常困难。基于前两个方面的考虑,需要一个在传统关系型数据库和Hadoop之间进行数据传输的项目,Sqoop应运而生。

2. 简介

Sqoop是一个用于Hadoop和结构化数据存储(如关系型数据库)之间进行高效传输大批量数据的工具。它包括以下两个方面:

  • 可以使用Sqoop将数据从关系型数据库管理系统(如MySQL)导入到Hadoop系统(如HDFS、Hive、HBase)中
  • 将数据从Hadoop系统中抽取并导出到关系型数据库(如MySQL)

Sqoop的核心设计思想是利用MapReduce加快数据传输速度。也就是说Sqoop的导入和导出功能是通过基于Map Task(只有map)的MapReduce作业实现的。所以它是一种批处理方式进行数据传输,难以实现实时的数据进行导入和导出。

二、Sqoop架构

  • 用户向Sqoop发起一个命令之后,这个命令会转换为一个基于Map Task的MapReduce作业。
  • Map Task 会访问数据库的元数据信息,通过并行的Map Task将数据库的数据读取出来,然后导入Hadoop中。
  • 当然也可以将Hadoop中的数据,导入传统的关系型数据库中。
  • 它的核心思想就是通过基于Map Task(只有map)的MapReduce作业,实现数据的并发拷贝和传输,这样可以大大提高效率。

三、Sqoop shell操作

参数描述
–connect <jdbc-uri>指定JDBC连接字符串
–username指定连接mysql用户名
–password指定连接mysql密码

1. 将Mysql数据导入到Hadoop中

1.1 数据导入到HDFS
参数描述
table <table name>抽取mysql数据库中的表
–target-dir <path>指定导入hdfs的具体位置。默认生成在为/user/<user>/<table_name>/目录下
-m <数值>执行map任务的个数,默认是4个
–direct可快速转换数据

将mysql数据库中的hive数据库中的roles表数据导入到HDFS中的/user/lyz/111目录下。执行代码如下:

sqoop import \
--connect jdbc:mysql://10.6.6.71:3309/hive \
--username root \
--password root123 \
--table roles \
--target-dir /user/lyz/111 \
--fields-terminated-by ',' \
-m 1 \
--direct

备注:-m参数可以指定map任务的个数,默认是4个。如果指定为1个map任务的话,最终生成的part-m-xxxxx文件个数就为1。在数据充足的情况下,生成的文件个数与指定map任务的个数是等值的。

1.2 数据导入到Hive中
参数描述
–hive-import将表导入Hive中
–hive-table <table name>指定导入Hive的表名
–fields-terminated-by <char>指定导入到hive中的文件数据格式
-m <数值>执行map任务的个数,默认是4个
–direct可快速转换数据

将mysql数据库中的hive数据库中的roles表数据导入到Hive数据库中,并生成roles_test表。执行代码如下:

sqoop import \
--connect jdbc:mysql://10.6.6.71:3309/hive \
--username root \
--password root123 \
--hive-import \
--table roles \
--hive-database default \
--hive-table roles_test \
--fields-terminated-by ',' \
-m 1 \
--direct

备注:-m参数可以指定map任务的个数,默认是4个。如果指定为1个map任务的话,最终生成在/apps/hive/warehouse/ roles_test目录下的part-m-xxxxx文件个数就为1。在数据充足的情况下,生成的文件个数与指定map任务的个数是等值的。

执行数据导入过程中,会触发MapReduce任务。任务执行成功以后,我们访问Hive验证一下数据是否导入成功。

hive> show tables;
OK
roles_test
hive> select * from roles_test;
OK
1	1545355484	admin	admin
2	1545355484	public	public
Time taken: 0.536 seconds, Fetched: 2 row(s)

数据导入成功。

1.3 数据导入到HBase中
参数描述
–column-family <family>设置导入的目标列族
–hbase-row-key <col>指定要用作行键的输入列;如果没有该参数,默认为mysql表的主键
–hbase-create-table如果执行,则创建缺少的HBase表
–hbase-bulkload启用批量加载

将mysql数据库中的hive数据库中的roles表数据导入到HBase中,并生成roles_test表。执行代码如下:

sqoop import \
--connect jdbc:mysql://10.6.6.71:3309/hive \
--username root \
--password root123 \
--table roles \
--hbase-table roles_test \
--column-family info \
--hbase-row-key ROLE_ID \
--hbase-create-table \
--hbase-bulkload

关于参数–hbase-bulkload的解释:

实现将数据批量的导入Hbase数据库中,BulkLoad特性能够利用MR计算框架将源数据直接生成内部的HFile格式,直接将数据快速的load到HBase中。

细心的你可能会发现,使用–hbase-bulkload参数会触发MapReduce的reduce任务。

执行数据导入过程中,会触发MapReduce任务。任务执行成功以后,我们访问HBase验证一下数据是否导入成功。

hbase(main):002:0> list
TABLE          
roles_test                                                         
1 row(s) in 0.1030 seconds
=> ["roles_test"]
hbase(main):003:0> scan "roles_test"

ROW                                              COLUMN+CELL                                                                                                                  
 1                                               column=info:CREATE_TIME, timestamp=1548319280991, value=1545355484                                                                          
 1                                               column=info:OWNER_NAME, timestamp=1548319280991, value=admin                                                                                
 1                                               column=info:ROLE_NAME, timestamp=1548319280991, value=admin                                                                                 
 2                                               column=info:CREATE_TIME, timestamp=1548319282888, value=1545355484                                                                          
 2                                               column=info:OWNER_NAME, timestamp=1548319282888, value=public                                                                       
 2                                               column=info:ROLE_NAME, timestamp=1548319282888, value=public                                                          
2 row(s) in 0.0670 seconds

总结:roles_test表的row_key是源表的主键ROLE_ID值,其余列均放入了info这个列族中。

2. 将Hadoop数据导出到Mysql中

Sqoop export工具将一组文件从HDFS导出回Mysql。目标表必须已存在于数据库中。根据用户指定的分隔符读取输入文件并将其解析为一组记录。

默认操作是将这些转换为一组INSERT将记录注入数据库的语句。在“更新模式”中,Sqoop将生成UPDATE替换数据库中现有记录的语句,并且在“调用模式”下,Sqoop将为每条记录进行存储过程调用。

将HDFS、Hive、HBase的数据导出到Mysql表中,都会用到下表的参数:

参数描述
–table <table name>指定要导出的mysql目标表
–export-dir <path>指定要导出的hdfs路径
–input-fields-terminated-by <char>指定输入字段分隔符
-m <数值>执行map任务的个数,默认是4个
2.1 HDFS数据导出至Mysql

首先在test数据库中创建roles_hdfs数据表:

USE test;
CREATE TABLE `roles_hdfs` (
`ROLE_ID` bigint(20) NOT NULL ,
`CREATE_TIME` int(11) NOT NULL ,
`OWNER_NAME` varchar(128) DEFAULT NULL ,
`ROLE_NAME` varchar(128) DEFAULT NULL ,
PRIMARY KEY (`ROLE_ID`)
)

将HDFS上的数据导出到mysql的test数据库的roles_hdfs表中,执行代码如下:

sqoop export \
--connect jdbc:mysql://10.6.6.71:3309/test \
--username root \
--password root123 \
--table roles_hdfs \
--export-dir /user/lyz/111 \
--input-fields-terminated-by ',' \
-m 1

执行数据导入过程中,会触发MapReduce任务。任务成功之后,前往mysql数据库查看是否导入成功。

2.2 Hive数据导出至Mysql

首先在test数据库中创建roles_hive数据表:

CREATE TABLE `roles_hive` (
`ROLE_ID` bigint(20) NOT NULL ,
`CREATE_TIME` int(11) NOT NULL ,
`OWNER_NAME` varchar(128) DEFAULT NULL ,
`ROLE_NAME` varchar(128) DEFAULT NULL ,
PRIMARY KEY (`ROLE_ID`)
)

由于Hive数据存储在HDFS上,所以从根本上还是将hdfs上的文件导出到mysql的test数据库的roles_hive表中,执行代码如下:

sqoop export \
--connect jdbc:mysql://10.6.6.71:3309/test \
--username root \
--password root123 \
--table roles_hive \
--export-dir /apps/hive/warehouse/roles_test \
--input-fields-terminated-by ',' \
-m 1
2.3 HBase数据导出至Mysql

目前Sqoop不支持从HBase直接导出到关系型数据库。可以使用Hive周转一下。

2.3.1 创建hive外部表
create external table hive_hbase(id int,CREATE_TIME string,OWNER_NAME string,ROLE_NAME string)
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
with serdeproperties ("hbase.columns.mapping" = ":key,info:CREATE_TIME,info:OWNER_NAME,info:ROLE_NAME")
tblproperties("hbase.table.name" = "roles_test");

2.3.2 创建Hive内部表

创建适配于Hive外部表的内部表:

create table if not exists hive_export(id int, CREATE_TIME string, OWNER_NAME string, ROLE_NAME string)
row format delimited fields terminated by ',' stored as textfile;

hive_hbase外部表的源是HBase表数据,当创建适配于hive_hbase外部表的Hive内部表时,指定行的格式为’,’

2.3.3 将外部表的数据导入到内部表中
insert overwrite table hive_export
select * from hive_hbase;

2.3.4 创建Mysql表
CREATE TABLE `roles_hbase` (
`id` bigint(20) NOT NULL,
` create_time` varchar(128) NOT NULL ,
` owner_name` varchar(128) DEFAULT NULL ,
` role_name` varchar(128) DEFAULT NULL ,
PRIMARY KEY (`id`)
)
2.3.5 执行sqoop export
sqoop export \
--connect jdbc:mysql://10.6.6.71:3309/test \
--username root \
--password root123 \
--table roles_hbase \
--export-dir /apps/hive/warehouse/hive_export/ \
--input-fields-terminated-by ',' \
-m 1

查看mysql中的roles_hbase表,数据成功被导入。

备注:在创建表的时候,一定要注意表字段的类型,如果指定表类型不一致,有可能会报错。

3. 总结

使用sqoop import/export命令,可以实现将关系型数据库中的数据与Hadoop中的数据进行相互转化,其中一些转化的细节,可以指定参数实现。在执行过程中,sqoop shell操作,会转化为MapReduce任务来实现数据的抽取。

更多的sqoop操作,详情请参见:http://sqoop.apache.org/docs/1.4.6/SqoopUserGuide.html


码字不易,如果您觉得文章写得不错,请扫码关注公众号支持作者~ 您的关注是我写作的最大动力?

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

create17

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值