Sqoop 数据迁移工具(mysql、HDFS、Hive、HBase)

您所在的位置:网站首页 hive表数据导入到mysql Sqoop 数据迁移工具(mysql、HDFS、Hive、HBase)

Sqoop 数据迁移工具(mysql、HDFS、Hive、HBase)

#Sqoop 数据迁移工具(mysql、HDFS、Hive、HBase)| 来源: 网络整理| 查看: 265

Sqoop 数据迁移工具(mysql、HDFS、Hive、HBase) 1、概述 2、工作机制 3、Sqoop 安装 3.1、准备安装包 3.2、安装步骤 3.2.1、解压安装包到安装目录 3.2.2、sqoop-env.sh 3.2.3、加入 mysql 驱动包 3.2.4、配置系统环境变量 3.2.4、验证安装是否成功 4、Sqoop 基本命令介绍 5、Sqoop 数据导入 5.1、导入 MySQL 数据到 HDFS 5.1.1、普通导入 5.1.2、指定分隔符和导入路径 5.1.3、导入 where 条件数据 5.1.4、导入 Query 结果数据 5.2、导入 MySQL 到 HIVE 5.2.1、普通导入 5.2.2、增量导入 5.3、导入 MySQL 数据到 HBase 6、Sqoop 数据导出 6.1、导出 HDFS 数据到 MySQL 6.2、导出 HIVE 数据到 MySQL 6.3、导出 HBase 数据到 MySQL 7、Sqoop 导入导出的原理剖析 7.1、Sqoop 导入原理 7.2、Sqoop 导出原理 8、资料

1、概述

sqoop 是 apache 旗下一款 “Hadoop 和关系数据库服务器之间传送数据”的工具。 (1)导入数据:MySQL,Oracle 导入数据到 Hadoop 的 HDFS、HIVE、HBASE 等数据存储系统。 (2)导出数据:从 Hadoop 的文件系统中导出数据到关系数据库 mysql 等。

Sqoop 的本质还是一个命令行工具,和 HDFS,Hive 相比,并没有什么高深的理论。 在这里插入图片描述

2、工作机制

将导入或导出命令翻译成 MapReduce 程序来实现,在翻译出的 MapReduce 中主要是对 InputFormat 和 OutputFormat 进行定制。

3、Sqoop 安装 3.1、准备安装包

安装 Sqoop 的前提是已经具备 Java 和 Hadoop 的环境: 安装包(sqoop-1.4.6.bin_hadoop-2.0.4-alpha.tar.gz)下载地址:http://ftp.wayne.edu/apache/sqoop/1.4.6/

本人博客中用到的 hbase verson 1.6.0,当心版本不兼容。 sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz(sqoop-1.4.6.bin_hadoop-2.0.4-alpha.tar.gz): 链接:https://pan.baidu.com/s/1mp6-tS0qpU3Nmv2oUrYXCA 提取码:kg7i 复制这段内容后打开百度网盘手机App,操作更方便哦

3.2、安装步骤 3.2.1、解压安装包到安装目录 tar -zxvf ~/apks/sqoop-1.4.6.bin_hadoop-2.0.4-alpha.tar.gz -C ~/apps/ cd ~/apps mv sqoop-1.4.6.bin_hadoop-2.0.4-alpha/ sqoop-1.4.6 3.2.2、sqoop-env.sh

(1)进入到 sqoop conf 文件夹,找到 sqoop-env-template.sh,修改其名称为 sqoop-env.sh:

cd ~/apps/sqoop-1.4.6/conf mv sqoop-env-template.sh sqoop-env.sh

(2) 修改 sqoop-env.sh:

vim sqoop-env.sh

在这里插入图片描述

export HADOOP_COMMON_HOME=/home/hadoop/apps/hadoop-2.7.5 export HADOOP_MAPRED_HOME=/home/hadoop/apps/hadoop-2.7.5 export HBASE_HOME=/home/hadoop/apps/hbase-1.6.0 export HIVE_HOME=/home/hadoop/apps/hive-2.3.3 export ZOOCFGDIR=/home/hadoop/apps/zookeeper-3.4.10/conf

zookeeper 和 hbase 没有安装。那就不用管了。如果也安装的有,并且要使用,那么就给配置上。

3.2.3、加入 mysql 驱动包

加入 mysql 驱动包到 sqoop1.4.6/lib 目录下:

cp mysql-connector-java-5.1.40-bin.jar ~/apps/sqoop1.4.6/lib/

链接:https://pan.baidu.com/s/1M828j9nUKrbyYvFuZLTfiw 提取码:7azh

3.2.4、配置系统环境变量

(1)编辑环境变量文件:

vi /etc/profile

(2)添加内容:

export SQOOP_HOME=/home/hadoop/apps/sqoop1.4.6 export PATH=$PATH:$SQOOP_HOME/bin

(3)然后保存退出(":wq")。 (4)更新环境变量:

source /etc/profile 3.2.4、验证安装是否成功

sqoop-version 或者 sqoop version 在这里插入图片描述 出现如图所示画面,证明安装成功,那么接下来就可以正常使用了。

4、Sqoop 基本命令介绍

首先,我们可以使用 sqoop help 来查看,sqoop 支持哪些命令: 在这里插入图片描述 然后得到这些支持了的命令之后,如果不知道使用方式,可以使用 sqoop help command 的方式来查看某条具体命令的使用方式,比如:sqoop help import。

5、Sqoop 数据导入 5.1、导入 MySQL 数据到 HDFS

“导入工具” 导入单个表从 RDBMS 到 HDFS。表中的每一行被视为 HDFS 的记录。所有记录都存储为文本文件的文本数据(或者 Avro、sequence 文件等二进制数据)。 下面的语法用于将数据导入 HDFS:

sqoop import (generic-args) (import-args)

常用参数:

--connect \ jdbc 连接地址 --connection-manager \ 连接管理者 --driver \ 驱动类 --hadoop-mapred-home \ $HADOOP_MAPRED_HOME --help help 信息 -P 从命令行输入密码 --password \ 密码 --username \ 账号 --verbose 打印流程信息 --connection-param-file \ 可选参数

示例: 先看 Mysql 表数据:这是 mysql 中 help_keyword 表的数据: 在这里插入图片描述

5.1.1、普通导入 sqoop import \ --connect jdbc:mysql://hadoop01:3306/mysql \ --username root \ --password root \ --table help_keyword \ -m 1

如果我们没有给该命令指定导出的文件的存储路径,那么默认会保存在 HDFS 上的 /user/hadoop/help_keyword 目中。 其中,第一个 user 是固定的,第二个 hadoop,表示链接的用户名,第三个表示表名。 -m ,启用 x 个 map 任务,输出到 hdfs 的文件有 x 个。

查看结果: 执行过程结果: 在这里插入图片描述 HDFS 上文件结果: 在这里插入图片描述 可以下载下来使用本地文本编辑器查看比对结果(文件内容结果): 在这里插入图片描述 也可以使用 hadoop 命令查看:

hadoop fs -cat /user/hadoop/help_keyword/part-m-00000

在这里插入图片描述

从以上结果可以得出一个结论:如果没有指定路径,则会按默认规则生成路径,如果没有指定分隔符,默认按照逗号分隔。

5.1.2、指定分隔符和导入路径

先看指定导入路径的语法规则:

--target-dir

再看指定导入的文本文件的列分隔符:

--fields-terminated-by '\t'

看具体实例:

sqoop import \ --connect jdbc:mysql://hadoop01:3306/mysql \ --username root \ --password root \ --table help_keyword \ --target-dir /user/hadoop/my_help_keyword \ --fields-terminated-by '\t' \ -m 1

看结果: 在这里插入图片描述 使用 hadoop 命令查看:

hadoop fs -cat /user/hadoop/my_help_keyword/part-m-00000

在这里插入图片描述

5.1.3、导入 where 条件数据

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

--where

下面我们看具体实例:

sqoop import \ --connect jdbc:mysql://hadoop01:3306/mysql \ --username root \ --password root \ --where "name='STRING'" \ --table help_keyword \ --target-dir /sqoop/hadoop/myoutport1 \ -m 1

同上自己查看结果。。。

5.1.4、导入 Query 结果数据 sqoop import \ --connect jdbc:mysql://hadoop01:3306/mysql \ --username root \ --password root \ --target-dir /user/hadoop/myoutport2 \ --query 'select help_keyword_id,name from help_keyword WHERE name = "STRING" and $CONDITIONS' \ --split-by help_keyword_id \ --fields-terminated-by '\t' \ -m 1

注意:外层使用单引号,SQL 语句当中的条件使用双引号,否则会报错。 --split-by ,使用必须指定 -m,在 query 中按查询字段分割给各个 map 任务。

或者这么写:

sqoop import \ --connect jdbc:mysql://hadoop02:3306/mysql \ --username root \ --password root \ --target-dir /user/hadoop/myoutport22 \ --query "select help_keyword_id,name from help_keyword WHERE name = 'STRING' and \$CONDITIONS" \ --split-by help_keyword_id \ --fields-terminated-by '\t' \ -m 1

结果同上查看。。。。

5.2、导入 MySQL 到 HIVE

** Sqoop 导入关系型数据到 hive 的过程是先导入到 hdfs,然后再 load 进入 hive。 **

5.2.1、普通导入

示例:

sqoop import \ --connect jdbc:mysql://hadoop01:3306/mysql \ --username root \ --password root \ --table help_keyword \ --hive-import \ -m 1

注意:导入数据到 hive 表,默认表在 default 库下,表名一样,采用 ‘\u0001’ 分隔。 查看执行结果: 在这里插入图片描述 查看结果,确实生成结果在 hive 的 default 库中,查看表数据: hive> select * from help_keyword limit 3; 在这里插入图片描述 接下来,再看一例:

sqoop import \ --connect jdbc:mysql://hadoop01:3306/mysql \ --username root \ --password root \ --table help_keyword \ --fields-terminated-by "\t" \ --lines-terminated-by "\n" \ --hive-import \ --hive-overwrite \ --create-hive-table \ --hive-table mydb_test.new_help_keyword \ --delete-target-dir

注意:表会自动创建,但是库不会。所以在执行该语句之前,一定要确保 hive 的数据库 mydb_test 是存在的,否则程序会报错。 查看执行结果: 在这里插入图片描述

5.2.2、增量导入

增量导入是仅导入表中新添加的行的技术。 它需要添加 ‘incremental’ , ‘check-column’, 和 ‘last-value’ 选项来执行增量导入。 下面的语法结构用于 Sqoop 导入命令增量选项。

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

下面的命令执行增量导入:

sqoop import \ --connect jdbc:mysql://hadoop02:3306/mysql \ --username root \ --password root \ --table help_keyword \ --target-dir /user/hadoop/myoutport3 \ --incremental append \ --check-column help_keyword_id \ --last-value 500 \ -m 1

此处结果不包含 help_keyword_id = 500 数据,数据是大于 500 的查看执行结果: 同上自己查看数据。

5.3、导入 MySQL 数据到 HBase

首先看示例:

sqoop import \ --connect jdbc:mysql://hadoop01:3306/mysql \ --username root \ --password root \ --table help_keyword \ --hbase-create-table \ --hbase-table new_help_keyword \ --column-family person \ --hbase-row-key help_keyword_id

字段解释:

–connect jdbc:mysql://hadoop04:3306/mysql,表示远程或者本地 Mysql 服务的 URI –hbase-create-table,表示在 HBase 中建立表。 –hbase-table new_help_keyword,表示在 HBase 中建立表 new_help_keyword。 –hbase-row-key help_keyword_id,表示hbase表的rowkey是mysql表的help_keyword_id 字段。 –column-family person,表示在表 new_help_keyword 中建立列族 person。 –username ‘root’,表示使用用户 root 连接 mysql。 –password ‘root’,连接 mysql 的用户密码 –table help_keyword,表示导出 mysql 数据库的 help_keyword 表。

看结果: 在这里插入图片描述 在这里插入图片描述

6、Sqoop 数据导出 6.1、导出 HDFS 数据到 MySQL

注意:导出前,MySQL 目标表必须存在于目标数据库中。

HDFS:hadoop distributed file system(Hadoop 分布式文件系统); RDBMS:Relation DataBase Manager System(关系数据库管理系统); OOP:orentied object programming(面向对象程序设计); AOP:orentied aspect programming(面向方面编程)。

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

Export 语法结构:

sqoop export (generic-args) (export-args)

Export 常用参数:

–direct,快速导入 –export-dir ,HDFS 导出数据的目录 -m,–num-mappers ,n 个 map 线程 –table ,导出哪个表 –call ,存储过程 –update-key ,通过哪个字段来判断更新 –update-mode ,插入模式,默认是只更新,可以设置为 allowinsert。 –input-null-string ,字符类型 null 处理 –input-null-non-string ,非字符类型 null 处理 –staging-table ,临时表 –clear-staging-table ,清空临时表 –batch ,批量模式

第一步,先看需要导出到 mysql 的数据:

95001,李勇,男,20,CS 95002,刘晨,女,19,IS 95003,王敏,女,22,MA 95004,张立,男,19,IS 95005,刘刚,男,18,MA 95006,孙庆,男,23,CS 95007,易思玲,女,19,MA 95008,李娜,女,18,CS 95009,梦圆圆,女,18,MA 95010,孔小涛,男,19,CS 95011,包小柏,男,18,MA 95012,孙花,女,20,CS 95013,冯伟,男,21,CS 95014,王小丽,女,19,CS 95015,王君,男,18,MA 95016,钱国,男,21,MA 95017,王风娟,女,18,IS 95018,王一,女,19,IS 95019,邢小丽,女,19,IS 95020,赵钱,男,21,IS 95021,周二,男,17,MA 95022,郑明,男,20,MA

在这里插入图片描述

然后第二步,需要首先在 mysql 数据库中新建表:

create database if not exists sqoopdb default character set utf8 COLLATE utf8_general_ci; use sqoopdb; CREATE TABLE sqoopstudent ( id INT NOT NULL PRIMARY KEY, name VARCHAR(20), sex VARCHAR(20), age INT, department VARCHAR(20) );

第三步,执行导出:

sqoop export \ --connect jdbc:mysql://hadoop01:3306/sqoopdb \ --username root \ --password root \ --table sqoopstudent \ --export-dir /testfile/student.txt \ --fields-terminated-by ','

在这里插入图片描述

第四步,查看结果: 在这里插入图片描述 在这里插入图片描述 注意:如果导出数据到 mysql 出现乱码,那么请参考下面这两个解决方案: (1)Linux 在线安装 mysql (2)SQOOP导入mysql数据库乱码

6.2、导出 HIVE 数据到 MySQL sqoop export \ --connect jdbc:mysql://hadoop01:3306/sqoopdb \ --username root \ --password root \ --table uv_info \ --export-dir /user/hive/warehouse/uv/dt=2011-08-03 \ --input-fields-terminated-by '\t'

其实跟直接导出 HDFS 数据到 MySQL 没什么两样

6.3、导出 HBase 数据到 MySQL

很遗憾,现在还没有直接的命令将 HBase 的数据导出到 MySQL。 一般采用如下 3 种方法: (1)将 Hbase 数据,扁平化成 HDFS 文件,然后再由 sqoop 导入; (2)将 Hbase 数据导入 Hive 表中,然后再导入 mysql; (3)直接使用 Hbase 的 Java API 读取表数据,直接向 mysql 导入,不需要使用 sqoop。

7、Sqoop 导入导出的原理剖析 7.1、Sqoop 导入原理

从上面的演示例子中,我们大致能得出一个结论,sqoop 工具是通过 MapReduce 进行导入作业的。总体来说,是把关系型数据库中的某张表的一行行记录都写入到 hdfs。 下面给大家奉上一张原理图: 在这里插入图片描述 上面这张图大致解释了 sqoop 在进行数据导入工作的大致流程,下面我们用文字来详细描述一下: (1)第一步,Sqoop 会通过 JDBC 来获取所需要的数据库元数据,例如,导入表的列名,数据类型等。 (2)第二步,这些数据库的数据类型(varchar, number 等)会被映射成 Java 的数据类型(String, int 等),根据这些信息,Sqoop 会生成一个与表名同名的类用来完成序列化工作,保存表中的每一行记录。 (3)第三步,Sqoop 启动 MapReducer 作业。 (4)第四步,启动的作业在 input 的过程中,会通过 JDBC 读取数据表中的内容,这时,会使用 Sqoop 生成的类进行反序列化操作。 (5)第五步,最后将这些记录写到 HDFS 中,在写入到 HDFS 的过程中,同样会使用 Sqoop 生成的类进行反序列化。

7.2、Sqoop 导出原理

Sqoop 进行数据导出,总体也是基于 mapreduce 任务。 下面先看图: 在这里插入图片描述 详细文字描述: (1)第一步,sqoop 依然会通过 JDBC 访问关系型数据库,得到需要导出数据的元数据信息。 (2)第二步,根据获取到的元数据的信息,sqoop 生成一个 Java 类,用来进行数据的传输载体。该类必须实现序列化和反序列化。 (3)第三步,启动 mapreduce 作业。 (4)第四步,sqoop 利用生成的这个 java 类,并行的从 hdfs 中读取数据。 (5)第五步,每个 map 作业都会根据读取到的导出表的元数据信息和读取到的数据,生成一批 insert 语句,然后多个 map 作业会并行的向数据库 mysql 中插入数据,所以,数据是从 hdfs 中并行的进行读取,也是并行的进入写入,那并行的读取是依赖 hdfs 的性能,而并行的写入到 mysql 中,那就要依赖于 mysql 的写入性能了。

8、资料

Sqoop 详细可以参照我学习的其余大佬的博客: http://blog.csdn.net/zhongqi2513/article/details/52777727 http://blog.csdn.net/zhongqi2513/article/details/53281255

当然最重要的是官网文档: http://sqoop.apache.org/docs/



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3