Hadoop数据收集与入库系统Flume与Sqoop

Hadoop数据收集与入库系统Flume与Sqoop_第1张图片

之前说了,大数据平台技术栈 (可点击查看),今天就来说说其中的采集层Sqoop和Flume!


Hadoop数据收集与入库系统Flume与Sqoop


背景知识

·简单介绍·

1. Hadoop提供了一个中央化的存储系统

    有利于进行集中式的数据分析与数据共享

2. Hadoop对存储格式没有要求

    用户访问日志;

    产品信息;

    网页数据等

3. 如何将数据存入Hadoop

    数据分散在各个离散的设备上;

    数据保存在传统的存储设备和系统中

·常见的两种数据来源·

1. 分散的数据源

    机器产生的数据;

    用户访问日志;

    用户购买日志

2. 传统系统中的数据

    传统关系型数据库:MySQL、Oracle等;

    磁盘阵列;

    磁带

·Hadoop收集和入库基本要求·

1. 分布式

    数据源多样化;

    数据源分散

2. 可靠性

    保证不丢数据;

    允许丢部分数据

3. 可扩展

    数据源可能会不断增加;

4. 通过并行提高性能


·常见的Hadoop收集与入库系统·

1. 数据收集

    Flume;

    Kafka;

    Scribe

2. 传统数据库与Hadoop同步

    Sqoop



Hadoop数据收集系统


·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版本

    精简代码;

    架构简化


640?wx_fmt=gif

 Flume OG架构

Hadoop数据收集与入库系统Flume与Sqoop_第2张图片

Hadoop数据收集与入库系统Flume与Sqoop_第3张图片

·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");


640?wx_fmt=gif

 Agent与Collector对应关系

Hadoop数据收集与入库系统Flume与Sqoop_第4张图片

·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


640?wx_fmt=gif

 容错机制

Hadoop数据收集与入库系统Flume与Sqoop_第5张图片

·三种可靠性级别·

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");



传统数据库与Hadoop间数据同步



·Sqoop是什么·

1. Sqoop:SQL-to-Hadoop

2. 连接传统关系型数据库和Hadoop的桥梁

    把关系型数据库的数据导入到Hadoop系统(如HDFS、HBase和Hive)中;

    把数据从Hadoop系统里抽取并导出到关系型数据库里

3. 利用MapReduce加快数据传输速度

4. 批处理方式进行数据传输

·Sqoop优势·

1. 高效、可控地利用资源

    任务并行度,超时时间等

2. 数据类型映射与转换

    可自动进行,用户也可自定义

3. 支持多种数据库

    MySQL Oracle PostgreSQL


640?wx_fmt=gif

 Sqoop1架构

Hadoop数据收集与入库系统Flume与Sqoop_第6张图片

640?wx_fmt=gif

 Sqoop2架构

Hadoop数据收集与入库系统Flume与Sqoop_第7张图片

·Sqoop import·

1. 将数据从关系型数据库导入Hadoop中

    步骤1:Sqoop与数据库Server通信,获取数据库表的元数据信息;

    步骤2:Sqoop启动一个Map-Only的MR作业,利用元数据信息并行将数据写入Hadoop

Hadoop数据收集与入库系统Flume与Sqoop_第8张图片

Hadoop数据收集与入库系统Flume与Sqoop_第9张图片


Hadoop数据收集与入库系统Flume与Sqoop_第10张图片


Hadoop数据收集与入库系统Flume与Sqoop_第11张图片


导入多个表的数据


Hadoop数据收集与入库系统Flume与Sqoop_第12张图片

640?wx_fmt=gif

 增量导入

Hadoop数据收集与入库系统Flume与Sqoop_第13张图片


640?wx_fmt=gif

 增量导入(一)

Hadoop数据收集与入库系统Flume与Sqoop_第14张图片

1. 适用于数据每次被追加到数据库中,而已有数据不变的情况

2. 仅导入id这一列值大于1的记录

640?wx_fmt=gif

 增量导入(二)

Hadoop数据收集与入库系统Flume与Sqoop_第15张图片

每次成功运行后,sqoop将最后一条记录的id值保存到metastore中,供下次使用


640?wx_fmt=gif

 增量导入(三)

Hadoop数据收集与入库系统Flume与Sqoop_第16张图片

1. 数据库中有一列last_update_date,记录了上次修改时间;

2. Sqoop仅将某时刻后的数据导入Hadoop。


·Sqoop Export·

1. 将数据从Hadoop导入关系型数据库表中

    步骤1:Sqoop与数据库Server通信,获取数据库表的元数据信息;

    步骤2:并行导入数据

        将Hadoop上文件划分成若 干个split;

        每个split由一个Map Task进行数据导入

Hadoop数据收集与入库系统Flume与Sqoop_第17张图片

Hadoop数据收集与入库系统Flume与Sqoop_第18张图片

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

来自:知了小巷


长按订阅更多精彩▼

640?wx_fmt=jpeg


你可能感兴趣的:(Hadoop数据收集与入库系统Flume与Sqoop)