Mysql 与 hadoop 数据同步(迁移),你须要知道 Sqoop

上篇文章 Mysql 到 Hbase 数据如何实时同步,强大的 Streamsets 告诉你 咱们说到了如何使用 Streamsets 来进行 mysql 到 hbase 的数据实时同步(迁移)。使用 Streamsets 的优势是部署简单,配置灵活,无需编写代码。mysql

认真阅读上篇文章的朋友会发现,Streamsets 可以实时跟踪数据的变化,将数据同步更新到 hbase 中。可是对于历史数据(而且数据不改动的记录)的同步,文章中并无说起到。固然,并非由于 Streamsets 不能从事这些事情,而是笔者暂时没有使用它来进行历史数据的迁移。所以,对于历史数据的迁移,笔者今天来介绍另一个工具 - Sqoop。相对于 Streamsets,你们应该更加熟悉 Sqoop。sql

若是你工做中须要将关系型数据库(Mysql、Oracle等等)中的数据同步到 hadoop(HDFS、hive、hbase) 中,或者将 hadoop 中的数据同步到关系型数据库中,那这篇文章应该能帮助到你。shell

注:Streamsets 以及 Sqoop 都属于数据同步、迁移方面比较流行的解决方案,相似的工具还有不少,好比 Datax、kettle 等等,从事数据方面工做的朋友能够去多多了解,找到适合本身工做场景的方案。数据库

认识一下

Sqoop 的命名,仔细一看是否是有点像 sql 和 hadoop 两个词语的拼接产物。其实从它的命名来看也就很明显:它是用来将关系型数据库和 Hadoop 中的数据进行相互转移的工具,而且这种转换是双向的。看下图就能一目了然: apache

从关系型数据库到 hadoop 咱们称之为 import,从 hadoop 到关系型数据库咱们称之为 export。文章后面你们就会看到 "import"、"export" 对应命令的两个模式。api

安装

对于 Sqoop 的安装,这里就不作介绍了,网上有不少的教程,由于是一个工具,因此安装起来也是很方便简单。须要注意的是 Sqoop 有两个大的版本:Sqoop一、Sqoop2。安全

访问 Sqoop 官网 ,官网上的 1.4.x 的为 Sqoop1, 1.99.* 为 Sqoop2。bash

关于 Sqoop1 与 Sqoop2 的区别,通俗来说就是:并发

  1. sqoop1 只是一个客户端工具,Sqoop2 加入了 Server 来集中化管理链接器
  2. Sqoop1 经过命令行来工做,工做方式单一,Sqoop2 则有更多的方式来工做,好比 REST api接口、Web 页
  3. Sqoop2 加入权限安全机制

对于笔者来讲,Sqoop 就是一个同步工具,命令行足够知足工做需求,而且大部分数据同步都是在同一个局域网内部(也就没有数据安全之类问题),因此选择的是 Sqoop1(具体版本是 1.4.6)oracle

框架原理

经过上图能够看出, Sqoop Client 经过 shell 命令来使用 sqoop, sqoop 中的 Task Translater 将命令转换成 hadoop 中的 mapreduce 任务进行具体的数据操做。能够这样理解,例如 Mysql 中某个表数据同步到 hadoop 这个场景,Sqoop 会将表记录分红多份,每份分到各自 mapper 中去进行落地 hadoop(保证同步效率)。你们可能发现,其实这里的 mapreduce 没有 reduce,只有 map。

实操

了解了 Sqoop 是什么,能作什么以及大概的框架原理,接下来咱们直接使用 Sqoop 命令来感觉一下使用 Sqoop 是如何简单及有效。本文案例中的关系型数据库使用的是 mysql,oracle 以及其余使用 jdbc 链接的关系型数据库操做相似,差异不大。

运行 sqoop help 能够看到 Sqoop 提供了哪些操做,以下图

这些操做其实都会一一对应到 sqoop bin 目录下的一个个可运行脚本文件,若是想了解细节,能够打开这些脚本进行查看

工做中通常经常使用的几个操做或者命令以下:

  1. list-databases : 查看有哪些数据库
  2. list-tables : 查看数据库中有哪些表
  3. import : 关系型数据库到 hadoop 数据同步
  4. export : hadoop 到关系型数据库数据同步
  5. version :查看 Sqoop 版本

列出数据库

sqoop list-databases --connect jdbc:mysql://192.168.1.123:3306/ --username root --password 12345678
复制代码

列出表

sqoop list-databases --connect jdbc:mysql://192.168.1.123:3306/databasename --username root --password 12345678
复制代码

mysql 到 hdfs

sqoop import
--connect jdbc:mysql://192.168.1.123:3306/databasename
--username root
--password 12345678
--table tablename
--target-dir /hadoopDir/
--fields-terminalted-by '\t'
-m 1
--check-column id
--last-value num
--incremental append
复制代码

--connect : 数据库的 JDBC URL,后面的 databasename 想要链接的数据库名称

--table : 数据库表

--username : 数据库用户名

--password : 数据库密码

--target-dir : HDFS 目标目录

--fields-terminated-by :数据导入后每一个字段之间的分隔符

-m :mapper 的并发数量

--check-column : 指定增量导入时的参考列,这里是 id (主键)

--last-value : 上一次导入的最后一个值

--incremental append :导入方式为增量

注意:工做中须要增量同步的场景下,咱们就可使用 --incremental append 以及 --last-value。好比这里咱们使用 id 来做为参考列,若是上次同步到了 1000, 此次咱们想只同步新的数据,就能够带上参数 --last-value 1000。

mysql 到 hive

使用 imort --create-hive-table

sqoop import 
--create-hive-table 
-m 1 
--connect jdbc:mysql://192.168.1.123:3306/databasename
--username root 
--password 12345678 
--table tablename
--hive-import 
--hive-database databasename_hive 
--hive-overwrite 
--hive-table tablename_hive
复制代码

mysql 到 hbase

hbase shell
create_namespace 'database_tmp'
create 'database_tmp:table_tmp','info'

sqoop import 
--connect jdbc:mysql://192.168.1.123:3306/databasename
--username 'root' 
--password '12345678' 
--table 'tablename' 
--hbase-table 'database_tmp:table_tmp' 
--hbase-row-key 'id' 
--column-family 'info'
复制代码

首先进入 hbase shell,建立好 namespace 以及 数据库。database_tmp 位命名空间,table_tmp 为数据库。

hdfs 到 mysql

sqoop export
--connect jdbc:mysql://192.168.1.123:3306/databasename
--username root
--password '12345678' 
--table tablename
--m 1
--export-dir /hadoopDir/
--input-fields-terminated-by '\t'
--columns="column1,column2"
复制代码

--columns : 制定导出哪些列

hive 到 mysql

了解 hive 的朋友都知道,hive 的真实数据其实就是 hdfs 磁盘上的数据,因此 hive 到 mysql 的同步操做与 hdfs 到 mysql 的操做相似

hbase 到 mysql

目前 Sqoop 没有提供直接将 hbase 数据同步到 mysql 的操做

总结: 在 sql to hadoop 和 hadoop to sql 这种数据同步场景,Sqoop 是一个颇有效且灵活的工具,你们不妨使用它来从事数据方面的工做。

相关文章
相关标签/搜索