adoop学习笔记—18.Sqoop框架学习

 

一、Sqoop基础:连接关系型数据库与Hadoop的桥梁

1.1 Sqoop的基本概念  

  Hadoop正成为企业用于大数据分析的最热门选择,但想将你的数据移植过去并不容易。Apache Sqoop正在加紧帮助客户将重要数据从数据库移到Hadoop。随着Hadoop和关系型数据库之间的数据移动渐渐变成一个标准的流程,云管理员们能够利用Sqoop的并行批量数据加载能力来简化这一流程,降低编写自定义数据加载脚本的需求。

  Apache SqoopSQL-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 export

HBASE_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个数字

1
2
3
4
5
6
7
8
9
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

作者:周旭龙

出处:http://www.cnblogs.com/edisonchou/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

 

sqoop笔记的更多相关文章

  1. Hadoop学习笔记—18.Sqoop框架学习

    一.Sqoop基础:连接关系型数据库与Hadoop的桥梁 1.1 Sqoop的基本概念 Hadoop正成为企业用于大数据分析的最热门选择,但想将你的数据移植过去并不容易.Apache Sqoop正在加 ...

  2. Hadoop学习笔记: sqoop配置与使用

    sqoop即SQL-to-Hadoop,是一个把数据从关系型数据库导入到Hadoop系统中的工具(HDFS,HIVE和HBase),也可以将数据从Hadoop导入到关系型数据库.本文以sqoop 1. ...

  3. Flume+Sqoop+Azkaban笔记

    大纲(辅助系统) 离线辅助系统 数据接入 Flume介绍 Flume组件 Flume实战案例 任务调度 调度器基础 市面上调度工具 Oozie的使用 Oozie的流程定义详解 数据导出 sqoop基础 ...

  4. sqoop 使用笔记

    好久没有更新自己技术博客,现在开始工作了,把自己遇到的问题写到这里边来 主要把自己的问题写出来,分享给大家 sqoop 导入数据时候 有时候会遇到mysql 中有sql 中的关键字 这时候如果直接导出 ...

  5. centos7 sqoop 1 搭建笔记

    1.require : java环境,hadoop,hive ,mysql2.下载解压sqoop13.设置环境变量 export SQOOP_HOME=/data/spark/bin/sqoop ex ...

  6. 【大数据】Sqoop学习笔记

    第1章 Sqoop简介 Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql.postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 : MyS ...

  7. sqoop学习笔记

    #################################################################################################### ...

  8. sqoop安装部署(笔记)

    sqoop是一个把关系型数据库数据抽向hadoop的工具.同时,也支持将hive.pig等查询的结果导入关系型数据库中存储.由于,笔者部署的hadoop版本是2.2.0,所以sqoop的版本是:sqo ...

  9. Sqoop使用笔记(转载)

    Sqoop是Apache顶级项目,主要用来在Hadoop和关系数据库中传递数据.通过sqoop,可以方便的将数据从关系数据库导入到HDFS,或将数据从HDFS导出到关系数据库. 关于Sqoop 官网S ...

随机推荐

  1. Spring的注解

    Action想使用serviceImpl时,都需要最原始的方法New一个接口,Service service = new serviceImpl();去实例化service了.都需要Action主动创 ...

  2. 里面的div怎么撑开外面的div,让高度自适应

    关于容器高度自适应的兼容性问题.1.有些时候,我们希望容器有一个固定高度,但当其中的内容多的时候,又希望高度能够自适应,也即容器在纵向能被撑开,且如果有背景,也能够自适应.在一般情况下,使用min-h ...

  3. 不在折腾---storm-0.9.2-incubating分布式安装

    安装一个zookeeper集群 > 请参考:不在折腾----zookeeper-3.4.5 上传strom的安装包 解压 配置,conf/storm.yaml * 所使用的zookeeper集群 ...

  4. SPSS数据分析-时间序列模型

    我们在分析数据时,经常会碰到一种数据,它是由时间累积起来的,并按照时间顺序排列的一系列观测值,我们称为时间序列,它有点类似于重复测量数据,但是区别在于重复测量数据的时间点不会很多,而时间序列的时间点非 ...

  5. svg转化成canvas以便生成base64位的图片

    很久前写了关于把html转成图片的一个例子,最近有出了新的问题.利用html2canvas.js文件把html转成base64位的图片是没什么问题的,但也不是绝对的,比如这时候不能碰见svg这个鬼,h ...

  6. css3实现颜色渐变以及兼容性处理

    有时我们会看到网站上的一些图片是渐变色的,这些图片有的是ui设计出来的,有的则是直接通过css3制作出来的.下面就讲一下css3实现渐变色的方法,以及在各个浏览器上的兼容性. CSS3 Gradien ...

  7. JSON的一些细节

    这篇JSON的随笔只是为了简单地复习一下学习到的JSON的内容.都是一些很基础的东西.如果你不小心看到了这篇文,那就一起复习吧.(。・∀・)ノ JSON不支持JavaScript中的undefined ...

  8. rtc关机闹钟2 Alarm manager

    public void set(int type, long triggerAtMillis, long windowMillis, long intervalMillis, PendingInten ...

  9. C#winform调整控件的位置

    现在有三个控件并排放置 第二个控件有隐藏功能 隐藏后第一个控件和第三个控件的距离要缩小,于是就要改变第三个控件的位置 尝试用Location.X属性去设置,但是被告知此非变量 于是只能另外想办法 搜到 ...

  10. opencv 基础语法

    1.关于图像:显示图象 //在指定窗口显示图像cvShowImage void cvShowImage( const char* name, const CvArr* image ); name:窗口 ...