栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

Sqoop入门(一篇就够了)

Sqoop入门(一篇就够了)

文章目录

01 引言02 Sqoop概述

2.1 Sqoop定义2.2 Sqoop功能2.3 Sqoop工作机制 03 Sqoop安装

3.1 Sqoop下载3.2 Sqoop配置3.3 Sqoop验证启动 04 Sqoop导入导出

4.1 Sqoop导入

4.1.1 导入语法4.1.2 导入案例

4.1.2.1 导入表数据到HDFS4.1.2.2 导入关系表到HIVE4.1.2.3 导入到HDFS指定目录4.1.2.4 导入表数据子集4.1.2.5 增量导入 4.2 Sqoop导出

4.2.1 导出语法4.2.2 导出案例 05 Sqoop原理

5.1 Sqoop 代码定制

5.1.2 代码定制语法5.1.2 代码定制案例 06 Sqoop、DataX关系与对比

6.1 Sqoop特点6.2 DataX特点6.3 Sqoop与DataX的区别 07 文末

01 引言

在前面的《DataX教程》,我们知道了DataX是阿里研发的一个数据迁移工具,同理,本文主要讲解的是Hadoop生态系统下的一个迁移工具,也就是Sqoop。

02 Sqoop概述 2.1 Sqoop定义

Sqoop:是apache旗下一款“Hadoop和关系数据库服务器之间传送数据”的工具。

2.2 Sqoop功能

Sqoop的主要功能如下:

导入数据:MySQL,Oracle导入数据到Hadoop的HDFS、HIVE、Hbase等数据存储系统;导出数据:从Hadoop的文件系统中导出数据到关系数据库; 2.3 Sqoop工作机制

工作机制:将导入或导出命令翻译成mapreduce程序来实现

在翻译出的mapreduce中主要是对inputformat和outputformat进行定制。

03 Sqoop安装

安装sqoop的前提是已经具备java和hadoop的环境 !

3.1 Sqoop下载

step1:下载并解压

下载地址:http://ftp.wayne.edu/apache/sqoop/1.4.6/ 3.2 Sqoop配置

step2:修改配置文件

$ cd $SQOOP_HOME/conf
$ mv sqoop-env-template.sh sqoop-env.sh

打开sqoop-env.sh并编辑下面几行:

export HADOOP_COMMON_HOME=/home/hadoop/apps/hadoop-2.6.1/ 
export HADOOP_MAPRED_HOME=/home/hadoop/apps/hadoop-2.6.1/
export HIVE_HOME=/home/hadoop/apps/hive-1.2.1

step3:加入mysql的jdbc驱动包

cp  ~/app/hive/lib/mysql-connector-java-5.1.28.jar   $SQOOP_HOME/lib/
3.3 Sqoop验证启动

step4:验证启动

$ cd $SQOOP_HOME/bin
$ 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安装工作完成。

04 Sqoop导入导出 4.1 Sqoop导入 4.1.1 导入语法

Sqoop导入:导入单个表从RDBMS到HDFS,表中的每一行被视为HDFS的记录,所有记录都存储为文本文件的文本数据(或者Avro、sequence文件等二进制数据) 。

下面的语法用于将数据导入HDFS:

$ sqoop import (generic-args) (import-args) 
4.1.2 导入案例

在mysql中有一个库userdb中三个表:

表名内容
emp
emp_add
emp_contact
4.1.2.1 导入表数据到HDFS

下面的命令用于从MySQL数据库服务器中的emp表导入HDFS:

$bin/sqoop import 
--connect jdbc:mysql://hdp-node-01:3306/test 
--username root 
--password root 
--table emp --m 1

如果成功执行,那么会得到下面的输出:

14/12/22 15:24:54 INFO sqoop.Sqoop: Running Sqoop version: 1.4.5
14/12/22 15:24:56 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.
INFO orm.CompilationManager: Writing jar file: /tmp/sqoop-hadoop/compile/cebe706d23ebb1fd99c1f063ad51ebd7/emp.jar
-----------------------------------------------------
O mapreduce.Job: map 0% reduce 0%
14/12/22 15:28:08 INFO mapreduce.Job: map 100% reduce 0%
14/12/22 15:28:16 INFO mapreduce.Job: Job job_1419242001831_0001 completed successfully
-----------------------------------------------------
-----------------------------------------------------
14/12/22 15:28:17 INFO mapreduce.importJobbase: Transferred 145 bytes in 177.5849 seconds (0.8165 bytes/sec)
14/12/22 15:28:17 INFO mapreduce.importJobbase: Retrieved 5 records.

为了验证在HDFS导入的数据,请使用以下命令查看导入的数据:

$ $HADOOP_HOME/bin/hadoop fs -cat /user/hadoop/emp/part-m-00000

emp表的数据和字段之间用逗号(,)表示:

1201, gopal,    manager, 50000, TP
1202, manisha,  preader, 50000, TP
1203, kalil,    php dev, 30000, AC
1204, prasanth, php dev, 30000, AC
1205, kranthi,  admin,   20000, TP
4.1.2.2 导入关系表到HIVE
bin/sqoop import 
--connect jdbc:mysql://hdp-node-01:3306/test 
--username root 
--password root 
--table emp 
--hive-import --m 1
4.1.2.3 导入到HDFS指定目录

指定目标目录选项的Sqoop导入命令的语法:

--target-dir 

下面的命令是用来导入emp_add表数据到’/queryresult'目录。

bin/sqoop import 
--connect jdbc:mysql://hdp-node-01:3306/test 
--username root 
--password root 
--target-dir /queryresult 
--table emp --m 1

下面的命令是用来验证 /queryresult目录中 emp_add表导入的数据形式 :

$HADOOP_HOME/bin/hadoop fs -cat /queryresult/part-m-*

它会用逗号(,)分隔emp_add表的数据和字段:

1201, 288A, vgiri,   jublee
1202, 108I, aoc,     sec-bad
1203, 144Z, pgutta,  hyd
1204, 78B,  oldcity, sec-bad
1205, 720C, hitech,  sec-bad
4.1.2.4 导入表数据子集

我们可以导入表的使用Sqoop导入工具,"where"子句的一个子集。它执行在各自的数据库服务器相应的SQL查询,并将结果存储在HDFS的目标目录。

where子句的语法如下:

--where 

下面的命令用来导入emp_add表数据的子集。子集查询检索员工ID和地址,居住城市为:Secunderabad

bin/sqoop import 
--connect jdbc:mysql://hdp-node-01:3306/test 
--username root 
--password root 
--where "city ='sec-bad'" 
--target-dir /wherequery 
--table emp_add --m 1

下面的命令用来验证数据从emp_add表导入/wherequery目录:

$HADOOP_HOME/bin/hadoop fs -cat /wherequery/part-m-*

它用逗号(,)分隔 emp_add表数据和字段:

1202, 108I, aoc, sec-bad
1204, 78B, oldcity, sec-bad
1205, 720C, hitech, sec-bad
4.1.2.5 增量导入

增量导入是仅导入新添加的表中的行的技术。它需要添加‘incremental’, ‘check-column’, 和 ‘last-value’选项来执行增量导入。

下面的语法用于Sqoop导入命令增量选项:

--incremental 
--check-column 
--last value 

假设新添加的数据转换成emp表如下:

1206, satish p, grp des, 20000, GR

下面的命令用于在EMP表执行增量导入:

bin/sqoop import 
--connect jdbc:mysql://hdp-node-01:3306/test 
--username root 
--password root 
--table emp --m 1 
--incremental append 
--check-column id 
--last-value 1205

以下命令用于从emp表导入HDFS emp/ 目录的数据验证:

$ $HADOOP_HOME/bin/hadoop fs -cat /user/hadoop/emp/part-m-*

它用逗号(,)分隔emp_add表数据和字段:

1201, gopal,    manager, 50000, TP
1202, manisha,  preader, 50000, TP
1203, kalil,    php dev, 30000, AC
1204, prasanth, php dev, 30000, AC
1205, kranthi,  admin,   20000, TP
1206, satish p, grp des, 20000, GR

下面的命令是从表emp 用来查看修改或新添加的行:

$ $HADOOP_HOME/bin/hadoop fs -cat /emp/part-m-*1
这表示新添加的行用逗号(,)分隔emp表的字段。 
1206, satish p, grp des, 20000, GR
4.2 Sqoop导出 4.2.1 导出语法

Sqoop导出:将数据从HDFS导出到RDBMS数据库

注意:

默认操作是从将文件中的数据使用INSERT语句插入到表中更新模式下,是生成UPDATe语句更新表数据

以下是export命令语法:

$ sqoop export (generic-args) (export-args) 
4.2.2 导出案例

数据是在HDFS 中“EMP/”目录的emp_data文件中,所述emp_data如下:

1201, gopal,     manager, 50000, TP
1202, manisha,   preader, 50000, TP
1203, kalil,     php dev, 30000, AC
1204, prasanth,  php dev, 30000, AC
1205, kranthi,   admin,   20000, TP
1206, satish p,  grp des, 20000, GR

step1:首先需要手动创建mysql中的目标表

$ mysql
mysql> USE db;
mysql> CREATE TABLE employee ( 
   id INT NOT NULL PRIMARY KEY, 
   name VARCHAR(20), 
   deg VARCHAR(20),
   salary INT,
   dept VARCHAR(10));

step2:然后执行导出命令

bin/sqoop export 
--connect jdbc:mysql://hdp-node-01:3306/test 
--username root 
--password root 
--table emp2 
--export-dir /user/hadoop/emp/

step3:验证表mysql命令行

mysql>select * from employee;
如果给定的数据存储成功,那么可以找到数据在如下的employee表。
+------+--------------+-------------+-------------------+--------+
| Id   | Name         | Designation | Salary            | Dept   |
+------+--------------+-------------+-------------------+--------+
| 1201 | gopal        | manager     | 50000             | TP     |
| 1202 | manisha      | preader     | 50000             | TP     |
| 1203 | kalil        | php dev     | 30000             | AC     |
| 1204 | prasanth     | php dev     | 30000             | AC     |
| 1205 | kranthi      | admin       | 20000             | TP     |
| 1206 | satish p     | grp des     | 20000             | GR     |
+------+--------------+-------------+-------------------+--------+
05 Sqoop原理

Sqoop的原理:其实就是将导入导出命令转化为mapreduce程序来执行,sqoop在接收到命令后,都要生成mapreduce程序。

5.1 Sqoop 代码定制

使用sqoop的代码生成工具可以方便查看到sqoop所生成的java代码,并可在此基础之上进行深入定制开发。

5.1.2 代码定制语法

以下是Sqoop代码生成命令的语法:

$ sqoop-codegen (generic-args) (codegen-args) 
$ sqoop-codegen (generic-args) (codegen-args)
5.1.2 代码定制案例

示例:以USERDB数据库中的表emp来生成Java代码为例,下面的命令用来生成导入:

$ sqoop-codegen 
--import
--connect jdbc:mysql://localhost/userdb 
--username root  
--table emp

如果命令成功执行,那么它就会产生如下的输出:

14/12/23 02:34:40 INFO sqoop.Sqoop: Running Sqoop version: 1.4.5
14/12/23 02:34:41 INFO tool.CodeGenTool: Beginning code generation
……………….
14/12/23 02:34:42 INFO orm.CompilationManager: HADOOP_MAPRED_HOME is /usr/local/hadoop
Note: /tmp/sqoop-hadoop/compile/9a300a1f94899df4a9b10f9935ed9f91/emp.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
14/12/23 02:34:47 INFO orm.CompilationManager: Writing jar file: /tmp/sqoop-hadoop/compile/9a300a1f94899df4a9b10f9935ed9f91/emp.jar

验证: 查看输出目录下的文件

$ cd /tmp/sqoop-hadoop/compile/9a300a1f94899df4a9b10f9935ed9f91/
$ ls
emp.class
emp.jar
emp.java

如果想做深入定制导出,则可修改上述代码文件!

06 Sqoop、DataX关系与对比

DataX之前写过教程,可以参考《DataX教程》

6.1 Sqoop特点

Sqoop主要特点:

可以将关系型数据库中的数据导入hdfs、hive或者hbase等hadoop组件中,也可将hadoop组件中的数据导入到关系型数据库中;sqoop在导入导出数据时,充分采用了map-reduce计算框架,根据输入条件生成一个map-reduce作业,在hadoop集群中运行。采用map-reduce框架同时在多个节点进行import或者export操作,速度比单节点运行多个并行导入导出效率高,同时提供了良好的并发性和容错性;支持insert、update模式,可以选择参数,若内容存在就更新,若不存在就插入;对国外的主流关系型数据库支持性更好。

6.2 DataX特点

DataX主要特点:

异构数据库和文件系统之间的数据交换;采用framework + plugin架构构建,framework处理了缓冲,流控,并发,上下文加载等高速数据交换的大部分技术问题,提供了简单的接口与插件交互,插件仅需实现对数据处理系统的访问;数据传输过程在单进程内完成,全内存操作,不读写磁盘,也没有IPC;开放式的框架,开发者可以在极短的时间开发一个新插件以快速支持新的数据库/文件系统。

6.3 Sqoop与DataX的区别

Sqoop与DataX的区别如下:

sqoop采用map-reduce计算框架进行导入导出,而datax仅仅在运行datax的单台机器上进行数据的抽取和加载,速度比sqoop慢了许多;sqoop只可以在关系型数据库和hadoop组件之间进行数据迁移,而在hadoop相关组件之间,比如hive和hbase之间就无法使用sqoop互相导入导出数据,同时在关系型数据库之间,比如mysql和oracle之间也无法通过sqoop导入导出数据。与之相反,datax能够分别实现关系型数据库hadoop组件之间、关系型数据库之间、hadoop组件之间的数据迁移;sqoop是专门为hadoop而生,对hadoop支持度好,而datax可能会出现不支持高版本hadoop的现象;sqoop只支持官方提供的指定几种关系型数据库和hadoop组件之间的数据交换,而在datax中,用户只需根据自身需求修改文件,生成相应rpm包,自行安装之后就可以使用自己定制的插件;

07 文末

本文主要讲解了Sqoop的概念、安装以及使用,谢谢大家的阅读,本文完!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/752085.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号