【Hadoop离线基础总结】Sqoop数据迁移
目录
Sqoop介绍
概述
Sqoop是Apache开源提供过的一款Hadoop和关系数据库服务器之间传送数据的工具。从关系数据库到Hadoop的数据库存储系统(HDFS,HIVE,HBASE等)称为导入,从Hadoop的数据库存储系统到关系数据库称为导出。
Sqoop主要是通过MapReduce的InputFormat和OutputFormat来实现数据的输入和输出,底层执行的MapReduce任务只有Map阶段,没有Reduce阶段,也就是说只是单纯地将数据从一个地方抽取到另一个地方。版本
Sqoop有两个大版本:
Sqoop 1.x 不用安装,解压就能用
Sqoop 2.x 架构发生了变化,引入了一个服务端,可以通过代码提交sqoop的任务
一般情况下用Sqoop 1.x更多一些,只需要将命令写到脚本中,执行脚本即可
Sqoop安装及使用
Sqoop安装
1.下载并解压
下载地址:http://archive.cloudera.com/cdh5/cdh/5/
这里使用的是sqoop1的版本,并且要和hadoop版本相对应,都是5.14.0
将安装包上传到/export/softwares
目录中
tar -zxvf sqoop-1.4.6-cdh5.14.0.tar.gz -C ../servers/
解压
2.修改配置文件
cd /export/servers/sqoop-1.4.6-cdh5.14.0/conf/
cp sqoop-env-template.sh sqoop-env.sh
sqoop-env-template.sh是sqoop给的配置模板,所以最好复制一份出来
vim sqoop-env.sh
因为这里只用到Hadoop和Hive,所以只需要配置这两个的路径即可
3.加入额外的依赖包
需要在Sqoop的lib目录下加入一个mysql的依赖包,一个java-json的依赖包,否则就会报错
4.验证启动
cd /export/servers/sqoop-1.4.6-cdh5.14.0
bin/sqoop-version
Sqoop数据导入
首先可以用命令行查看帮助
bin/sqoop help
Available commands:
可用命令: codegen Generate code to interact with database records
生成与数据库记录交互的代码 create-hive-table Import a table definition into Hive
将表定义导入到Hive中 eval Evaluate a SQL statement and display the results
计算一个SQL语句并显示结果 export Export an HDFS directory to a database table
将HDFS目录导出到数据库表 help List available commands
罗列出可用的命令 import Import a table from a database to HDFS
将一个表从数据库导入到HDFS import-all-tables Import tables from a database to HDFS
将一些表从数据库导入到HDFS import-mainframe Import datasets from a mainframe server to HDFS
从大型机服务器导入数据集到HDFS job Work with saved jobs
用保存的jobs继续工作 list-databases List available databases on a server
列出服务器上可用的数据库 list-tables List available tables in a database
列出数据库中可用的表 merge Merge results of incremental imports
增量导入的合并结果 metastore Run a standalone Sqoop metastore
运行一个独立的Sqoop metastore version Display version information
显示版本信息
1.列出本地主机所有的数据库,可以用
bin/sqoop listdabases --help
查看帮助
2.bin/sqoop list-databases --connect jdbc:mysql://192.168.0.106:3306/ --username root --password 自己数据库的密码
显示数据库
java.sql.SQLException: null, message from server: "Host ‘192.168.0.30’ is not allowed to connect to this MySQL server"
注意:如果出现这种异常,需要给自己连接的mysql授予远程连接权限
3.bin/sqoop list-tables --connect jdbc:mysql://192.168.0.106:3306/userdb --username root --password 123456
显示数据库中的表
4.bin/sqoop import --connect jdbc:mysql://192.168.0.106:3306/userdb --username root --password 123456 --table emp --m 1
将mysql数据库userdb中的emp表导入到hdfs中(--table
指要选择哪个表,--m
指MapTask的个数)
5.bin/sqoop import --connect jdbc:mysql://192.168.0.106:3306/userdb --username root --password 123456 --table emp --delete-target-dir --target-dir /sqoop/emp --m 1
将emp表导入到hdfs指定文件夹(--delete-target-dir
判断导出目录是否存在,如果存在就删除--target-dir
指定导出目录)
6.bin/sqoop import --connect jdbc:mysql://192.168.0.106:3306/userdb --table emp --delete-target-dir --target-dir /sqoop/emp2 --username root --password 123456 --fields-terminated-by '\t' --m 1
指定分隔符
导入关系表到Hive已有表中
1.想要将mysql中的表数据直接导入到Hive,必须先将Hive下lib目录中的一个jar包
hive-exec-1.1.0-cdh5.14.0.jar
复制到sqoop的lib目录下cp /export/servers/hive-1.1.0-cdh5.14.0/lib/hive-exec-1.1.0-cdh5.14.0.jar /export/servers/sqoop-1.4.6-cdh5.14.0/lib/
2.然后现在hive中创建一个sqooptohive
的数据库,并在其中创建一个用来存放数据的表
CREATE DATABASE sqooptohive;
USE sqooptohive;
CREATE EXTERNAL TABLE emp_hive(
id INT,
name STRING,
deg STRING,
salary INT,
dept STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\001';
3.
bin/sqoop import --connect jdbc:mysql://192.168.0.106:3306/userdb --table emp --delete-target-dir --target-dir /sqoop/emp2 --fields-terminated-by '\001' --username root --password 123456 --hive-import --hive-table sqooptohive.emp_hive --hive-overwrite --m 1
从mysql向hive导入表数据(--hive-overwrite
表示如果有重名的表,则覆盖掉)
遇到一个报错
原因是因为在/etc/profile中没有配置hive的环境变量,到/etc/profile/下添加两行
配置完成后一定记得source /etc/profile
生效
导入关系表到Hive(自动创建Hive表)
bin/sqoop import --connect jdbc:mysql://192.168.0.106:3306/userdb --table emp-conn --username root -password 123456 --hive-import --hive-database sqooptohive --m 1
将关系表子集导入到HDFS中
bin/sqoop import --connect jdbc:mysql://192.168.0.106:3306/userdb --table emp_add --delete-target-dir --target-dir /sqoop/emp_add --username root --password 123456 --where "city='sec-bad'" --m 1
sql语句查找导入到HDFS
bin/sqoop import --connect jdbc:mysql://192.168.0.106:3306/userdb --delect-target-dir --target-dir /sqoop/emp_conn --username root --password 123456 --query 'select phon from emp_conn where 1=1 and $CONDITIONS' --m 1
使用sql语句查询首先不能有--table
,其次--query
后面跟着的sql语句必须用单引号,必须要有where条件,没有筛选条件就用WHERE 1=1
,后面必须跟一个$CONDITIONS
字符串
两种增量导入方式
实际工作中,很少有需要将整张表的数据导入到Hive或者HDFS,一般只需要导入增量数据。增量导入是仅导入新添加的表中的行的技术。一般情况下,每个数据表都会有三个固定字段:create_time,update_time,is_delete。可以根据创建时间和更新时间来解决增量导入数据的需求
Sqoop也考虑到了这种情况,提供了三个参数来帮助实现增量导入:
--incremental <mode>
--check-column <column name>
--last value <last check column value>
1.第一种增量方式
需求:导入emp表当中id大于1202的所有数据
bin/sqoop import --connect jdbc:mysql://192.168.0.106:3306/userdb --table emp --target-dir /sqoop/increment --incremental append --check-column id --last-value 1202 --username root --password 123456 --m 1
增量导入的时候,一定不能加参数–delete-target-dir,否则会报错。--incremental
有两种mode:append \ lastmodified。--check-column
需要的值是用来做增量导入判断的列名(字段名)。--last-value
是指定某一个值,用于标记增量导入的位置。
2.第二种增量方式
需求:导入emp表中创建时间在2020.3.7且is_delete=1的数据
bin/sqoop import --connect jdbc:mysql://192.168.0.106/userdb --table emp --target-dir /sqoop/increment2 --incremental append --where "create_time > '2020-3-7 00:00:00' and create_time < '2020-3-7 23:59:59' and is_delete = '1'" --check-column id --username root --password 123456 --m 1
本来想的有了where来查询就可以不用--check-column
参数,没想到只要是增量导入就必须要有这个参数
3.思考一下如何解决减量数据的需求?
减量数据的删除是假删除,不是真删除,其实就是改变了数据的状态,数据的更新时间也会同步改变。所以解决减量数据实际上就涉及到了数据的变更问题,只要变更数据,update_time也会发生改变
更新数据的时候,就是要根据create_time和update_time一起来判断,只要符合其中任意一项就将数据导入到Hive或者HDFS上,那么就有可能出现两条id相同,create_time相同的数据,比如id create_time update_time
1 2020-1-3 12:12:12 2020-1-3 12:12:12
1 2020-1-3 12:12:12 2020-1-13 12:12:12
可以用group by id进行分组,将id相同的分到一组,取update_time最新的数据
Sqoop的数据导出
bin/sqoop export --connect jdbc:mysql://192.168.0.106:3306/userdb --table emp_out --export-dir /sqoop/emp --input-fields-terminated-by ',' --username root --password 123456
【Hadoop离线基础总结】Sqoop数据迁移的更多相关文章
- 【Hadoop离线基础总结】Sqoop常用命令及参数
目录 常用命令 常用公用参数 公用参数:数据库连接 公用参数:import 公用参数:export 公用参数:hive 常用命令&参数 从关系表导入--import 导出到关系表--expor ...
- 【Hadoop离线基础总结】Hue的简单介绍和安装部署
目录 Hue的简单介绍 概述 核心功能 安装部署 下载Hue的压缩包并上传到linux解压 编译安装启动 启动Hue进程 hue与其他框架的集成 Hue与Hadoop集成 Hue与Hive集成 Hue ...
- sqoop 数据迁移
sqoop 数据迁移 1 概述 sqoop是apache旗下一款“Hadoop和关系数据库服务器之间传送数据”的工具. 导入数据:MySQL,Oracle导入数据到Hadoop的HDFS.HIVE.H ...
- 【Hadoop离线基础总结】impala简单介绍及安装部署
目录 impala的简单介绍 概述 优点 缺点 impala和Hive的关系 impala如何和CDH一起工作 impala的架构及查询计划 impala/hive/spark 对比 impala的安 ...
- 【Hadoop离线基础总结】流量日志分析网站整体架构模块开发
目录 数据仓库设计 维度建模概述 维度建模的三种模式 本项目中数据仓库的设计 ETL开发 创建ODS层数据表 导入ODS层数据 生成ODS层明细宽表 统计分析开发 流量分析 受访分析 访客visit分 ...
- 【Hadoop离线基础总结】Hive调优手段
Hive调优手段 最常用的调优手段 Fetch抓取 MapJoin 分区裁剪 列裁剪 控制map个数以及reduce个数 JVM重用 数据压缩 Fetch的抓取 出现原因 Hive中对某些情况的查询不 ...
- 【Hadoop离线基础总结】oozie的安装部署与使用
目录 简单介绍 概述 架构 安装部署 1.修改core-site.xml 2.上传oozie的安装包并解压 3.解压hadooplibs到与oozie平行的目录 4.创建libext目录,并拷贝依赖包 ...
- sqoop数据迁移(基于Hadoop和关系数据库服务器之间传送数据)
1:sqoop的概述: (1):sqoop是apache旗下一款“Hadoop和关系数据库服务器之间传送数据”的工具.(2):导入数据:MySQL,Oracle导入数据到Hadoop的HDFS.HIV ...
- sqoop数据迁移
3.1 概述 sqoop是apache旗下一款“Hadoop和关系数据库服务器之间传送数据”的工具. 导入数据:MySQL,Oracle导入数据到Hadoop的HDFS.HIVE.HBASE等数据存储 ...
随机推荐
- vue的组件通讯
Vue的组件通讯又称组件传值 一.父子组件传值: 父组件: <子组件名 :动态变量名 (随便起)='你想要传递的数据' ></子组件名> 子组件: 利用 prop去接收父组 ...
- 忍不住还是手写了一遍博客的css
F12边调边改,的一点一点撸出来这个效果.感觉已经可以了.日历感觉没什么用直接隐藏了.
- Python父类和子类关系/继承
#!/usr/bin/env python # -*- coding: utf-8 -*- """ @File:继承_子类和父类的关系.py @E-mail:364942 ...
- @SessionAttributes 的使用
@SessionAttributes 注解只用作用在 类 上,作用是将指定的 Model 的键值对保存在 session 中.可以让其他请求共用 session 中的键值对. 指定保存的属性名 作用是 ...
- C++基础 学习笔记五:重载之运算符重载
C++基础 学习笔记五:重载之运算符重载 什么是运算符重载 用同一个运算符完成不同的功能即同一个运算符可以有不同的功能的方法叫做运算符重载.运算符重载是静态多态性的体现. 运算符重载的规则 重载公式 ...
- CentOS7.7下二进制部署MySQL多版本多实例实战
第一章 需求说明 部署MySQL5.7的三个多实例环境(端口分别为3307,3308,3309) 部署MySQL5.6和8.0版本数据库实例((端口分别为3316和3326) 第二章 环境准备 1.虚 ...
- python之pymysql库连接mysql实现增、删、改、查
安装第三方库pymysql 命令行cmd下通过pip install pymysql进行安装,安装完成后自行pip list可查看对应的版本信息 建立连接 1 #导入pymysql库 2 import ...
- 使用RNN对文本进行分类实践电影评论
本教程在IMDB大型影评数据集 上训练一个循环神经网络进行情感分类. from __future__ import absolute_import, division, print_function, ...
- 关于MySQL数据库存储过程的感想
以下只是学习路上的浅薄感想,如理解有所偏差,还请有识之士指正! 一.存储过程意义理解 关于存储过程,我的理解是对数据库语言进行编程调用,就像Java代码类编程写一个具有某种特定功能的方法去进行调用一样 ...
- 随笔之——伪类选择器:nth-child(n) 与 nth-of-type(n)的区别!!!
话不多说!直接正题!!! 一.E:nth-child(n)///选中父元素中第(n)个元素.若第n个元素为E则选中:若第n个不为E则不选中.n可以为2n(偶数).2n+1(奇数).等... 二.E:n ...