之前说了,大数据平台技术栈 (可点击查看),今天就来说说其中的采集层Sqoop和Flume!
·简单介绍·
1. Hadoop提供了一个中央化的存储系统
有利于进行集中式的数据分析与数据共享
2. Hadoop对存储格式没有要求
用户访问日志;
产品信息;
网页数据等
3. 如何将数据存入Hadoop
数据分散在各个离散的设备上;
数据保存在传统的存储设备和系统中
·常见的两种数据来源·
1. 分散的数据源
机器产生的数据;
用户访问日志;
用户购买日志
2. 传统系统中的数据
传统关系型数据库:MySQL、Oracle等;
磁盘阵列;
磁带
·Hadoop收集和入库基本要求·
1. 分布式
数据源多样化;
数据源分散
2. 可靠性
保证不丢数据;
允许丢部分数据
3. 可扩展
数据源可能会不断增加;
4. 通过并行提高性能
·常见的Hadoop收集与入库系统·
1. 数据收集
Flume;
Kafka;
Scribe
2. 传统数据库与Hadoop同步
Sqoop
·Hadoop数据收集系统—Flume·
1. Flume OG
OG:“Original Generation”;
0.9.x或cdh3以及更早版本;
由agent、collector、master等组件构成
2. Flume NG
NG:“Next/New Generation”;
1.x或cdh4以及之后的版本;
由Agent、Client等组件构成;
3. 为什么要推出NG版本
精简代码;
架构简化
Flume OG架构
·Agent·
1. 用于采集数据
2. 数据流产生的地方
3. 通常由source和sink两部分组成
Source用于获取数据,可从文本文件,syslog,HTTP等获取数据;
Sink将Source获得的数据进一步传输给后面的Collector
4. Flume自带了很多source和sink实现
syslogTcp(5140) | agentSink("localhost",35853)
tail("/etc/services") | agentSink("localhost",35853)
·Collector·
1. 汇总多个Agent结果
2. 将汇总结果导入后端存储系统,比如HDFS,HBase
3. Flume自带了很多collector实现
collectorSource(35853) | console;
collectorSource(35853) | collectorSink("file:///tmp/flume/collected", "syslog");
collectorSource(35853) | collectorSink("hdfs://namenode/user/flume/ ","syslog");
Agent与Collector对应关系
·Agent与Collector对应关系·
1. 可手动指定,也可自动匹配
2. 自动匹配的情况下,Master会平衡Collector之间的负载
问题:为什么引入Collector?
对Agent数据进行汇总,避免产生过多小文件;
避免多个Agent连接对Hadoop造成过大压力;
中间件,屏蔽Agent和Hadoop间的异构性
·Master·
1. 管理协调Agent 和Collector的配置信息
2. Flume集群的控制器
3. 跟踪数据流的最后确认信息,并通知Agent
4. 通常需配置多个Master以防止单点故障
5. 借助Zookeeper管理管理多Master
容错机制
·三种可靠性级别·
1. agentE2ESink[("machine"[,port])]
agent收到确认消息才认为数据发送成功,否则重试
2. agentDFOSink[("machine"[,port])]
当agent发现在collector操作失败的时候,agent写入到本地硬盘上,当collctor恢复后,再重新发送数据
3. agentBESink[("machine"[,port])]
效率最好,agent不写入到本地任何数据,如果在collector发现处理失败,直接删除消息
·构建基于Flume的数据收集系统·
1. Agent和Collector均可以动态配置
2. 可通过命令行或Web界面配置
3. 命令行配置
在已经启动的master节点上,依次输入”flume shell” -> ”connect localhost ”
如执行 exec config a1 ‘tailDir(“/data/logfile”)’ ‘agentSink’
4. Web界面
选中节点,填写source、sink等信息
常用架构举例一
agentA : tail(“/ngnix/logs”) | agentSink("collector",35853);
agentB : tail(“/ngnix/logs”) | agentSink("collector",35853);
agentC : tail(“/ngnix/logs”) | agentSink("collector",35853);
agentD : tail(“/ngnix/logs”) | agentSink("collector",35853);
agentE : tail(“/ngnix/logs”) | agentSink("collector",35853);
agentF : tail(“/ngnix/logs”) | agentSink("collector",35853);
collector : collectorSource(35853) | collectorSink("hdfs://namenode/flume/","srcdata");
常用架构举例二
agentA : src | agentE2ESink("collectorA",35853);
agentB : src | agentE2ESink("collectorA",35853);
agentC : src | agentE2ESink("collectorB",35853);
agentD : src | agentE2ESink("collectorB",35853);
agentE : src | agentE2ESink("collectorC",35853);
agentF : src | agentE2ESink("collectorC",35853);
collectorA : collectorSource(35853) | collectorSink("hdfs://...","src");
collectorB : collectorSource(35853) | collectorSink("hdfs://...","src");
collectorC : collectorSource(35853) | collectorSink("hdfs://...","src");
常用架构举例三
agentA : src | agentE2EChain("collectorA:35853","collectorB:35853");
...
collectorA : collectorSource(35853) | collectorSink("hdfs://...","src");
·Sqoop是什么·
1. Sqoop:SQL-to-Hadoop
2. 连接传统关系型数据库和Hadoop的桥梁
把关系型数据库的数据导入到Hadoop系统(如HDFS、HBase和Hive)中;
把数据从Hadoop系统里抽取并导出到关系型数据库里
3. 利用MapReduce加快数据传输速度
4. 批处理方式进行数据传输
·Sqoop优势·
1. 高效、可控地利用资源
任务并行度,超时时间等
2. 数据类型映射与转换
可自动进行,用户也可自定义
3. 支持多种数据库
MySQL Oracle PostgreSQL
Sqoop1架构
Sqoop2架构
·Sqoop import·
1. 将数据从关系型数据库导入Hadoop中
步骤1:Sqoop与数据库Server通信,获取数据库表的元数据信息;
步骤2:Sqoop启动一个Map-Only的MR作业,利用元数据信息并行将数据写入Hadoop
导入多个表的数据
增量导入
增量导入(一)
1. 适用于数据每次被追加到数据库中,而已有数据不变的情况
2. 仅导入id这一列值大于1的记录
增量导入(二)
每次成功运行后,sqoop将最后一条记录的id值保存到metastore中,供下次使用
增量导入(三)
1. 数据库中有一列last_update_date,记录了上次修改时间;
2. Sqoop仅将某时刻后的数据导入Hadoop。
·Sqoop Export·
1. 将数据从Hadoop导入关系型数据库表中
步骤1:Sqoop与数据库Server通信,获取数据库表的元数据信息;
步骤2:并行导入数据
将Hadoop上文件划分成若 干个split;
每个split由一个Map Task进行数据导入
1. --connnect: 指定JDBC URL
2. --username/password:mysql数据库的用户名
3. --table:要导入的数据库表
4. export-dir:数据在HDFS上存放目录
Sqoop Export—保证原子性
--staging-table staging_cities
Sqoop Export—更新已有数据
--update-key id
--update-mode allowinsert
Sqoop Export—选择性插入
--columns country,city
Sqoop与其他系统结合
Sqoop可以与Oozie、Hive、Hbase等系统结合;
用户需要在sqoop-env.sh中增加HBASE_HOME、HIVE_HOME等环境变量
Sqoop与Hive结合
--hive-import
Sqoop与HBase结合
--hbase-table cities
--column-family world
来自:知了小巷
长按订阅更多精彩▼