Hadoop学习笔记—18.Sqoop框架学习
一、Sqoop基础:连接关系型数据库与Hadoop的桥梁
1.1 Sqoop的基本概念
Hadoop正成为企业用于大数据分析的最热门选择,但想将你的数据移植过去并不容易。Apache Sqoop正在加紧帮助客户将重要数据从数据库移到Hadoop。随着Hadoop和关系型数据库之间的数据移动渐渐变成一个标准的流程,云管理员们能够利用Sqoop的并行批量数据加载能力来简化这一流程,降低编写自定义数据加载脚本的需求。
Apache Sqoop(SQL-to-Hadoop) 项目旨在协助 RDBMS 与 Hadoop 之间进行高效的大数据交流。用户可以在 Sqoop 的帮助下,轻松地把关系型数据库的数据导入到 Hadoop 与其相关的系统 (如HBase和Hive)中;同时也可以把数据从 Hadoop 系统里抽取并导出到关系型数据库里。因此,可以说Sqoop就是一个桥梁,连接了关系型数据库与Hadoop。
1.2 Sqoop的基本机制
Sqoop中一大亮点就是可以通过hadoop的mapreduce把数据从关系型数据库中导入数据到HDFS。Sqoop架构非常简单,其整合了Hive、Hbase和Oozie,通过map-reduce任务来传输数据,从而提供并发特性和容错。Sqoop的基本工作流程如下图所示:
Sqoop在import时,需要制定split-by参数。Sqoop根据不同的split-by参数值来进行切分,然后将切分出来的区域分配到不同map中。每个map中再处理数据库中获取的一行一行的值,写入到HDFS中(由此也可知,导入导出的事务是以Mapper任务为单位)。同时split-by根据不同的参数类型有不同的切分方法,如比较简单的int型,Sqoop会取最大和最小split-by字段值,然后根据传入的num-mappers来确定划分几个区域。 比如select max(split_by),min(split-by) from得到的max(split-by)和min(split-by)分别为1000和1,而num-mappers为2的话,则会分成两个区域(1,500)和(501-100),同时也会分成2个sql给2个map去进行导入操作,分别为select XXX from table where split-by>=1 and split-by<500和select XXX from table where split-by>=501 and split-by<=1000。最后每个map各自获取各自SQL中的数据进行导入工作。
二、Sqoop实践:MySQL->HDFS/HDFS->MySQL
2.1 Sqoop的安装配置
(1)下载sqoop安装包:这里使用的是1.4.3版本,已经上传至网盘中(http://pan.baidu.com/s/1pJ7gfxh)
(2)解压sqoop安装包:tar -zvxf sqoop-1.4.3.bin__hadoop-1.0.0.tar.gz
(3)设置环境变量:vim /etc/profile ,增加以下内容
export SQOOP_HOME=/usr/local/sqoop
export PATH=.:$HADOOP_HOME/bin:$SQOOP_HOME/bin:$HIVE_HOME/bin:$PIG_HOME/bin:$HBASE_HOME/bin:$ZOOKEEPER_HOME/bin:$JAVA_HOME/bin:$PATH
最后是环境变量生效:source /etc/profile
(4)将mysql的jdbc驱动mysql-connector-java-5.1.10.jar复制到sqoop项目的lib目录下:
cp mysql-connector-java-5.1.10.jar /usr/local/sqoop/lib
(5)重命名配置文件:在${SQOOP_HOME}/conf中执行命令
mv sqoop-env-template.sh sqoop-env.sh
(6)【可选】修改配置文件:vim sqoop-env.sh
#Set path to where bin/hadoop is available
export HADOOP_COMMON_HOME=/usr/local/hadoop/
#Set path to where hadoop-*-core.jar is available
export HADOOP_MAPRED_HOME=/usr/local/hadoop
#set the path to where bin/hbase is available
exportHBASE_HOME=/usr/local/hbase
#Set the path to where bin/hive is available
export HIVE_HOME=/usr/local/hive
#Set the path for where zookeper config dir is
export ZOOCFGDIR=/usr/local/zookeeper
2.2 数据导入:MySQL->HDFS
这里假设我们已经在hadoop-master服务器中安装了MySQL数据库服务,并使用默认端口3306。需要注意的是,sqoop的数据库驱动driver默认只支持mysql和oracle,如果使用sqlserver的话,需要把sqlserver的驱动jar包放在sqoop的lib目录下,然后才能使用drive参数。
(1)MySQL数据源:mysql中的hive数据库的TBLS表,这里使用学习笔记17《Hive框架学习》里边Hive的数据库表。
(2)使用import命令将mysql中的数据导入HDFS:
首先看看import命令的基本格式:
sqoop ##sqoop命令
import ##表示导入
--connect jdbc:mysql://ip:3306/sqoop ##告诉jdbc,连接mysql的url
--username root ##连接mysql的用户名
--password admin ##连接mysql的密码
--table mysql1 ##从mysql导出的表名称
--fields-terminated-by '\t' ##指定输出文件中的行的字段分隔符
-m 1 ##复制过程使用1个map作业
--hive-import ##把mysql表数据复制到hive空间中。如果不使用该选项,意味着复制到hdfs中
然后看看如何进行实战:这里将mysql中的TBLS表导入到hdfs中(默认导入目录是/user/<username>)
sqoop import --connect jdbc:mysql://hadoop-master:3306/hive --username root --password admin --table TBLS --fields-terminated-by '\t'
最后看看是否成功导入了HDFS中:可以看到TBLS表存入了多个map任务所生成的文件中
(3)刚刚看到了默认是由多个map来进行处理生成,可以设置指定数量的map任务。又由于sqoop默认不是追加方式写入,还可以设置其为追加方式写入已有文件末尾:
sqoop import --connect jdbc:mysql://hadoop0:3306/hive --username root --password admin --table TBLS --fields-terminated-by '\t' --null-string '**' -m 1 --append
(4)还可以将MySQL中的数据导入Hive中(你设定的hive在hdfs中的存储位置,我这里是/hive/):
首先得删掉刚刚导入到hdfs中的文件数据:
hadoop fs -rmr /user/root/*
然后再通过以下命令导入到hive中:
sqoop import --connect jdbc:mysql://hadoop-master:3306/hive --username root --password admin --table TBLS --fields-terminated-by '\t' -m 1 --append --hive-import
最后看看是否导入到了hive目录(/hive/)中:
(5)还可以对指定数据源进行增量导入:所谓增量打入,就是导入上一次导入后数据源新增的那部分数据,例如:上次导入的数据是id从1~100的数据,那么这次就只导入100以后新增的数据,而不必整体导入,节省了导入时间。下面的命令以TBL_ID字段作为判断标准采用增量导入,并记录上一次的最后一个记录是6,只导入6以后的数据即可。
sqoop import --connect jdbc:mysql://hadoop0:3306/hive --username root --password admin --table TBLS --fields-terminated-by '\t' --null-string '**' -m 1 --append --hive-import --check-column 'TBL_ID' --incremental append --last-value 6
2.3 数据导出:HDFS->MySQL
(1)既然要导出到MySQL,那么首先得要有一张接收从HDFS导出数据的表。这里为了示范,只创建一个最简单的数据表TEST_IDS,只有一个int类型的ID字段。
(2)使用export命令进行将数据从HDFS导出到MySQL中,可以看看export命令的基本格式:
sqoop
export ##表示数据从hive复制到mysql中
--connect jdbc:mysql://ip:3306/sqoop ##告诉jdbc,连接mysql的url
--username root ##连接mysql的用户名
--password admin ##连接mysql的密码
--table mysql2 ##mysql中的表,即将被导入的表名称
--export-dir '/user/root/warehouse/mysql1' ##hive中被导出的文件目录
--fields-terminated-by '\t' ##hive中被导出的文件字段的分隔符
注意:导出的数据表必须是事先存在的
(3)准备一个符合数据表规范的文件ids并上传到HDFS中,作为导出到MySQL的数据源:这个ids里边只有10个数字
(4)export实战:将HDFS中的ids导出到mysql中的TEST_IDS数据表中
sqoop export --connect jdbc:mysql://hadoop-master:3306/hive --username root --password admin --table TEST_IDS --fields-terminated-by '\t' --export-dir '/testdir/input/ids'
最后查看是否导入到了mysql中的TEST_IDS数据表中:
2.4 创建job,运行job
刚刚我们使用了import和export命令进行了常规的导入导出操作,但是每次都要我们使用那么长的命令不太容易记忆。于是,我们可以将其创建为一个job,每次需要使用时只需要记住job名,运行job即可。
这里以导入为例,创建一个job名为myjob1的job:
sqoop job --create myjob1 -- import --connect jdbc:mysql://hadoop-master:3306/hive --username root --password admin --table TBLS --fields-terminated-by '\t' -m 1 --append
可以通过命令查看是否存在job:sqoop job --list
执行刚刚创建的job:
sqoop job --exec myjob1
但是,我们发现上面的设置后还需要我们输入密码,这样便无法做到真正的自动执行job。
于是,我们做一点小小的配置(hive-site.xml)修改:将下面的xml配置的注释移除即可
<!-- -->
<property>
<name>sqoop.metastore.client.record.password</name>
<value>true</value>
<description>If true, allow saved passwords in the metastore.
</description>
</property>
移除之后,还需要将刚刚那个job删除掉,重新创建job后才可以无密码自动执行。
sqoop job --delete myjob1
sqoop job --create myjob1 -- import --connect jdbc:mysql://hadoop-master:3306/hive --username root --password admin --table TBLS --fields-terminated-by '\t' -m 1 --append
sqoop job --exec myjob1
参考资料
(1)吴超,《Sqoop的安装与使用》:http://www.superwu.cn/2013/08/12/444/
(2)谈翔,《Apache Sqoop:云端大数据分析的关键一环》:http://www.searchcloudcomputing.com.cn/showcontent_86735.htm
(3)标点符,《Hadoop数据传输工具:Sqoop》:http://www.biaodianfu.com/sqoop.html
Hadoop学习笔记—18.Sqoop框架学习的更多相关文章
- Hadoop学习笔记—15.HBase框架学习(基础知识篇)
HBase是Apache Hadoop的数据库,能够对大型数据提供随机.实时的读写访问.HBase的目标是存储并处理大型的数据.HBase是一个开源的,分布式的,多版本的,面向列的存储模型,它存储的是 ...
- Hadoop学习笔记—15.HBase框架学习(基础实践篇)
一.HBase的安装配置 1.1 伪分布模式安装 伪分布模式安装即在一台计算机上部署HBase的各个角色,HMaster.HRegionServer以及ZooKeeper都在一台计算机上来模拟. 首先 ...
- Hadoop学习笔记—16.Pig框架学习
一.关于Pig:别以为猪不能干活 1.1 Pig的简介 Pig是一个基于Hadoop的大规模数据分析平台,它提供的SQL-LIKE语言叫Pig Latin,该语言的编译器会把类SQL的数据分析请求转换 ...
- Hadoop学习笔记—17.Hive框架学习
一.Hive:一个牛逼的数据仓库 1.1 神马是Hive? Hive 是建立在 Hadoop 基础上的数据仓库基础构架.它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储. ...
- Hadoop学习笔记—19.Flume框架学习
START:Flume是Cloudera提供的一个高可用的.高可靠的开源分布式海量日志收集系统,日志数据可以经过Flume流向需要存储终端目的地.这里的日志是一个统称,泛指文件.操作记录等许多数据. ...
- Android 学习笔记之AndBase框架学习(七) SlidingMenu滑动菜单的实现
PS:努力的往前飞..再累也无所谓.. 学习内容: 1.使用SlidingMenu实现滑动菜单.. SlidingMenu滑动菜单..滑动菜单在绝大多数app中也是存在的..非常的实用..Gith ...
- Android 学习笔记之AndBase框架学习(六) PullToRefrech 下拉刷新的实现
PS:Struggle for a better future 学习内容: 1.PullToRefrech下拉刷新的实现... 不得不说AndBase这个开源框架确实是非常的强大..把大部分的东西 ...
- Android 学习笔记之AndBase框架学习(五) 数据库ORM..注解,数据库对象映射...
PS:好久没写博客了... 学习内容: 1.DAO介绍,通用DAO的简单调度过程.. 2.数据库映射关系... 3.使用泛型+反射+注解封装通用DAO.. 4.使用AndBase框架实现对DAO的调用 ...
- Android 学习笔记之AndBase框架学习(三) 使用封装好的函数完成Http请求..
PS:踏踏实实走好每一步... 学习内容: 1.使用AndBase框架实现无参Http Get请求... 2.使用AndBase框架实现有参Http Post请求... 3.使用AndBase框架实现 ...
随机推荐
- 从ord()中对Unicode编码的理解
刚开始学习编程的时候,老对字符串编码的理解模模糊糊.也一直看这方便的资料,今天在看Dive in python时,突然有了新的理解(不知道是否正确). Python有个built-in函数ord(), ...
- Fiddler问题 - creation of the root certificate was not successful
打开cmd执行命令. d: cd D:\soft\Fiddler2 makecert.exe -r -ss my -n "CN=DO_NOT_TRUST_FiddlerRoot, O=DO_ ...
- Redis集群搭建1
wget .168.0.201:6379 192.168.0.201:6380 192.168.0.201:6381 192.168.0.202:16379 192.168.0.202:16380 1 ...
- java网络编程2
在通信双方中,ServerSocket是服务器端负责接收的一方,它负责监听指定端口,其构造函数如下: 1.ServerSocket() throws IOException;无参构造函数,之所以存在 ...
- BZOJ 4066 简单题 ——KD-Tree套替罪羊树
[题目分析] 直接x,y二维轮番划分,暴力即可. 套上替罪羊,打碎重构,对于时间复杂度有了保证. 写起来好麻烦,重构的技巧很棒! [代码] #include <cstdio> #inclu ...
- C练习
int main() { int a; //scanf函数只接受变量的地址 //scanf函数是一个阻塞式的函数,等待用户输入 // 用户输入完成后,就会将用户输入的值赋值给变量a //函数调用完毕 ...
- java 日期格式
- php与数据库代码开发规范
php与数据库代码开发规范 1/25/2016 6:00:31 PM php对各类变量命名规范 目录名 文件命名 局部变量命名 使用英文动词名词,用下划线作为单词的分割,所有字母均使用小写 目录 up ...
- [资料分享]dubbo视频教程流行版
一.基础篇 第001节–课程介绍 第01节–使用Dubbo对传统工程进行服务化改造的思路介绍 第02节–使用Dubbo对传统工程进行服务化改造 第03节–ZooKeeper注册中心安装 第04节–使用 ...
- Hive文件存储格式
hive文件存储格式 1.textfile textfile为默认格式 存储方式:行存储 磁盘开销大 数据解析开销大 压缩的text文件 hive无法进行合并和拆分 2.sequencef ...