# 大数据技术生态
在处理大数据的过程中,形成了数据采集与预处理、数据存储与管理、数据分析与挖掘以及数据可视化、数据应用等处理步骤,围绕这些处理步骤,人们开发出了很多大数据处理组件,每一个组件完成一个特定的功能,这些组件共同组成了大数据生态。
# Hadoop
Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。Hadoop实现了一个分布式文件系统( Distributed File System),其中一个组件是HDFS(Hadoop Distributed File System)。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,而MapReduce则为海量的数据提供了计算。
Hadoop得以在大数据处理应用中广泛应用得益于其自身在数据提取、变形和加载(ETL)方面上的天然优势。Hadoop的分布式架构,将大数据处理引擎尽可能的靠近存储,对例如像ETL这样的批处理操作相对合适,因为类似这样操作的批处理结果可以直接走向存储。Hadoop的MapReduce功能实现了将单个任务打碎,并将碎片任务(Map)发送到多个节点上,之后再以单个数据集的形式加载(Reduce)到数据仓库里。
# HDFS
Hadoop分布式文件系统(HDFS)是Hadoop生态系统的一部分,是一个高度可靠性、高吞吐量的分布式文件系统,专为存储大规模数据集而设计。
HDFS的优点包括:
- 高容错性:HDFS通过在多个节点上保存数据来提供容错性,即使某个节点宕机,也不会影响数据的可用性。
- 高可扩展性:HDFS可以在多个节点上存储PB级别的数据,支持水平扩展,可以根据需要增加更多的节点。
- 高吞吐量:HDFS的设计目标是高吞吐量的数据访问,因此它能够高效地处理大量数据。
- 低成本:HDFS是基于廉价的硬件构建的,因此它的成本相对较低。
HDFS的缺点包括:
- 低延迟:HDFS不适合需要低延迟的应用程序,因为它的设计目标是高吞吐量而不是低延迟。
- 适用范围:HDFS适用于大数据存储和处理,但不适用于一些小规模的数据存储和处理场景。
- 不支持多写:HDFS不支持多个客户端同时写入同一文件,因此在某些情况下可能会出现性能问题。
# MapReduce
MapReduce是一种分布式计算框架,可以用于大规模数据处理。它是由Google提出的一种计算模型,可以通过横向扩展来处理PB级别的数据。Hadoop是实现MapReduce的一种开源框架,它通过HDFS(Hadoop分布式文件系统)存储数据,并通过MapReduce处理数据。
MapReduce的处理流程包括两个步骤:Map和Reduce。Map步骤会将输入的数据进行处理,转换成键值对的形式;Reduce步骤会对Map处理后的键值对进行归并和汇总。MapReduce通过分布式处理大量数据,可以显著提高数据处理效率。
MapReduce的优点包括:
- 分布式计算:MapReduce的分布式计算模型可以在集群中多台计算机上同时处理数据,加速计算速度。
- 容错性:MapReduce可以处理节点失效的情况,保证数据不会丢失。
- 可伸缩性:MapReduce可以根据需要添加更多计算节点,以满足不断增长的数据处理需求。
MapReduce的缺点包括:
- 代码复杂:编写MapReduce程序需要一定的编程技巧,代码较为复杂。
- 低效性:MapReduce在处理小规模数据时效率较低,因为它需要启动很多进程来处理数据。
- 实时性差:MapReduce不适用于实时数据处理,因为数据处理需要多个步骤和较长的处理时间。
# YARN
YARN(Yet Another Resource Negotiator)是一个Hadoop的资源调度框架,主要用于对Hadoop集群中的资源进行管理和调度,让不同的应用程序可以在同一个集群上共享资源。YARN最初是在Hadoop 2.0中引入的,并且成为了Hadoop生态系统中的一个重要组件。
YARN的主要功能包括资源管理、任务调度和应用程序监控。它将集群资源分为容器(Containers),并为不同的应用程序分配不同的容器,这样不同的应用程序就可以在同一个集群上运行,互不干扰。此外,YARN还支持对任务的优先级进行设置,以便更好地满足不同应用程序的需求。
YARN实现了对多种处理框架的支持,包括MapReduce、Spark、Storm等。与Hadoop的早期版本相比,YARN架构的出现解决了Hadoop面临的许多问题,如性能瓶颈、可扩展性、灵活性和多框架支持等。
YARN的核心思想是将资源管理器与应用程序管理器分离开来,这两个组件分别负责资源的分配和任务的调度。其中资源管理器(ResourceManager)主要负责整个集群的资源管理和分配,而应用程序管理器(ApplicationMaster)则负责一个应用程序内部的任务调度和容错。在YARN架构下,每个应用程序(如MapReduce作业)都有自己的应用程序管理器,ResourceManager负责为其分配所需的资源,并根据需要调整资源分配。
# Hive
Hive是基于Hadoop的数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能,用于数据的提取、转化和加载(ETL)等数据仓库处理任务。
Hive使用类似SQL的查询语言HQL(Hive Query Language),支持将HQL语句翻译成MapReduce任务执行,也支持使用Tez和Spark等计算引擎。
Hive的优点包括:
- 语法类似SQL,易于使用和学习
- 可以通过SQL-like语法对Hadoop数据进行复杂的ETL操作
- 支持可扩展和自定义函数
- 可以通过Tez和Spark等计算引擎加速查询执行
- 可以将查询结果输出到HDFS、HBase或其他存储系统
Hive的缺点包括:
- 对于复杂的查询语句,可能会导致性能问题
- 由于是通过MapReduce执行任务,因此存在较高的延迟
- 由于使用的是Hadoop的分布式存储,因此不适合高速交互式查询
- 不支持ACID事务,因此不适合进行事务性操作
Hive适合对大规模数据进行复杂的ETL操作和批量查询分析,但不适合对实时性要求较高的查询场景。
# HBase
HBase是一个分布式、可伸缩、可靠的面向列的NoSQL数据库。它构建在Hadoop上,提供了对大规模数据的实时读写访问,支持数据的随机读写和实时查询。
HBase具有以下特点:
- 分布式存储:数据存储在多台服务器上,可以随时扩展。
- 列式存储:数据以列为基本存储单元,可以针对某些列进行查询和存取,灵活性高。
- 高可靠性:数据可以被复制到多台机器上,保证数据不会丢失。
- 高可扩展性:可以在需要的时候添加更多的机器,而无需停止服务。
- 实时查询:HBase支持快速的查询操作,可以处理数百亿条记录的实时查询请求。
- 支持嵌入式编程:HBase提供了丰富的API,可以方便地在Java和其他编程语言中进行嵌入式编程。
HBase的优点包括:
- 适用于高速插入、查询和更新海量数据。
- 支持在线数据访问和实时分析。
- 高可扩展性,可以通过添加更多的节点来提高存储和处理能力。
- 可以处理半结构化数据。
- 支持数据的多版本控制。
- 可以对数据进行分区和副本,提高数据的可用性和容错性。
- 可以与Hadoop和其他数据存储系统无缝集成。
HBase的缺点包括:
- 对于大多数场景,HBase相比于关系型数据库而言,学习成本更高,需要进行更多的配置和调优。
- 需要更多的硬件资源和更多的内存。
- 不支持ACID事务,无法支持关系型数据库的复杂查询操作。
- 对于小规模数据存储,HBase的性能可能不如关系型数据库。
# Mahout
Mahout 是 Apache Software Foundation(ASF) 旗下的一个开源项目,提供一些可扩展的机器学习领域经典算法的实现,旨在帮助开发人员更加方便快捷地创建智能应用程序。Mahout包含许多实现,包括聚类、分类、推荐过滤、频繁子项挖掘。此外,通过使用 Apache Hadoop 库,Mahout 可以有效地扩展到云中。
Mahout的主要特点包括:
- 分布式处理:Mahout基于Hadoop分布式处理框架,能够对大规模数据集进行高效处理,支持数据并行和任务并行。
- 多种机器学习算法:Mahout支持多种机器学习算法,包括分类、聚类、推荐、回归等,可以满足不同场景下的需求。
- 灵活性和可扩展性:Mahout提供了丰富的算法库和工具,同时也支持自定义算法和数据源,能够灵活应对不同的需求。
- 易于使用:Mahout提供了丰富的API和命令行工具,同时还有较为完善的文档和教程,方便用户快速上手和使用。
# Pig
Apache Pig 是apache平台下的一个免费开源项目,Pig为大型数据集的处理提供了更高层次的抽象,很多时候数据的处理需要多个MapReduce过程才能实现,使得数据处理过程与该模式匹配可能很困难。有了Pig就能够使用更丰富的数据结构。
用MapReduce进行数据分析。当业务比较复杂的时候,使用MapReduce将会是一个很复杂的事情,比如你需要对数据进行很多预处理或转换,以便能够适应MapReduce的处理模式。另一方面,编写MapReduce程序,发布及运行作业都将是一个比较耗时的事情。Pig的出现很好的弥补了这一不足。Pig能够让你专心于数据及业务本身,而不是纠结于数据的格式转换以及MapReduce程序的编写。本质是上来说,当你使用Pig进行处理时,Pig本身会在后台生成一系列的MapReduce操作来执行任务,但是这个过程对用户来说是透明的。
Pig LatinPig Latin 是一个相对简单的语言,一条语句 就是一个操作,与数据库的表类似,可以在关系数据库中找到它(其中,元组代表行,并且每个元组都由字段组成)。Pig 拥有大量的数据类型,不仅支持包、元组和映射等高级概念,还支持简单的数据类型,如 int、long、float、double、chararray 和 bytearray。并且,还有一套完整的比较运算符,包括使用正则表达式的丰富匹配模式。
# Zookeeper
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
假设我们有20个搜索引擎的服务器(每个负责总索引中的一部分的搜索任务)和一个总服务器(负责向这20个搜索引擎的服务器发出搜索请求并合并结果集),一个备用的总服务器(负责当总服务器宕机时替换总服务器),一个web的cgi(向总服务器发出搜索请求)。搜索引擎的服务器中的15个服务器提供搜索服务,5个服务器正在生成索引。这20个搜索引擎的服务器经常要让正在提供搜索服务的服务器停止提供服务开始生成索引,或生成索引的服务器已经把索引生成完成可以提供搜索服务了。使用Zookeeper可以保证总服务器自动感知有多少提供搜索引擎的服务器并向这些服务器发出搜索请求,当总服务器宕机时自动启用备用的总服务器。
# Sqoop
Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。Sqoop项目开始于2009年,最早是作为Hadoop的一个第三方模块存在,后来为了让使用者能够快速部署,也为了让开发人员能够更快速的迭代开发,Sqoop独立成为一个Apache项目。
# Flume
Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。Flume可以高效率的将多个网站服务器中收集的日志信息存入HDFS/HBase中
使用Flume,我们可以将从多个服务器中获取的数据迅速的移交给Hadoop中,除了日志信息,Flume同时也可以用来接入收集规模宏大的社交网络节点事件数据,比如facebook,twitter,电商网站如亚马逊,flipkart等。另外,Flume支持各种接入资源数据的类型以及接出数据类型,支持多路径流量,多管道接入流量,多管道接出流量,上下文路由,可以被水平扩展。
# Ambari
Apache Ambari是一种基于Web的工具,支持Apache Hadoop集群的供应、管理和监控。Ambari已支持大多数Hadoop组件,包括HDFS、MapReduce、Hive、Pig、 Hbase、Zookeeper、Sqoop和Hcatalog等。Apache Ambari 支持HDFS、MapReduce、Hive、Pig、Hbase、Zookeepr、Sqoop和Hcatalog等的集中管理。也是5个顶级Hadoop管理工具之一。
Ambari主要有以下优势:
- 通过一步一步的安装向导简化了集群供应。
- 预先配置好关键的运维指标(metrics),可以直接查看Hadoop Core(HDFS和MapReduce)及相关项目(如HBase、Hive和HCatalog)是否健康。
- 支持作业与任务执行的可视化与分析,能够更好地查看依赖和性能。
- 通过一个完整的RESTful API把监控信息暴露出来,集成了现有的运维工具。
- 用户界面非常直观,用户可以轻松有效地查看信息并控制集群。
# Oozie
Oozie是一个基于工作流引擎的开源框架,依赖于MapReduce来实现,是一个管理 Apache Hadoop 作业的工作流调度系统。是由Cloudera公司贡献给Apache的,它能够提供对Hadoop MapReduce和Pig Jobs的任务调度与协调。Oozie需要部署到Java Servlet容器中运行。
所谓工作流,即是指数据import进HDFS,然后用hive分析,然后将分析结果集export,把不同的结果集合并成最终结果,将不同的业务进行编排。Oozie的工作流任务是DAG(有向无环图)。所谓调度,即是指对作业或任务的定时执行,或者是事件的触发执行。触发执行的时机:在指定时间触发执行,或者当某目录下有数据集时触发执行。
Oozie集成了Hadoop的很多框架,如Java MapReduce、Streaming MapReduce、Pig、Hive、Sqoop、Distcp。一个Oozie Job也是一个MapReduce程序,仅仅只有map任务的程序,是分布式可扩展的。针对不同类型的任务编写的workflow,可以写成模板来直接套用。Oozie同JBoss jBPM提供的jPDL一样,也提供了类似的流程定义语言hPDL,通过XML文件格式来实现流程的定义。对于工作流系统,一般都会有很多不同功能的节点,比如分支、并发、汇合等等。Oozie定义了控制流节点(Control Flow Nodes)和动作节点(Action Nodes),其中控制流节点定义了流程的开始和结束,以及控制流程的执行路径(Execution Path),如decision、fork、join等;而动作节点包括Hadoop map-reduce、Hadoop文件系统、Pig、SSH、HTTP、eMail和Oozie子流程。
# Spark
Spark 是专为大规模数据处理而设计的快速通用的计算引擎。Spark拥有Hadoop MapReduce所具有的优点,Spark在Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark性能以及运算速度高于MapReduce。
Hadoop和Spark两者都是大数据框架,但是各自应用场景是不同的。Hadoop是一个分布式数据存储架构,它将巨大的数据集分派到一个由普通计算机组成的集群中的多个节点进行存储,降低了硬件的成本。Spark是那么一个专门用来对那些分布式存储的大数据进行处理的工具,它要借助hdfs的数据存储。
hadoop的MapReduce是分步对数据进行处理的,从磁盘中读取数据,进行一次处理,将结果写到磁盘,然后在从磁盘中读取更新后的数据,再次进行的处理,最后再将结果存入磁盘,这存取磁盘的过程会影响处理速度。spark从磁盘中读取数据,把中间数据放到内存中,完成所有必须的分析处理,将结果写回集群,所以spark更快。
Hadoop将每次处理后的数据都写入到磁盘上,基本谈不上断电或者出错数据丢失的情况。Spark的数据对象存储在弹性分布式数据集 RDD,RDD是分布在一组节点中的只读对象集合,如果数据集一部分丢失,则可以根据于数据衍生过程对它们进行重建。而且RDD 计算时可以通过 CheckPoint 来实现容错。
Hadoop提供分布式数据存储功能HDFS,还提供了用于数据处理的MapReduce。 MapReduce是可以不依靠spark数据的处理的。当然spark也可以不依靠HDFS进行运作,它可以依靠其它的分布式文件系统。但是两者完全可以结合在一起,hadoop提供分布式 集群和分布式 文件系统,spark可以依附在hadoop的HDFS代替MapReduce弥补MapReduce计算能力不足的问题。
Spark 提供了大量的库: 包括Spark Core、Spark SQL、Spark Streaming、MLlib、GraphX。支持多种资源管理器,Spark 支持 Hadoop YARN,及其自带的独立集群管理器。而且提供了很多高级 API,从而能够剥离了对集群本身的关注,使Spark应用开发者可以专注于应用所要做的计算本身。
# Flink
在当前的互联网用户,设备,服务等激增的时代下,其产生的数据量已不可同日而语了。各种业务场景都会有着大量的数据产生,如何对这些数据进行有效地处理是很多企业需要考虑的问题。以往我们所熟知的Map Reduce,Storm,Spark等框架可能在某些场景下已经没法完全地满足用户的需求,或者是实现需求所付出的代价,无论是代码量或者架构的复杂程度可能都没法满足预期的需求。新场景的出现催产出新的技术,Flink即为实时流的处理提供了新的选择。
Apache Flink 是一个框架和分布式处理引擎,用于在无边界和有边界数据流上进行有状态的计算。Flink 能在所有常见集群环境中运行,并能以内存速度和任意规模进行计算。Flink支持开发和运行多种不同种类的应用程序。它的主要特性包括:批流一体化、精密的状态管理、事件时间支持以及精确一次的状态一致性保障等。Flink 不仅可以运行在包括 YARN、 Mesos、Kubernetes 在内的多种资源管理框架上,还支持在裸机集群上独立部署。在启用高可用选项的情况下,它不存在单点失效问题。事实证明,Flink 已经可以扩展到数千核心,其状态可以达到 TB 级别,且仍能保持高吞吐、低延迟的特性。世界各地有很多要求严苛的流处理应用都运行在 Flink 之上。
Apache Flink是一个集合众多具有竞争力特性于一身的第三代流处理引擎,它的特点如下:
- 同时支持高吞吐、低延迟、高性能。Flink是目前开源社区中唯一一套集高吞吐、低延迟、高性能三者于一身的分布式流式处理框架。像Apache Spark也只能兼顾高吞吐和高性能特性,主要因为在Spark Streaming流式计算中无法做到低延迟保障;而流式计算框架Apache Storm只能支持低延迟和高性能特性,但是无法满足高吞吐的要求。
- 同时支持事件时间和处理时间语义。 在流式计算领域中,窗口计算的地位举足轻重,但目前大多数框架窗口计算采用的都是处理时间,也就是事件传输到计算框架处理时系统主机的当前时间。Flink能够支持基于事件时间语义进行窗口计算,也就是使用事件产生的时间,这种基于事件驱动的机制使得事件即使乱序到达,流系统也能够计算出精确的结果,保证了事件原本的时序性。
- 支持有状态计算,并提供精确一次的状态一致性保障。 所谓状态就是在流式计算过程中将算子的中间结果数据保存着内存或者文件系统中,等下一个事件进入算子后可以从之前的状态中获取中间结果中计算当前的结果,从而不须每次都基于全部的原始数据来统计结果,这种方式极大地提升了系统的性能,并降低了数据计算过程的资源消耗。
- 基于轻量级分布式快照实现的容错机制。 Flink能够分布式运行在上千个节点上,将一个大型计算任务的流程拆解成小的计算过程,然后将Task分布到并行节点上进行处理。在任务执行过程中,能够自动发现事件处理过程中的错误而导致的数据不一致问题,在这种情况下,通过基于分布式快照技术的Checkpoints,将执行过程中的状态信息进行持久化存储,一旦任务出现异常终止,Flink就能够从Checkpoints中进行任务的自动恢复,以确保数据中处理过程中的一致性。
- 保证了高可用,动态扩展,实现7 * 24小时全天候运行。 支持高可用性配置(无单点失效),和Kubernetes、YARN、Apache Mesos紧密集成,快速故障恢复,动态扩缩容作业等。基于上述特点,它可以7 X 24小时运行流式应用,几乎无须停机。当需要动态更新或者快速恢复时,Flink通过Savepoints技术将任务执行的快照保存在存储介质上,当任务重启的时候可以直接从事先保存的Savepoints恢复原有的计算状态,使得任务继续按照停机之前的状态运行。
- 支持高度灵活的窗口操作。 Flink将窗口划分为基于Time、Count、Session,以及Data-driven等类型的窗口操作,窗口可以用灵活的触发条件定制化来达到对复杂流传输模式的支持,用户可以定义不同的窗口触发机制来满足不同的需求。
针对这些数据类型主要包括以下场景,Flink对这些场景都有非常好的支持。
实时智能推荐 利用Flink流计算帮助用户构建更加实时的智能推荐系统,对用户行为指标进行实时计算,对模型进行实时更新,对用户指标进行实时预测,并将预测的信息推送给Web/App端,帮助用户获取想要的商品信息,另一方面也帮助企业提高销售额,创造更大的商业价值。
复杂事件处理 例如工业领域的复杂事件处理,这些业务类型的数据量非常大,且对数据的时效性要求较高。我们可以使用Flink提供的CEP(复杂事件处理)进行事件模式的抽取,同时应用Flink的SQL进行事件数据的转换,在流式系统中构建实时规则引擎。
实时欺诈检测 在金融领域的业务中,常常出现各种类型的欺诈行为。运用Flink流式计算技术能够在毫秒内就完成对欺诈判断行为指标的计算,然后实时对交易流水进行规则判断或者模型预测,这样一旦检测出交易中存在欺诈嫌疑,则直接对交易进行实时拦截,避免因为处理不及时而导致的经济损失
实时数仓与ETL 结合离线数仓,通过利用流计算等诸多优势和SQL灵活的加工能力,对流式数据进行实时清洗、归并、结构化处理,为离线数仓进行补充和优化。另一方面结合实时数据ETL处理能力,利用有状态流式计算技术,可以尽可能降低企业由于在离线数据计算过程中调度逻辑的复杂度,高效快速地处理企业需要的统计结果,帮助企业更好的应用实时数据所分析出来的结果。
流数据分析 实时计算各类数据指标,并利用实时结果及时调整在线系统相关策略,在各类投放、无线智能推送领域有大量的应用。流式计算技术将数据分析场景实时化,帮助企业做到实时化分析Web应用或者App应用的各种指标。
实时报表分析 实时报表分析说近年来很多公司采用的报表统计方案之一,其中最主要的应用便是实时大屏展示。利用流式计算实时得出的结果直接被推送到前段应用,实时显示出重要的指标变换,最典型的案例就是淘宝的双十一实时战报。