Mysql 与 hadoop 数据同步(迁移),你需要知道 Sqoop
sinye56 2024-09-22 08:34 2 浏览 0 评论
上篇文章 Mysql 到 Hbase 数据如何实时同步,强大的 Streamsets 告诉你 我们说到了如何使用 Streamsets 来进行 mysql 到 hbase 的数据实时同步(迁移)。使用 Streamsets 的优点是部署简单,配置灵活,无需编写代码。
认真阅读上篇文章的朋友会发现,Streamsets 能够实时跟踪数据的变化,将数据同步更新到 hbase 中。但是对于历史数据(并且数据不改动的记录)的同步,文章中并没有提及到。当然,并不是因为 Streamsets 不能从事这些事情,而是笔者暂时没有使用它来进行历史数据的迁移。因此,对于历史数据的迁移,笔者今天来介绍另外一个工具 - Sqoop。相对于 Streamsets,大家应该更加熟悉 Sqoop。
如果你工作中需要将关系型数据库(Mysql、Oracle等等)中的数据同步到 hadoop(HDFS、hive、hbase) 中,或者将 hadoop 中的数据同步到关系型数据库中,那这篇文章应该能帮助到你。
注:Streamsets 以及 Sqoop 都属于数据同步、迁移方面比较流行的解决方案,类似的工具还有很多,比如 Datax、kettle 等等,从事数据方面工作的朋友可以去多多了解,找到适合自己工作场景的方案。
认识一下
Sqoop 的命名,仔细一看是不是有点像 sql 和 hadoop 两个词语的拼接产物。其实从它的命名来看也就很明显:它是用来将关系型数据库和 Hadoop 中的数据进行相互转移的工具,并且这种转换是双向的。看下图就能一目了然:
从关系型数据库到 hadoop 我们称之为 import,从 hadoop 到关系型数据库我们称之为 export。文章后面大家就会看到 "import"、"export" 对应命令的两个模式。
安装
对于 Sqoop 的安装,这里就不做介绍了,网上有很多的教程,因为是一个工具,所以安装起来也是很方便简单。需要注意的是 Sqoop 有两个大的版本:Sqoop1、Sqoop2。
访问 Sqoop 官网 ,官网上的 1.4.x 的为 Sqoop1, 1.99.* 为 Sqoop2。
关于 Sqoop1 与 Sqoop2 的区别,通俗来讲就是:
- sqoop1 只是一个客户端工具,Sqoop2 加入了 Server 来集中化管理连接器
- Sqoop1 通过命令行来工作,工作方式单一,Sqoop2 则有更多的方式来工作,比如 REST api接口、Web 页
- Sqoop2 加入权限安全机制
对于笔者来说,Sqoop 就是一个同步工具,命令行足够满足工作需求,并且大部分数据同步都是在同一个局域网内部(也就没有数据安全之类问题),所以选择的是 Sqoop1(具体版本是 1.4.6)
框架原理
通过上图可以看出, 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 目录下的一个个可运行脚本文件,如果想了解细节,可以打开这些脚本进行查看
工作中一般常用的几个操作或者命令如下:
- list-databases : 查看有哪些数据库
- list-tables : 查看数据库中有哪些表
- import : 关系型数据库到 hadoop 数据同步
- export : hadoop 到关系型数据库数据同步
- 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
--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 以及 数据库。databasetmp 位命名空间,tabletmp 为数据库。
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 是一个很有效且灵活的工具,大家不妨使用它来从事数据方面的工作。
相关推荐
- RHEL8和CentOS8怎么重启网络
-
本文主要讲解如何重启RHEL8或者CentOS8网络以及如何解决RHEL8和CentOS8系统的网络管理服务报错,当我们安装好RHEL8或者CentOS8,重启启动网络时,会出现以下报错:...
- Linux 内、外网双网卡路由配置
-
1.路由信息的影响Linux系统中如果有多张网卡的情况下,如果路由信息配置不正确,...
- Linux——centos7修改网卡名
-
修改网卡名这个操作可能平时用不太上,可作为了解。修改网卡默认名从ens33改成eth01.首先修改网卡配置文件名(建议将原配置文件进行备份)...
- CentOS7下修改网卡名称为ethX的操作方法
-
?Linux操作系统的网卡设备的传统命名方式是eth0、eth1、eth2等,而CentOS7提供了不同的命名规则,默认是基于固件、拓扑、位置信息来分配。这样做的优点是命名全自动的、可预知的...
- Linux 网卡名称enss33修改为eth0
-
一、CentOS修改/etc/sysconfig/grub文件(修改前先备份)为GRUB_CMDLINE_LINUX变量增加2个参数(net.ifnames=0biosdevname=0),修改完成...
- CentOS下双网卡绑定,实现带宽飞速
-
方式一1.新建/etc/sysconfig/network-scripts/ifcfg-bond0文件DEVICE=bond0IPADDR=191.3.60.1NETMASK=255.255.2...
- linux 双网卡双网段设置路由转发
-
背景网络情况linux双网卡:网卡A(ens3)和网卡B(...
- Linux-VMware设置网卡保持激活
-
Linux系统只有在激活网卡的状态下才能去连接网络,进行网络通讯。修改配置文件(永久激活网卡)...
- VMware虚拟机三种网络模式
-
01.VMware虚拟机三种网络模式由于linux目前很热门,越来越多的人在学习linux,但是买一台服务放家里来学习,实在是很浪费。那么如何解决这个问题?虚拟机软件是很好的选择,常用的虚拟机软件有v...
- 2023年最新版 linux克隆虚拟机 解决网卡uuid重复问题
-
问题描述1、克隆了虚拟机,两台虚拟机里面的ip以及网卡的uuid都是一样的2、ip好改,但是uuid如何改呢?解决问题1、每台主机应该保证网卡的UUID是唯一的,避免后面网络通信有问题...
- Linux网卡的Vlan配置,你可能不了解的玩法
-
如果服务器上连的交换机端口已经预先设置了TRUNK,并允许特定的VLAN可以通过,那么服务器的网卡在配置时就必须指定所属的VLAN,否则就不通了,这种情形在虚拟化部署时较常见。例如在一个办公环境中,办...
- Centos7 网卡绑定
-
1、切换到指定目录#备份网卡数据cd/etc/sysconfig/network-scriptscpifcfg-enp5s0f0ifcfg-enp5s0f0.bak...
- Linux搭建nginx+keepalived 高可用(主备+双主模式)
-
一:keepalived简介反向代理及负载均衡参考:...
- Linux下Route 路由指令使用详解
-
linuxroute命令用于显示和操作IP路由表。要实现两个不同子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现。在Linux系统中,设置路由通常是为了解决以下问题:该...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle忘记用户名密码 (59)
- oracle11gr2安装教程 (55)
- mybatis调用oracle存储过程 (67)
- oracle spool的用法 (57)
- oracle asm 磁盘管理 (67)
- 前端 设计模式 (64)
- 前端面试vue (56)
- linux格式化 (55)
- linux图形界面 (62)
- linux文件压缩 (75)
- Linux设置权限 (53)
- linux服务器配置 (62)
- mysql安装linux (71)
- linux启动命令 (59)
- 查看linux磁盘 (72)
- linux用户组 (74)
- linux多线程 (70)
- linux设备驱动 (53)
- linux自启动 (59)
- linux网络命令 (55)
- linux传文件 (60)
- linux打包文件 (58)
- linux查看数据库 (61)
- linux获取ip (64)
- linux进程通信 (63)