热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

大数据中台技术架构

1.数据采集传输这个一般对应于公司的日志平台,任务是将数据采集后缓存在某个地方,供后续的计算流程进行消费使用。针对不同的数据来源有各自的采集方式,从APP服务器日志,到

 

 

1. 数据采集传输


这个一般对应于公司的日志平台,任务是将数据采集后缓存在某个地方,供后续的计算流程进行消费使用。
针对不同的数据来源有各自的采集方式,从 APP/服务器 日志,到业务表,还有各种 API 接口及数据文件等等。其中因为日志数据有数据量多,数据结构多样,产生环境复杂等特点,属于「重点关照」的对象。目前市面针对日志采集的有 Flume,Logstash,Filebeat,Fluentd ,rsyslog 几种常见的框架,我们挑应用较广泛的前两者介绍下:
1.1 Flume 和 Logstash
Flume 是一款由 Cloudera 开发的实时采集日志引擎,主打高并发,高速度,分布式海量日志采集。它是一种提供高可用、高可靠、分布式海量日志采集、聚合和传输的系统。Flume 支持在日志系统中定制各类数据进行发送,用于采集数据;同时,它支持对数据进行简单处理,并写到各种数据接收方。目前有两个版本,OG和NG,特点主要是:

  1. 侧重数据传输,有内部机制确保不会丢数据,用于重要日志场景
  2. 由java开发,没有丰富的插件,主要靠二次开发
  3. 配置繁琐,对外暴露监控端口有数据


Logstash 是 旗下的一个开源数据收集引擎,可动态的统一不同的数据源的数据至目的地,搭配 ElasticSearch 进行分析,Kibana 进行页面展示,是著名的 ELK 技术栈中的「L」部分。特点主要是:

  1. 内部没有一个persist queue,异常情况可能会丢失部分数据
  2. 由ruby编写,需要ruby环境,插件很多
  3. 配置简单,偏重数据前期处理,分析方便


从两者的设计思想来看,Flume 最初并不是为了采集日志而设计,而是定位在把数据传入 HDFS 中,这和 Logstash 有根本的区别。所以它理所应当侧重于数据的传输和安全,且需要更多的二次开发和配置工作。而 Logstash 明显侧重先对日志数据进行预处理,为后续的解析做铺垫。它搭配 ELK 技术栈使用起来比较简单,更像是为你准备好的便当,开盒即食。

1.2 日志采集如何工作


我们以 Flume 为例子讲些日志采集 Agent 是怎么工作的。
Flume 由三个部分组成:Source,Channel 和 Sink,对应于采集,缓存和保存三个环节。
其中,Source 组件用来采集各种类型的数据源,如 directory、http、kafka 等。Channel 组件用来缓存数据,有 memory channel,JDBC channel和 kafka channel 三种。最后再通过 Sink 组件进行保存,分别支持 HDFS,HBase,Hive 和 Kafka 四种存储方式。
下面结合一个大数据实时处理系统阐述下 Flume 在实际应用中所扮演的重要角色。该实时处理系统整体架构如下:通过将 Agent 部署在 Web 服务器,一旦发生新增的日志数据,就会被 Flume 程序监听到,并且最终会传输到 Kafka 的 Topic 中,再进行后续的一系列操作。


1.3 数据传输 Kafka


Kafka 最初是由领英开发,并随后于 2011 年初开源, 并于 2012 年 10 月 23 日由Apache Incubato 孵化出站。该项目的目标是为处理实时数据提供一个统一、高吞吐、低延迟的平台。其持久化层本质上是一个“按照分布式事务日志架构的大规模发布/订阅消息队列”,这使它作为企业级基础设施来处理流式数据非常有价值。


2. 数据存储

数据库存储方面,有单机/分布式、关系型/非关系型、列式存储/行式存储三个维度的划分,各种维度交叉下都有对应产品来解决某个场景下的需求。
在数据量较小的情况下,一般采取单机数据库,如应用非常广泛,技术成熟的 MySQL。数据量大到一定程度后,就必须采取分布式系统了。目前业界最知名的就是 Apache 基金会名下的 Hadoop 系统,它基本可以作为大数据时代存储计算的经典模型。

HDFS
HDFS 作为 Hadoop 里的分布式文件系统,为 HBase 和 Hive 们提供了高可靠性的底层存储支持,对应于 Google GFS 的开源实现。一般也会用于一些批次分析的场景。

HBase
HBase 是 Hadoop 数据库,作为基于列的非关系型数据库运行在 HDFS 上。它具备 HDFS 缺乏的随机读写能力,因此比较适合实时分析。HBase 以 Google BigTable为蓝本,以 Key-Value 形式存储,能快速在主机内数十亿行数据中定位所需的数据并访问它。

Hive 和 Pig
Hive 和 Pig 都是集成在 Hadoop 顶层的查询语言,提供静态数据的动态查询,支持类 SQL 语言,底层经过编译转为 MapReduce 程序,省去了自己编写 MR 程序的繁琐。区别是 Hive SQL 是类 SQL 的查询语言,要求数据存储于表中,而 Pig 是面向数据流的一个程序语言,常用于开发简洁的脚本来转换数据流从而嵌入到较大的应用程序中。

MapReduce
MR 开创了分布时代计算的先河,使得大批量数据处理成为可能。简单来讲,就是将比较庞大的计算任务先分组,再汇总,提高计算效率。举例来讲,如果你新家需要装修,要在不同地方购置很多东西。你一个人(单机)去买估计得花十天。现在叫了一堆小伙伴(分布式),每个人负责去一个地方买东西(Map),最后再拿到家里分类汇总(Reduce),一天就搞定了。

 

其他辅助工具
上图中的其他工具是为了保证整个大数据计算存储系统更加健壮和开放,如 Zookeeper 提供了稳定服务和 failover 机制,Sqoop 则为 Hadoop 提供了方便的 RDBMS(关系型数据库)数据导入功能,使得传统数据库数据向 HBase 中迁移变的非常方便。
值得一提的是,Hadoop 生态其实是建立在 Google 2003 年发表的三大论文的基础之上。可能是当时 Google 有意改善业内落后的现状,让大家稍微跟得上他的脚步才发布的论文…这么多年过去了,不知道 Google 内部对数据的理解和使用又到了什么样的高度。

3. 数据计算&查询

3.1 批计算和流计算


大数据处理场景可分为批处理和流处理两个,分别对应离线分析和实时分析。常见框架分类有:

  1. 仅批处理框架:Hadoop MapReduce
  2. 仅流处理框架:Storm,Samza
  3. 混合框架:Spark,Flink


篇幅所限,除了上文已经提到的 Hadoop 生态外,我们再简单科普下 Spark:


3.2 Spark 和 Flink


Apache Spark 是一种包含流处理能力的下一代批处理框架。
批处理模式下,Spark 与 MapReduce 不同,它将数据处理工作全部在内存中进行,计算性能大幅改善。流处理模式下,Spark 主要通过 Spark Streaming 实现了一种叫做微批(Micro-batch)的概念。该技术可以将数据流视作一系列非常小的“批”,借此即可通过批处理引擎的原生语义进行处理。这种方式的实际效果非常好,但相比真正的流处理框架在性能方面依然存在不足。

综上所述,Spark是多样化工作负载处理任务的最佳选择。Spark批处理能力以更高内存占用为代价提供了无与伦比的速度优势。对于重视吞吐率而非延迟的工作负载,则比较适合使用 Spark Streaming 作为流处理解决方案。

而 Flink 作为更新一代的处理框架,拥有更快的计算能力,更低的延迟,已经慢慢崭露头角。不过一个框架的应用,特别是开源框架,需要足够长的时间进行运行,测试和优化。大数据技术在开源社区的推动下,迭代日新月异。在不久的将来,相信 Flink 会像 Spark 取代 Storm 一样,逐渐成为大数据处理技术的主流。

3.3 数据查询

经过处理后的数据,还需要有高效的查询引擎才能被用户接触和使用。目前 OLAP 的查询技术框架大致可分为三类:

  1. 基于 HBase 做预聚合:如 Opentsdb, Kylin 等,均需指定预聚合的指标,在数据接入的时候进行聚合运算,适合相对固定,维度较多的业务报表类需求
  2. 基于 Parquet 做列式存储:如 Presto, Drill,Impala 等,基本是完全基于内存的并行计算,Parquet 系能降低存储空间,提高IO效率,以离线处理为主,很难提高数据写的实时性,超大表的 Join 支持可能不够好
  3. 基于 Lucene 做外部索引:如 ElasticSearch,Solr 等,能够满足的的查询场景远多于传统的数据库存储,但对于日志、行为类时序数据,所有的搜索请求都也必须搜索所有的分片,另外,对于聚合分析场景的支持也是软肋

我们以常见的 Presto,Druid,Kylin 三个模型来讲讲各自的特点:

  1. Presto:由 Facebook 开源,是一个分布式数据查询框架,原生集成了 Hive、 Hbase 和关系型数据库。它背后所使用的执行模式与Hive有根本的不同,并没有使用 MapReduce。因其所有的处理都在内存中完成(与上文的 Spark 类似),大部分场景下要比 Hive 快一个数量级
  2. Druid:由 MetaMarket 开源,是一个分布式、面向列式存储的准实时分析数据存储系统,延迟性最细颗粒度可到 5 分钟。它能够在高并发环境下,保证海量数据查询分析性能,同时又提供海量实时数据的查询、分析与可视化功能
  3. Kylin:Cube 预计算技术是其核心,基本思路是预先对数据作多维索引,查询时只扫描索引而不访问原始数据从而提速。劣势在于每次增减维度必须对 Cube 进行历史数据重算追溯,非常消耗时间。据说 Kylingence 在前几天的新品发布会上已经解决了这个问题,拭目以待

下图引自快手在 OLAP 技术选型时的评价,以供大家参考:

很多时候,在计算和查询这块没有明显的边界区分。这里为了方便阐述分成了两个部分。事实上,对于技术能力比较强的团队,可以针对这些开源系统进行魔改,比如采用 Kylin 的预计算能力+Druid 的查询引擎,来提高查询的速度等等。


4. 数据可视化及分析


在数据可视化这块,一般会采取三个途径来进行数据展示。最基础的利用开源的图表库,如国外的 HighCharts、D3,百度的 ECharts,还有阿里 Antv 的 G2、G6、F2 等。往上一层是各个知名公司开源的可视化框架,如 Airbnb 的 Superset,Redash,Metabase 等等。这些框架一般能够满足从数据源接入,自助制作报表和报表整理展示的功能,接入起来更加方便。再往上一层就是商用的可视化软件,如国外的 Tableau,Qlik ,国内的 FineReport,永洪 BI 等等。这种软件需要付费,但都具备更丰富的可视化功能并提供一些技术支持,对于那些没有精力折腾可视化的公司会是个不错的选择。


4.1 图表库


理解整个图表开源生态,我们得先了解下 SVG 和 Canvas 这两个浏览器提供的原生能力。SVG 全称叫可缩放矢量图,跟 HTML 一样,有自己的命名空间,使用 XML 标签来绘图。而 Canvas 是 HTML5 中的新标签,用于客户端的图形绘制,有一个基于 Javascript 的绘图 API。


D3.js 全称是 Data-DrivenDocuments,支持 SVG 和 Canvas。相对于其他产品,它更偏底层,并没有对图表进行归类。开发者可以通过 D3 丰富的类库来方便的操作 DOM,绘制任何想绘制的图形,以增加开发复杂度的代价,覆盖更加全面的可视化场景。

而国外的 HighCharts 是基于 SVG 开发的图表库,ECharts 和 G2 则均基于 Canvas。ECharts 有完整的图表封装,开箱即用,而 G2 则是一套基于可视化编码的图形语法,以数据驱动,具有高度的易用性和扩展性。阿里后续基于 G2 又往上封装了一套基于 React 的图表库 Bizcharts,主打电商业务图表可视化,沉淀电商业务线的可视化规范。在 React 项目中实现常见图表和自定义图表。

ECharts 和 G2 的对比可借用 ECharts 作者的一句话,G2 是面粉,ECharts 是面条,皆微小但美好。


4.2 可视化框架

这里主要介绍下业内比较出名的 Superset 和 Metabase。前者的方案更加完善,支持集合不同数据源形成对应的指标,再通过丰富的图表类型进行可视化。在时间序列分析上比较出色,支持移动平均及周期偏移等分析方法。同时与 Druid 深度集成,可以快速解析大规模数据集。劣势则是不支持分组管理报表,一旦报表多了使用起来很麻烦。且不提供图表下钻及联动功能,权限管理也不够友好。


Metabase 则比较注重非技术人员(如产品经理和运营人员)的使用体验,让他们能***地探索数据,回答自己的问题,界面相对来讲更加美观。在权限管理上做得较为完善,甚至无需账号也可以对外共享图表和数据内容。Dashboard 支持分类,便于管理报表。劣势在时间序列分析上不支持不同日期对比,还需要自定义SQL 实现。每次查询仅能针对一个数据库查询,操作比较繁琐。


在数据挖掘这块,目前主要集中在商用公司这块,通过和某些行业深度合作,从而训练和深化自己的学习模型,这里不多赘述。

文章的最后,鸣谢网络上各位知识的分享者,以下是主要参考内容的链接,大家可以自行查阅。本人非技术出身,所有资料均系网上整理而成,是互联网的***分享精神让这篇文章成为可能。同时,特别鸣谢转转数据技术负责人军哥友情斧正。如还有纰漏之处,欢迎留言指教。

参考文章:

    1. 部署Flume,大数据采集又快又稳
    2. Flume日志采集与Logstash对比
    3. 详解日志采集工具--Logstash、Filebeat、Fluentd、Logagent对比
    4. Hive,Hbase,HDFS等之间的关系
    5. 批处理和流处理
    6. D3.js 入门简介
    7. 图表组件D3调研及和Echarts对比
    8. 数据可视化的开源方案: Superset vs Redash vs Metabase

 


推荐阅读
  • 本文详细介绍了HDFS的基础知识及其数据读写机制。首先,文章阐述了HDFS的架构,包括其核心组件及其角色和功能。特别地,对NameNode进行了深入解析,指出其主要负责在内存中存储元数据、目录结构以及文件块的映射关系,并通过持久化方案确保数据的可靠性和高可用性。此外,还探讨了DataNode的角色及其在数据存储和读取过程中的关键作用。 ... [详细]
  • 如何利用Java 5 Executor框架高效构建和管理线程池
    Java 5 引入了 Executor 框架,为开发人员提供了一种高效管理和构建线程池的方法。该框架通过将任务提交与任务执行分离,简化了多线程编程的复杂性。利用 Executor 框架,开发人员可以更灵活地控制线程的创建、分配和管理,从而提高服务器端应用的性能和响应能力。此外,该框架还提供了多种线程池实现,如固定线程池、缓存线程池和单线程池,以适应不同的应用场景和需求。 ... [详细]
  • Flume 开源分布式日志收集系统
    为什么80%的码农都做不了架构师?Flume--开源分布式日志收集系统Flume是Cloudera提供的一个高可用的、高可靠的开源分布式海量日志收集系统 ... [详细]
  • Java高并发与多线程(二):线程的实现方式详解
    本文将深入探讨Java中线程的三种主要实现方式,包括继承Thread类、实现Runnable接口和实现Callable接口,并分析它们之间的异同及其应用场景。 ... [详细]
  • 本文总结了一些开发中常见的问题及其解决方案,包括特性过滤器的使用、NuGet程序集版本冲突、线程存储、溢出检查、ThreadPool的最大线程数设置、Redis使用中的问题以及Task.Result和Task.GetAwaiter().GetResult()的区别。 ... [详细]
  • 设计实战 | 10个Kotlin项目深度解析:首页模块开发详解
    设计实战 | 10个Kotlin项目深度解析:首页模块开发详解 ... [详细]
  • Elasticsearch 嵌套调用中动态类导致数据返回异常分析与解决方案 ... [详细]
  • Logstash安装配置
    阅读此文请先阅读上文:[大数据]-Elasticsearch5.3.1IK分词,同义词联想搜索设置,前面介绍了ES,Kiba ... [详细]
  • 第十三章go实现分布式网络爬虫单机版爬虫
     网络爬虫分为两类1.通用爬虫:类似于baidu,google.他们会把大量的数据挖下来,保存到自己的服务器上.用户打开跳转的时候,其实先是跳转到他们自己的服务器. 2.聚焦爬虫: ... [详细]
  • UNP总结 Chapter 12~14 IPv4与IPv6的互操作性、守护进程和inet超级服务器、高级I/O函数
    一、IPv4与IPv6的互操作性1.IPv4客户与IPv6服务器拥有双重协议栈的主机的一个基本特性就是:其上运行的IPv6服务器既能应付IPv4客户,又能应付IPv6客户。这是通过使用IPv4映射 ... [详细]
  • log4cpp概述与使用实例一、log4cpp概述Log4cpp是一个开源的C类库,它提供了C程序中使用日志和跟踪调试的功能,它的优点如下࿱ ... [详细]
  • 示例代码packagemainimport("net""os"&am ... [详细]
  • 深入解析CAS机制:全面替代传统锁的底层原理与应用
    本文深入探讨了CAS(Compare-and-Swap)机制,分析了其作为传统锁的替代方案在并发控制中的优势与原理。CAS通过原子操作确保数据的一致性,避免了传统锁带来的性能瓶颈和死锁问题。文章详细解析了CAS的工作机制,并结合实际应用场景,展示了其在高并发环境下的高效性和可靠性。 ... [详细]
  • 本书《.NET Core 2.* 开发者指南》是面向开发者的全面学习与实践手册,涵盖了从基础到高级的各个层面。书中详细解析了 .NET Core 的核心概念,包括如何创建 .NET Core 网站,并通过视频教程直观展示操作过程。此外,还深入探讨了 Startup 类的作用、项目目录结构的组织方式以及如何在应用中使用静态文件等内容。对于希望深入了解 .NET Core 架构和开发技巧的开发者来说,本书提供了丰富的实践案例和详尽的技术指导。 ... [详细]
  • Linux目录结构说明(2)一些重要文件目录1.一些重要文件目录参考1.一些重要文件目录1.网卡配置文件etcsysconfignetwork-scr ... [详细]
author-avatar
tengfei2008
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有