大数据简介
真正意义上的大数据技术源于互联网行业,其中的引领者就是谷歌,因其需要处理巨量的数据就提出了一系列的相关技术,这些技术均以论文的形式对外公开。
Hadoop 和 Spark 分布式大数据技术框架
这些公开的论文直接推动了开源社区的大数据技术栈,其中应用最为广泛的是以 Hadoop 和 Spark 为核心的生态系统:
数据收集层
顾名思义就是从各个源来获取数据,他们是底层数据源到数据存储层之间的桥梁:
- Sqoop/Canal: 从关系型数据库中搜集数据
- Flume: 非关系性数据搜集工具,主要就是流式日志数据这类半结构化数据,这些工具能够实时收集并直接处理后加载到数据存储层
- Kafka: 分布式消息队列,一般作为数据总线使用,其他非结构化的数据可以通过各种途径的处理来合并到数据总线中
数据存储层
主要由分布式文件系统(面向文件的存储)和分布式数据库(面向行/列的存储)构成,他们的核心就是存储大型数据集并保证容错性,而解决方案就是分布式分块存储(块来提供冗余):
- HDFS: Hadoop 分布式文件系统,Google GFS 的开源实现,具有良好的扩展性与容错性等特点。目前开源社区开发了各种类型的兼容 HDFS 的数据存储格式,其中 ORC 是官方提供的,最流行的是 Parquet
- HBase: 构造在 HDFS 之上的分布式数据库,Google BigTable 的开源实现,允许用户存储结构化与半结构化数据,支持行列无限扩展以及数据随机查找与删除
资源管理与服务协调
他们用于统一管理和调度系统,YARN 能够直接管理集群中的各种资源(CPU、内存等),并按照一定的策略分配给上层的各类应用。这里的工具主要就是屏蔽分布式系统的复杂性能够让用户使用统一的接口来将管理集群看作是一个整体来操作。
计算引擎层
面向用户的一层,他包括批处理、交互式处理和流式实时处理三种引擎。
其中 MapReduce 式一个经典的批处理计算引擎,它允许用户通过简单的 API 编写分布式程序。Tez 基于 MapReduce 开发了 DAG(Directed Acyclic Graph)计算引擎,能够更加高效的实现复杂数据处理逻辑。
而 DAG 的通用计算引擎 Spark 提供了基于 RDD(Resilient Distributed Dataset)的数据抽象表示,允许用户充分利用内存来进行快速的数据挖掘和分析。
Presto 和 Impala 允许用户使用标准的SQL来处理存储在 Hadoop 中的数据,他们采用并行数据库架构,内置了查询优化器、查询/投影下推,代码生成等优化机制来提高处理效率。
Storm 和 Spark Streaming 则是分布式流式实时计算引擎,具有良好的容错性和扩展性,能够高效的处理流式数据。
数据分析层
为了方便用户解决大数据问题而提供的数据分析工具。
- Hive/Pig/SparkSQL: 在计算引擎之上构建的支持 SQL 或脚本语言 ORM 的分析系统,大大降低了用户进行大数据分析的门槛,其中 Hive/Pig 是基于 MapReduce 的,而 SparkSQL 顾名思义就是基于 Spark 的
- Mahout/MLlib: 在计算引擎之上构建的机器学习库,实现了常见的机器学习和数据挖掘算法,目前他们都是基于 Spark 实现的
- Apache Beam/Cascading: 基于各种计算机框架而封装的高级 API,方便用户构建复杂的数据流水线
单机技术框架
Hadoop 框架是分布式架构,最核心的就是构建了 HDFS 这个分布式文件系统,它旨在解决 PB 级别的大数据处理。Spark 等框架也是为了屏蔽分布式的复杂性,能够让用户以类似本地文件系统那样对数据进行操作。
但是大多数时候我们都没有这么大的数据量,单机操作基本上已经能够覆盖 99% 的情况了。这避免了分布式系统的复杂性以及各种传输损耗性能也更加优异。
单机就是下没有了那么多的中间层,简化到直接在传统数据库、CSV 文件等现有技术上进行操作。当然为了性能优化也借鉴了分布式的特点使用了列式存储文件来保存数据,当然他们通常也会兼容 HDFS 接口,其中比较流行的就是 Parquet 和 pyarrow。当然还有 DuckDB 这样的列式存储格式。
当然对于计算引擎层和数据分析层比较常见的就是 Pandas、DuckDB 以及 Arrow。当然他们各自的适用范围都有所不同:
- Pandas: 存粹的数据分析层,提供了各种数据导入、数据分析和数据呈现工具
- DuckDB: 类似于单机版的 Spark 框架,提供了一个面向大数据的完备的数据库系统
- Arrow: 核心是提供了一个跨语言的内存数据格式,旨在高效的进行数据交换。尽管它也提供了比较完备的数据分析能力
通常的做法可以是使用 Arrow 的格式来存储数据,使用 DuckDB 来使用 SQL 进行数据分析,最终发送给 Pandas 来统计呈现