在大数据系统体系中,数据源、数据采集是第一环。
本文从以下几个方面分享数据采集:
数据源 2.数据同步工具 3.数据采集模块实战分享
数据源
在企业生产应用中数据来源极多,大致可以分为:日志采集、爬虫系统、数据库等
数据采集
在生产实际应用中,一般将数据采集分为日志采集和数据库数据同步两部分。其中日志采集包括浏览器的页面日志采集和客户端的日志采集。
数据同步技术更通用的含义是不同系统间的数据流转,有多种不同的应用场景。主数据库与备份数据库之间的数据备份,以及主系统与子系统之间的数据更新,属于同类型不同集群数据库之间的数据同步。另外,还有不同地域、不同数据库类型之间的数据传输交换,比如分布式业务系统与数据仓库系统之间的数据同步。总体方案分为两种:
实时同步,比如Flume实时采集日志,比如Canal实时采集mysql的binlog或者从kafka中获取。
离线同步,比如使用sqoop离线同步等。
技术选型
现在业内常用的数据采集常用框架有Flume、Sqoop、LogStash、DataX、Canal、WaterDrop等。这些工具的使用都比较简单,学习成本较低。根据每种工具的适用范围和优缺点。结合自己的业务和使用场景进行选择使用。
Flume
Flume是一个分布式、可靠、和高可用的海量日志采集、聚合和传输的系统。Flume可以采集文件,socket数据包等各种形式源数据,又可以将采集到的数据输出到HDFS、hbase、hive、kafka等众多外部存储系统中。如下图是单Agent架构图。
Logstash
Logstash 即大名鼎鼎的ELK中的L。 Logstash 是一个服务器端数据处理管道,它同时从多个源中提取数据,进行转换,然后将其发送到类似Elasticsearch 的“存储”中。Logstash 是 Elastic 栈非常重要的一部分,但是它不仅仅为 Elasticsearch 所使用。它可以介绍广泛的各种数据源。Logstash 可以帮利用它自己的Filter帮我们对数据进行解析,丰富,转换等。
Logstash主要组成如下:
inpust:必须,负责产生事件(Inputs generate events),常用:File、syslog、redis、beats(如:Filebeats)
filters:可选,负责数据处理与转换(filters modify them),常用:grok、mutate、drop、clone、geoip
outpus:必须,负责数据输出(outputs ship them elsewhere),常用:elasticsearch、file、graphite、statsd
Sqoop主要用于在Hadoop(HDFS、Hive、HBase)与传统的数据库(mysql、postgresql…)间进行数据的传递,可以将一个关系型数据库中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。
DataX 是阿里巴巴集团开源的支持异构数据同步工具,实现包括 MySQL、Oracle、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS)、DRDS 等各种异构数据源之间高效的数据同步功能,也可自行开发插件。
canal 主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。
canal是通过模拟成为mysql 的slave的方式,监听mysql 的binlog日志来获取数据,binlog设置为row模式以后,不仅能获取到执行的每一个增删改的脚本,同时还能获取到修改前和修改后的数据,基于这个特性,canal就能高性能的获取到mysql数据数据的变更。
Waterdrop 是一个非常易用,高性能、支持实时流式和离线批处理的海量数据处理产品,架构于Apache Spark 和 Apache Flink之上。
由于篇幅问题,本文不对这些工具做详细对比和使用介绍,想知道它们的优缺点吗?想知道该如何选型吗?去公众号【大华数据之路】找答案吧!
采集之后必然需要将数据持久化,即存储层,常见的有:
MYSQL、Oracle
Hive、Hdfs
HBase
clickhouse
ElasticSearch
Tidb
Mongo
学习Hive、HBase、ElasticSearch、Clickhouse、请关注公众号【大华数据之路】吧!
需要说明的是,数据采集之后往往会先发送到Kafka这种消息队列,然后才真正落地到各种存储层中。
数据采集模块实战分享
对于数据采集系统的设计,应该遵循几个原则:能支持各类数据源接入、能支持离线和实时采集、操作友好简单能自助化操作。一般的整体的设计也是以这几个原则作为指导的。分别从离线和实时采集方面介绍一下落地方案:
离线数据同步方面、在我司主要是采集如下图所示的几个数据源数据,将同步的数据最终落到HIVE或者TIDB,落地到HIVE的数据只要是给业务做建模用。而落地到TIDB主要是支持实时查询、实时业务分析以及各类定时跑批报表的产出。
下面通过Mysql自助化同步到hive为例,讲述我司在自助化同步这块的设计方案。
首先通过数据中台源数据管理模块,将数据库中的所有表以及表信息展示出来,用户按需勾选同步:
离线数据同步支持全量同步、增量同步,支持常规的配置选项,比如脱敏、加密、解密等,也支持用户的自定义规则。由于一般情况下公司会对数仓表名做统一规范,目的表名由系统自动生成,比如mysql同步到hive统一前缀ods_(后续在数仓建设系列中会详细说明,敬请关注公众号【大华数据之路】)
在点击确认同步之后,首先会经过元数据管理系统,从元数据管理系统中查询出同步任务所需要的元信息(包括ip,端口,账户密码,列信息),组装成sqoop参数,将同步信息(包括申请人、申请理由、同步参数等信息)记录到mysql表中。然后调用工单系统经过上级领导审核。
工单系统审核后发消息给到mq,通过mq可实时获取到工单审核状态,如果审核通过,则在调度系统(基于EasyScheduler)自动生成任务。
从图中可知mysql同步到hive涉及三个流程节点,以user表增量同步为例,第一步是通过sqoop任务将mysql数据同步到hive的ods_user_tmp表,第二步是将ods_user_tmp的数据merge到ods_user中(覆盖原有分区),第三步是做数据检验。
除了mysql同步到hive,其他数据源的同步也大同小异,关键是定义好流程模板(通常是shell脚本)和流程依赖,然后利用调度系统进行调度。
实时采集模块,以Flink实时计算平台为例,具有如下特性:
支持多种数据源:Kafka、RocketMq、Hive、Hbase、Tidb等
支持多种落地:Kafka、JDBC、HDFS、ElasticSearch、RocketMq、HIVE等
通用flinksql处理:和sql类似,用来处理数据
支持udf函数和sql无法处理的逻辑可以用jar包的方式处理。
告警策略:支持多种告警策略,如流计算堆积batch的监测、应用的启动退出等。
在设计原则上,也充分考虑了扩展性、易用性,source、process、sink\dim(维表)均为插件化开发,方面后续扩展,界面化配置,自动生成DAG图:
由于篇幅问题,细节问题不能一一说清,本人将在公众号【大华数据之路】持续分享,欢迎关注。