最近一直没更新,不是因为懒,而是要学的东西太多了,时间全用来学大数据的技术栈了,见谅。
言归正传,这篇科普文章就给大家讲讲大数据的技术栈和生态圈,让大数据不再神秘!
何谓大数据?
大数据的Wiki英文引文中的解释如下:
The tools, processes and procedures allowing an organization to create, manipulate, and manage very large data sets and storage facilities.
允许组织去创建,操纵和管理巨量数据集和存储设施的工具,过程和程序。
因此,从广义上来说,大数据是一个抽象的概念,它包含了巨量数据本身以及处理它所需要的工具、过程以及程序。从狭义上说,大数据就是各种来源结构化和非结构化的数据集合,通常这种数据集合造成传统软件在可接受的时间内进行数据处理的能力。
随着时间的推移,数据的单位增长随着软硬件的不断进步,而呈现出指数倍的增长,在气象学、基因组学、神经网络体学、复杂的物理模拟、生物及环境研究、金融、电商等各个领域,数据的体量已经大到传统的软件程序对其进行分析处理的时间无法承受,也许可能计算一次大气模拟需要一个月之久才能得到结果,但得到的结果的时候已经失去了其本身计算的意义。
截止2012年,全世界每天产生2.5EB(1EB=1000PB=1000000TB=1000000000GB)的数据,采用传统的软件处理数据已经是穷途末路,大数据技术的产生是大势所趋。
大数据的特点
大数据的特点可以使用5个V来介绍,分别是Velocity、Value、Veracity、Variety、Volume。
- Velocity(速度):大数据的产生速度是非常迅速的,图中也介绍了这个特性中的几个要点,分别是批量化产生、近乎实时的要求、处理速度快、以及支持流式处理操作。可以想象,如果一个公司的搜索引擎不能近乎实时且精准地返回用户想要查询的结果,那么这家公司一定会被市场淘汰掉。
- Value(价值):数据的增加并不代表数据的价值增加,在一般的情况下,数据价值的密度较低,这是一个沙里淘金的过程。如何采用合适的算法模型来对数据进行分析、挖掘,寻找数据中的价值是未来相当长的一段时间内学界、业界需要共同努力的事情。
- Veracity(真实性):这里指的是数据的可信度。一般而言,大数据需要确保获得的数据具有真实性的意义,否则一切都是无意义的徒劳。
- Variety(种类):大数据的种类和来源是多样化的,其中包括结构化、半结构化和非结构化的数据,具体表现有文本数据、音视频数据、图片、地理位置数据等等。多类型的数据对目标企业或机构的数据的处理能力就提出了更高的要求。
- Volume(体量):毋庸置疑,大数据的数据体量是非常庞大的,通常意义上来说,一次计算的体量至少都应该是GB级别,大多数都是TB级别,有的甚至在PB、EB。
大数据的技术栈
从业务流的角度进行分析,大数据的技术栈的功能主要针对数据提供:采集、清洗、存储、查询、计算、可视化等功能。针对这些功能,各个技术机构针对自己的业务需求,开发了可用的框架,目前这些技术框架有很多,我们可以看下面这张图,来宏观感受一下。
不要被吓到,这里的所有技术并不会要求你全部搞定,一般的大数据从业人员也只需要会每隔小部分中最重要的一个或几个技术就够了。在众多的技术中,最让人熟悉的莫过于Hadoop技术生态圈里的内容了,因此我首先来介绍一下有关Hadoop的技术生态圈,让大家了解Hadoop的各种技术之间是怎么进行协同工作的。
上图是一个Hadoop的技术生态圈,里面包括了Hadoop全部的技术栈,各个技术都充当了整个大数据处理流程中的某个特定角色,下面我来挨着解释一下。
1、HDFS
HDFS,全称为Hadoop Distributed File System,叫做Hadoop分布式文件系统。它是Hadoop生态系统中最重要的组件。 HDFS是Hadoop的主要存储系统。 Hadoop分布式文件系统(HDFS)是基于Java的文件系统,可为大数据提供可伸缩、容错、可靠且经济高效的数据存储。 HDFS是在商用硬件上运行的分布式文件系统。它支持通过类似shell的命令的直接交互。HDFS其内部有两个最重要的组件,分别是NameNode和DataNode。
NameNode,不存储实际的数据而是对文件系统内的元数据进行管理,比如数据块信息、数据分布的存放节点与位置、DataNode节点的数据存放细节等,在同一个集群中,此组件要求只能有一个处于工作状态。
DataNode,负责在HDFS中存储实际数据。DataNode根据客户端的请求执行读取和写入操作。DataNode的副本块由文件系统上的2个文件组成。第一个文件用于数据,第二个文件用于记录块的元数据。在启动时,每个DataNode连接到其相应的NameNode并进行握手。命名空间ID和DataNode的软件版本的验证通过握手进行。发现不匹配时,DataNode自动关闭。DataNode根据NameNode的指令执行诸如块副本创建,删除和复制之类的操作。
2、Mapreduce
Hadoop MapReduce是提供数据处理的核心Hadoop生态系统组件。MapReduce是一个大数据计算框架,用于处理Hadoop分布式文件系统中存储的大量结构化和非结构化数据的计算应用程序。MapReduce程序本质上是并行的,因此对于使用集群中的多台计算机执行大规模数据分析非常有用。因此,它提高了集群并行处理的速度和可靠性。
在MapReduce中,有两个阶段,分别是Map阶段和Reduce阶段。每个阶段都有键值对作为输入和输出。Map函数获取一组数据并将其转换为另一组数据,其中个元素分解为元组(键值对)。Reduce函数将Map的输出作为输入,并根据键组合这些数据元组,并相应地修改键的值。
该框架拥有运行处理PB级数据的能力,以及快速、高容错性等特点,是Hadoop生态圈中很重要的技术框架。
3、YARN
Hadoop Yarn(Yet Another Resource Negotiator),是提供资源管理的Hadoop生态系统组件。Yarn也是Hadoop生态系统中最重要的组件之一。 YARN被称为Hadoop的操作系统,因为它负责管理和监视工作负载。它允许多个数据处理引擎(例如实时流和批处理)处理存储在单个平台上的数据。
Yarn具有灵活性的特点,除了可以用于批处理计算框架,比如MapReduce外,还可以用于其他模式的数据处理,比如交互式和流式处理模式。由于这个优势,其他的计算框架也可以在Yarn的资源调度下,与MapReduce程序一起运行,提高了Hadoop集群的服务效率。另外,Yarn还具有高共享性的特点,在多个工作负载之间提供稳定、可靠、安全的共享操作服务,所以在对于数据处理的过程中,可以使用其他的编程模型,比如图形处理模型或迭代模型等。
4、ZooKeeper
Apache Zookeeper是Hadoop生态系统的重要组件,提供了分布式应用程序的协调服务,它是一个为分布式应用提供一致性服务的软件,包括阿配置维护、域名服务、分布式同步、组服务等。
Zookeeper的特性有以下几个方面:
* 顺序一致性,从同一个客户端发起的事务请求,最终将会严格地按照其发起顺序被应用到Zookeeper中去。
* 原子性,所有事务请求的处理结果在整个集群中所有机器上的应用情况是一致的,即整个集群要么都成功应用了某个事务,要么都没有应用。
* 单一视图,无论客户端连接的是哪个 Zookeeper 服务器,其看到的服务端数据模型都是一致的。
* 可靠性,一旦服务端成功地应用了一个事务,并完成对客户端的响应,那么该事务所引起的服务端状态变更将会一直被保留,除非有另一个事务对其进行了变更。
* 实时性,Zookeeper 保证在一定的时间段内,客户端最终一定能够从服务端上读取到最新的数据状态。
这个技术的出现,在总体上解决了我们所说的拜占庭将军问题,也就是分布式系统中最大的难题,即协调一致的问题。当然,顺便提一句,在分布式系统领域,有一篇很重要的论文,名字叫做《Paxos Made Simple》,有兴趣各位可以读一下。
5、Hive
Apache Hive是一个开源数据仓库系统,是一个数据分析框架,其用于查询和分析存储在Hadoop文件中的大型数据集。Hive具有三个主要功能:数据汇总,查询和分析。Hive使用称为HiveQL(HQL)的语言,与SQL相似。 HiveQL自动将类似SQL的查询转换为MapReduce作业,该作业将在Hadoop上执行。简而言之,Hive就是在Hadoop上架了一层SQL接口,可以将SQL翻译成MapReduce去Hadoop上执行,这样就使得数据开发和分析人员很方便的使用SQL来完成海量数据的统计和分析。
6、Pig(目前用的很少了)
Apache Pig是用于分析和查询HDFS中存储的巨大数据集的高级语言平台。Pig作为Hadoop生态系统的组成部分,使用PigLatin语言。它与SQL非常相似。它加载数据,应用所需的过滤器并以所需格式转储数据。为了执行程序,Pig需要Java运行时环境。
7、HBase
Apache HBase是Hadoop生态系统组件,它是一个分布式数据库,旨在将结构化数据存储在可能具有数十亿行和数百万列的表中。 HBase是基于HDFS构建的可扩展,分布式和NoSQL数据库。 HBase,提供对HDFS中读取或写入数据的实时访问。
有两个HBase组件,即HBase Master和RegionServer。HBaseMaster,它不是实际数据存储的一部分,而是协商所有RegionServer之间的负载平衡,同时其维护和监视Hadoop集群。具体来说,它执行管理(用于创建,更新和删除表的界面。)、控制故障转移、处理DDL操作。RegionServer是工作节点,负责处理来自客户端的读取,写入,更新和删除请求,进程在Hadoop群集中的每个节点上运行,一般与HDFS DateNode节点保持一致,保证计算向数据移动的特性。
8、HCatalog
Apache HCatalog是Hadoop的表和存储的管理层。它支持Hadoop生态系统中可用的不同组件,例如MapReduce,Hive等,以轻松地从集群读取和写入数据。HCatalog是Hive的关键组件,使用户能够以任何格式和结构存储其数据。在默认情况下,HCatalog支持RCFile,CSV,JSON,sequenceFile和ORC文件格式。
9、Avro
Acro是Hadoop生态系统的一部分,是最流行的数据序列化系统。Avro是一个开源项目,为Hadoop提供数据序列化和数据交换服务。这些服务可以一起使用,也可以独立使用。大数据可以使用Avro交换以不同语言编写的程序。使用序列化服务程序可以将数据序列化为文件或消息。它将数据定义和数据存储在一个消息或文件中,使程序可以轻松地动态了解存储在Avro文件或消息中的信息。Avro模式–依靠模式进行序列化/反序列化。Avro需要用于数据写入/读取的架构。当Avro数据存储在文件中时,其架构也随之存储,因此以后任何程序都可以处理文件。动态类型化–指不生成代码的序列化和反序列化。它补充了代码生成功能,该功能可在Avro中用于静态类型的语言,作为可选优化。
10、Thrift
Apache Thrift是一个轻量级、跨语言的远程服务调用框架,最初是由FaceBook开发,后面进入了Apache开源项目。它通过自身的IDL中间语言, 并借助代码生成引擎生成各种主流语言的RPC服务端/客户端模板代码。在Hadoop的技术生态中,很多技术均用到了此框架的技术。
11、Drill
Apache Drill是一个低延迟的分布式海量数据(涵盖结构化、半结构化以及嵌套数据)交互式查询引擎,使用ANSI SQL兼容语法,支持本地文件、HDFS、HBase、MongoDB等后端存储,支持Parquet、JSON、CSV、TSV、PSV等数据格式。本质上Apache Drill是一个分布式的mpp(大规模并行处理)查询层。Drill的目的在于支持更广泛的数据源,数据格式,以及查询语言。受Google的Dremel启发,Drill满足上千节点的PB级别数据的交互式商业智能分析场景。
12、Mahout
Apache Mahout提供了一些经典的机器学习的算法,皆在帮助开发人员更加方便快捷地创建智能应用程序。通过ApacheMahout库,Mahout可以有效地扩展到云中。Mahout包括许多实现,包括聚类、分类、推荐引擎、频繁子项挖掘。Apache Mahout的主要目标是建立可伸缩的机器学习算法。这种可伸缩性是针对大规模的数据集而言的。通过Apache Mahout的算法库,Mahout可以有效地使用Hadoop集群的能力进行机器学习的计算与分析。
13、Sqoop
Apache Sqoop是一款用于hadoop和关系型数据库之间数据导入导出的工具。你可以通过Sqoop把数据从数据库(比如mysql,oracle)导入到HDFS中;也可以把数据从HDFS中导出到关系型数据库中。Sqoop通过Hadoop的MapReduce导入导出,因此提供了很高的并行性能以及良好的容错性。
14、Flume
Apache Flume是一个分布式的、可靠的、可用的,从多种不同的源收集、聚集、移动大量日志数据到集中数据存储的系统。Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力 。Flume提供了从console(控制台)、RPC(Thrift-RPC)、text(文件)、tail(UNIX tail)、syslog(syslog日志系统),支持TCP和UDP等2种模式,exec(命令执行)等数据源上收集数据的能力。它使用一个简单的可扩展数据模型,该模型可用于在线分析应用程序。
15、Ambari
Apache Ambari的功能就是创建、管理、监视Hadoop的集群,这里的Hadoop是广义,指的是 Hadoop 整个生态圈(例如 Hive、Hbase、Sqoop、Zookeeper等)。用一句话来说,Ambari 就是为了让 Hadoop 以及相关的大数据软件更容易使用的一个工具。随着Ambari为操作控制提供一致,安全的平台,Hadoop管理变得更加简单。
16、Oozie
Apache Oozie是用于管理Hadoop作业的工作流调度程序系统。 Oozie将多个作业依次组合为一个逻辑工作单元。 Oozie框架与作为架构中心的Apache Yarn完全集成,并支持Apache MapReduce、Hive、Sqoop等Hadoop技术中需要调度的作业。
以上是Hadoop技术生态圈的讲解,但这里还没有完,因为在目前业界使用最广泛的大数据技术中,还有几个技术不得不提一下。
17、Spark
Apache Spark是一个基于Scala语言编写的分布式计算框架,最初是由加州大学伯克利分销AMPLab实验室开发,相对于MapReduce计算框架,它减少了内存与磁盘的IO操作,从而提高了计算时间。Spark采用了基于内存的运算,将中间数据结果存储在内存中,方便下次计算调用。该框架的计算速度根据官网的介绍,基于内存的计算中比MapReduce快100倍,基于磁盘的计算中比MapReduce快10倍。Spark内部有五个重要组成部分,分别是Spark Core、Spark SQL、Spark Streaming、MLlib和GraphX。在存在递归迭代运算的场景下,Spark非常适合。
18、Elastic Search
Elastic Search是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr,也是基于Lucene。它的核心算法是倒排索引算法。
19、Kafka
Apache Kafka是一种分布式的,基于发布 / 订阅的消息系统,采用Java和Scala编写。该平台为处理即时数据提供了统一、高吞吐、低延迟的服务。目前越来越多的开源分布式处理系统如Cloudera、Apache Storm、Spark都支持与Kafka集成。Kafka是一个消息系统,原本开发自LinkedIn,用作 LinkedIn 的活动流(Activity Stream)和运营数据处理管道(Pipeline)的基础。现在它已被多家不同类型的公司 作为多种类型的数据管道和消息系统使用。它能够以时间复杂度为 O(1) 的方式提供消息持久化能力,即使对 TB 级以上数据也能保证常数时间复杂度的访问性能。它拥有高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒 100K 条以上消息的传输。它支持 Kafka Server 间的消息分区,及分布式消费,同时保证每个 Partition 内的消息顺序传输。它同时支持离线数据处理和实时数据处理。最后它还支持在线水平扩展。
20、Flink
Apache Flink是一个框架和分布式处理引擎,用于在无边界和有边界数据流上进行有状态的计算。Flink能在所有常见集群环境中运行,并能以内存速度和任意规模进行计算。Apache Flink 是一个分布式系统,它需要计算资源来执行应用程序。Flink 集成了所有常见的集群资源管理器,例如 Hadoop YARN、 Apache Mesos 和 Kubernetes,但同时也可以作为独立集群运行。Flink被设计为能够很好地工作在上述每个资源管理器中,这是通过资源管理器特定(resource-manager-specific)的部署模式实现的。Flink 可以采用与当前资源管理器相适应的方式进行交互。部署 Flink 应用程序时,Flink 会根据应用程序配置的并行性自动标识所需的资源,并从资源管理器请求这些资源。在发生故障的情况下,Flink 通过请求新资源来替换发生故障的容器。提交或控制应用程序的所有通信都是通过 REST 调用进行的,这可以简化 Flink 与各种环境中的集成。Flink旨在任意规模上运行有状态流式应用。因此,应用程序被并行化为可能数千个任务,这些任务分布在集群中并发执行。所以应用程序能够充分利用无尽的 CPU、内存、磁盘和网络 IO。而且 Flink 很容易维护非常大的应用程序状态。其异步和增量的检查点算法对处理延迟产生最小的影响,同时保证精确一次状态的一致性。
以上就是大数据应用比较广泛的技术架构的介绍。
最后我想说的是,技术会一直更新演变下去,但核心的思想总是不会改变的,在学习技术的过程中,需要的是对思想的理解与运用,而不是就一个技术而学一个技术。同时,没有任何一个技术是完美无缺的,只有适合与不适合的区别。在实际的业务场景下,根据公司的实际情况,选择合适的大数据技术架构完成需求业务才是重中之重。