【赵渝强老师】大数据交换引擎Sqoop

简介: Sqoop是一款开源工具,用于在Hadoop与传统数据库如Oracle、MySQL之间传输数据。它基于MapReduce实现,支持数据导入导出、生成Java类及Hive表结构等操作,适用于大数据处理场景。

b374.png

Sqoop是SQL To Hadoop的简称,它是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(Oracle、MySQL等)间进行数据的传递。通过使用Sqoop可以将一个关系型数据库中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。Sqoop是基于MapReduce完成数据的交换,因此在使用Sqoop之前需要部署Hadoop环境;另一方面,由于Sqoop交换的是关系型数据库中的数据,因此底层需要JDBC驱动的支持。


Sqoop项目开始于2009年,最早是作为Hadoop的一个第三方模块存在,后来为了让使用者能够快速部署,也为了让开发人员能够更快速的迭代开发,Sqoop独立成为一个Apache项目。


视频讲解如下:


一、 准备Sqoop环境


Apache Sqoop的安装部署比较简单,直接解压后就可以使用。由于Sqoop底层需要JDBC的支持。因此需要将对应关系型数据库的JDBC Driver复制到Sqoop的lib目录下。这里将在bigdata111的虚拟主机上来完成安装和部署,并采集之前部署好的MySQL数据库中的数据。下面通过具体的步骤来演示Sqoop的部署。


(1)将Sqoop的安装包解压到/root/training目录。

tar -zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C ~/training/


(2)将Sqoop的目录进行重命名。

cd ~/training/
mv sqoop-1.4.7.bin__hadoop-2.6.0/ sqoop/


(3)将MySQL的JDBC Driver复制到Sqoop的lib目录下。

cp mysql-connector-java-5.1.43-bin.jar ~/training/sqoop/lib/


(4)编辑文件/root/.bash_profile设置Sqoop相应的环境变量。

SQOOP_HOME=/root/training/sqoop
export SQOOP_HOME
PATH=$SQOOP_HOME/bin:$PATH
export PATH


(5)生效环境变量。

source /root/.bash_profile


(6)启动Hadoop环境。

start-all.sh


(7)登录MySQL数据库执行下面的脚本建立测试数据。

create database if not exists demo;
use demo;

create table emp 
(empno int primary key,
ename varchar(10),
job varchar(10),
mgr int,
hiredate varchar(10),
sal int,
comm int,
deptno int);

create table dept
(deptno int primary key,
dname varchar(10),
loc varchar(10)
);

insert into emp values(7369,'SMITH','CLERK',7902,'1980/12/17',800,0,20);
insert into emp values(7499,'ALLEN','SALESMAN',7698,'1981/2/20',1600,300,30);
insert into emp values(7521,'WARD','SALESMAN',7698,'1981/2/22',1250,500,30);
insert into emp values(7566,'JONES','MANAGER',7839,'1981/4/2',2975,0,20);
insert into emp values(7654,'MARTIN','SALESMAN',7698,'1981/9/28',1250,1400,30);
insert into emp values(7698,'BLAKE','MANAGER',7839,'1981/5/1',2850,0,30);
insert into emp values(7782,'CLARK','MANAGER',7839,'1981/6/9',2450,0,10);
insert into emp values(7788,'SCOTT','ANALYST',7566,'1987/4/19',3000,0,20);
insert into emp values(7839,'KING','PRESIDENT',-1,'1981/11/17',5000,0,10);
insert into emp values(7844,'TURNER','SALESMAN',7698,'1981/9/8',1500,0,30);
insert into emp values(7876,'ADAMS','CLERK',7788,'1987/5/23',1100,0,20);
insert into emp values(7900,'JAMES','CLERK',7698,'1981/12/3',950,0,30);
insert into emp values(7902,'FORD','ANALYST',7566,'1981/12/3',3000,0,20);
insert into emp values(7934,'MILLER','CLERK',7782,'1982/1/23',1300,0,10);

insert into dept values(10,'ACCOUNTING','NEW YORK');
insert into dept values(20,'RESEARCH','DALLAS');
insert into dept values(30,'SALES','CHICAGO');
insert into dept values(40,'OPERATIONS','BOSTON');


二、 使用Sqoop完成数据交换


下面将通过具体的操作步骤来演示如何使用Sqoop完成与关系型数据库MySQL的数据交换。


(1)使用Sqoop执行一个简单的查询。这里将查询10号部门的员工姓名、职位、薪水和部门号,结果如下图所示。

sqoop eval --connect jdbc:mysql://localhost:3306/demo?useSSL=false \
--username root --password Welcome_1 --query \
"select ename,job,sal,deptno from emp where deptno=10"

image.png


(2)根据MySQL数据库中的表结构生成对应的Java Class。

sqoop codegen --connect jdbc:mysql://localhost:3306/demo \
--username root --password Welcome_1 --table emp

# 输出的日志如下所示:
2021-04-22 14:34:42,491 INFO orm.CompilationManager: HADOOP_MAPRED_HOME is /root/training/hadoop-3.1.2
Note: /tmp/sqoop-root/compile/2abad54ace6665327b12e83a02b14a8f/emp.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
2021-04-22 14:34:45,173 INFO orm.CompilationManager: Writing jar file: 
            /tmp/sqoop-root/compile/2abad54ace6665327b12e83a02b14a8f/emp.jar

# 执行成功后,会自动将/tmp目录下生成的emp.java拷贝至当前目录,部分代码如下:
public class emp extends SqoopRecord  implements DBWritable, Writable {
  private final int PROTOCOL_VERSION = 3;
  public int getClassFormatVersion() { return PROTOCOL_VERSION; }
  public static interface FieldSetterCommand {
  void setField(Object value);  
  }  
  protected ResultSet __cur_result_set;
  
  private Map<String, FieldSetterCommand> setters = 
                      new HashMap<String, FieldSetterCommand>();
            
  private void init0() {
    setters.put("empno", new FieldSetterCommand() {
      @Override
      public void setField(Object value) {
        emp.this.empno = (Integer)value;
      }
    });
    setters.put("ename", new FieldSetterCommand() {
      @Override

# 这里可以看到emp类实现了Writable接口。按照开发MapReduce程序的要求,该类可以作为MapReduce的Key或者Value。


(3)根据MySQL数据库中的表结构生成对应的Hive表结构。命令执行完成后,查看Hive中的表结构信息如下图所示。

export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HIVE_HOME/lib/*
sqoop create-hive-table --connect jdbc:mysql://localhost:3306/demo  \
--username root --password Welcome_1 --table emp --hive-table emphive

image.png


(4)将MySQL数据库中的emp表导入到HDFS。命令执行完成后,查看HDFS目录的内容,如下图所示。

sqoop import --connect jdbc:mysql://localhost:3306/demo  \
--username root --password Welcome_1 --table emp --target-dir /myempdata

image.png

(5)将HDFS的数据导出到MySQL数据库中。命令执行完成后,在MySQL中验证数据是否导入如下图所示。

# 先在MySQL中创建对应的表
create table mynewemp like emp;

# 执行导入
sqoop export --connect jdbc:mysql://localhost:3306/demo  \
--username root --password Welcome_1 \
--table mynewemp --export-dir /myempdata

image.png

(6)将MySQL数据库中的所有表导入到HDFS。执行完成后默认将导入HDFS的/user/root目录,如下图所示。

sqoop import-all-tables --connect jdbc:mysql://localhost:3306/demo \
--username root --password Welcome_1

image.png

(7)列出MySQL的所有数据库。命令执行完成后,如下图所示。

sqoop list-databases --connect jdbc:mysql://localhost:3306/demo \
--username root --password Welcome_1

image.png


(8)列出MySQL数据库中所有的表,执行结果如下图所示。

sqoop list-tables --connect jdbc:mysql://localhost:3306/demo \
--username root --password Welcome_1

image.png


(9)将MySQL表的数据导入HBase。

#进入HBase Shell创建表
create 'emp','empinfo'
#执行导入
sqoop import --connect jdbc:mysql://localhost:3306/demo \
--username root --password Welcome_1 --table emp \
--columns empno,ename,sal,deptno \
--hbase-table emp --hbase-row-key empno --column-family empinfo
# Sqoop导入数据到HBase时,HBase的版本不能太高,建议使用HBase 1.3.6。


相关实践学习
基于MaxCompute的热门话题分析
Apsara Clouder大数据专项技能认证配套课程:基于MaxCompute的热门话题分析
相关文章
|
8月前
|
存储 分布式计算 大数据
【赵渝强老师】阿里云大数据存储计算服务:MaxCompute
阿里云MaxCompute是快速、全托管的TB/PB级数据仓库解决方案,提供海量数据存储与计算服务。支持多种计算模型,适用于大规模离线数据分析,具备高安全性、低成本、易用性强等特点,助力企业高效处理大数据。
404 0
|
5月前
|
数据采集 缓存 大数据
【赵渝强老师】大数据日志采集引擎Flume
Apache Flume 是一个分布式、可靠的数据采集系统,支持从多种数据源收集日志信息,并传输至指定目的地。其核心架构由Source、Channel、Sink三组件构成,通过Event封装数据,保障高效与可靠传输。
362 1
|
5月前
|
传感器 人工智能 监控
拔俗多模态跨尺度大数据AI分析平台:让复杂数据“开口说话”的智能引擎
在数字化时代,多模态跨尺度大数据AI分析平台应运而生,打破数据孤岛,融合图像、文本、视频等多源信息,贯通微观与宏观尺度,实现智能诊断、预测与决策,广泛应用于医疗、制造、金融等领域,推动AI从“看懂”到“会思考”的跃迁。
447 0
|
8月前
|
人工智能 分布式计算 DataWorks
分布式×多模态:当ODPS为AI装上“时空穿梭”引擎
本文深入探讨了多模态数据处理的技术挑战与解决方案,重点介绍了基于阿里云ODPS的多模态数据处理平台架构与实战经验。通过Object Table与MaxFrame的结合,实现了高效的非结构化数据管理与分布式计算,显著提升了AI模型训练效率,并在工业质检、多媒体理解等场景中展现出卓越性能。
|
6月前
|
机器学习/深度学习 传感器 分布式计算
数据才是真救命的:聊聊如何用大数据提升灾难预警的精准度
数据才是真救命的:聊聊如何用大数据提升灾难预警的精准度
452 14
|
8月前
|
数据采集 分布式计算 DataWorks
ODPS在某公共数据项目上的实践
本项目基于公共数据定义及ODPS与DataWorks技术,构建一体化智能化数据平台,涵盖数据目录、归集、治理、共享与开放六大目标。通过十大子系统实现全流程管理,强化数据安全与流通,提升业务效率与决策能力,助力数字化改革。
295 4
|
8月前
|
分布式计算 DataWorks 数据处理
在数据浪潮中前行:记录一次我与ODPS的实践、思考与展望
本文详细介绍了在 AI 时代背景下,如何利用阿里云 ODPS 平台(尤其是 MaxCompute)进行分布式多模态数据处理的实践过程。内容涵盖技术架构解析、完整操作流程、实际部署步骤以及未来发展方向,同时结合 CSDN 博文深入探讨了多模态数据处理的技术挑战与创新路径,为企业提供高效、低成本的大规模数据处理方案。
409 3
|
7月前
|
机器学习/深度学习 运维 监控
运维不怕事多,就怕没数据——用大数据喂饱你的运维策略
运维不怕事多,就怕没数据——用大数据喂饱你的运维策略
539 0
|
6月前
|
传感器 人工智能 监控
数据下田,庄稼不“瞎种”——聊聊大数据如何帮农业提效
数据下田,庄稼不“瞎种”——聊聊大数据如何帮农业提效
222 14

相关产品

  • 云原生大数据计算服务 MaxCompute