数据采集工具与Sqoop

为了构建数据仓库,我们首先需要做的第一步就是,需要进行数据采集,常见的数据采集工具有Sqoop,Flume,DataX等等

数据采集的场景

场景1:从支持FTP、SFTP、HTTP等协议的数据源获取数据
(比如通过爬虫从网站获取数据)
场景2:从业务数据库中获取数据,数据采集录入后需要支撑业务系统
场景3:数据源通过kafka等消息队列,需要时实采集数据。

在这里插入图片描述

最下面数据源分为三部分:
针对不同的数据源,使用的数据采集也不同,在上面这张图中个,针对文件形式的数据源,我们使用的是Flume,针对普通的数据源,我们使用的是sqoop。数据采集完成之后,以文件的形式直接保存在HDFS中,或者是以key-value的形式存储在hbase中。

最后通过Hive或者 impala spark prosto等分布式的计算框架查询引擎,进行计算处理。或者是通过ES,solr搜索引擎进行索引的查找查询。最后对外提供数据访问。

常用的数据采集工具

除了sqoop之外

  • Apache Flume:分布式,可靠的,高可用的日志收集系统,支持多种数据源,配置灵活。
  • Gobblin:用来整合各种数据源的通用性ETL框架,理论上各种数据都可以在这里“一站式”解决ETL整个过程
  • DataX:阿里开源的异构数据同步工具,致力于实现关系数据库,HDFS,Hive ,Hbase 、FTP等异构数据源的稳定数据同步。

数据采集工具

Sqoop简介

用户Hadoop和传统的数据库进行数据导入导出的工具,用于数据的传递。

  • Sqoop是一个ETL工具,抽取处理加载到Hadoop集群中。

Sqoop是如何实现呢?

  • 可以通过Hadoop的MapReduce把数据从关系型数据库中导入Hadoop集群
  • 传输大量结构化或半结构化数据的过程是完全自动化的。

在这里插入图片描述

Sqoop通过MapReduce实现了数据的导入导出

Sqoop常用命令
  • Sqoop import;DBMS表中的每一行都被视为HDFS中的一条记录
  • Spoop export:读取并按照指定分隔符解析数据插入到DBMS中
  • Sqoop job:将sqoop导入导出保存成job,方便下次执行

下面看一下,当我们提交到一条命令到sqoop,sqoop帮我们做了什么工作。

在这里插入图片描述
当我们提交一条命令到sqoop,sqoop对我们提交的命令进行解析。
解析完成之后根据我们指定的数据源,去获取源数据的信息,根据目录以及其他参数,生成MapReduce的代码,提交到HADOOP集群去执行。Sqoop生成的map人物,会读取数据源的内容,然后把数据存储到指定到指定的目录。所以呢,sqoop的核心呢就是MapReduce代码的生成。

Sqoop的安装

我们可以在官网下载sqoop
然后进行解压
使用wget命令下载

wget http://archive.apache.org/dist/sqoop/1.4.7/sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz

解压
tar zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz 
拷贝MySQL的驱动到lib目录下
cp mysql-connector-java-5.1.22-bin.jar /usr/local/sqoop/sqoop-1.4.7.bin__hadoop-2.6.0/lib/

复制配置文件
cp sqoop-env-template.sh sqoop-env.sh

在配置文件中写入Hadoop的安装目录

在这里插入图片描述

然后跳转到bin路目录下:

在这里插入图片描述

以MySQL为例子:

./sqoop list-databases --connect jdbc:mysql://localhost:3306 --username root --password 123456

这个命令 是用sqoop执行 list-datbase命令 列出指定数据源下面所有的数据库 然后执行链接名称和密码即可

在这里插入图片描述

现在我们可以发现,已经把结果打印出来了
下面我们在执行命令,列出执行数据源下面的一些表

./sqoop list-tables --connect jdbc:mysql://localhost:3306/hive --username root --password 123456

下面使用sqoop导入导出的命令

使用MySQL进行数据库的导入导出

我们依旧在sqoop的安装目录下的bin目录下进行操作:

./sqoop import --connect  jdbc:mysql://localhost:3306/sqooptest --username root --password 123456  --table  testtable  --driver  com.mysql.jdbc.Driver  --target-dir  /testtable

我们执行这个命令 ,并指定数据库的名称 最后执行数据表,然后执行驱动名称,然后指定 目标路径

执行这个命令呢,可以看到提示错误,是因为我们没有设置主键,没有设置主键,无法进行map任务的分割
提示我们可以指定 --split by 指定分隔的列 加上 split by id
执行完成之后,我们就可以看一下HDFS上面 target dir里面的目录,可以看到已经导入到HDFS中了

./sqoop import --connect  jdbc:mysql://localhost:3306/sqooptest --username root --password 123456  --table  testtable  --driver  com.mysql.jdbc.Driver --split by  id --target-dir  /testtable

我们通过 --split by id执行之后呢,每一行都被划分成了每一个map任务,数据表中有三行,则被map成了三个数据文件
如果我们想把他合并成一个文件,则需要指定map参数

./sqoop import --connect  jdbc:mysql://localhost:3306/sqooptest --username root --password 123456  --table  testtable  --driver  com.mysql.jdbc.Driver  --num-mappers  1  --target-dir  /testtable

–num-mappers 1 这样所以的数据文件都会存储到一个文件中

在这里插入图片描述

我们看一下sqoop的查询语句

在这里插入图片描述
我们可以使用–columns 来指定需要导入的列

./sqoop import --connect  jdbc:mysql://localhost:3306/sqooptest --username root --password 123456  --table  testtable  --driver  com.mysql.jdbc.Driver  --num-mappers  1 --column id,name  --target-dir  /testtable

来指定 id 和name两列

sqoop的导出

./sqoop export  --connect  jdbc:mysql://localhost:3306/sqooptest --username root --password 123456  --table  testtable2   export-dir  /testtable

export-dir :指定导出文件的目录

最后

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值