为了构建数据仓库,我们首先需要做的第一步就是,需要进行数据采集,常见的数据采集工具有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 :指定导出文件的目录