Hadoop & Spark 介绍
1. Hadoop 简介
2. MapReduce
3. HDFS
4. 数据采集、存储、计算
5. RPC
6. 序列化
7. Spark
1. Hadoop 简介
目前主流的大数据框架
大数据框架能处理传统计算技术所无法处理的大型数据集。它不是单一的技术或工具,而是涉及的业务和技术的许多领域。
目前主流的三大分布式计算系统分别为 Hadoop、Spark 和 Strom:
- Hadoop 是当前大数据管理标准之一,运用在当前很多商业应用系统。可以轻松地集成结构化、半结构化甚至非结构化数据集。
- Spark 采用了内存计算。从多迭代批处理出发,允许将数据载入内存作反复查询,此外还融合数据仓库,流处理和图形计算等多种计算范式。Spark 构建在 HDFS 上,能与 Hadoop 很好地结合。
- Storm 用于处理高速、大型数据流的分布式实时计算系统。为 Hadoop 添加了可靠的实时数据处理功能。
什么是 Hadoop?
The Apache™ Hadoop® project develops open-source software for reliable, scalable, distributed computing.
Hadoop 被公认是一套行业大数据标准开源软件,在分布式环境下提供了海量数据的处理能力。
Hadoop 使用 Java 编写,允许分布在集群,是专为从单一服务器到上千台机器的扩展,每个机器都可以提供本地计算和存储,即 Hadoop 就是一个分布式计算的解决方案。
Hadoop 可以编写和运行分布式应用来处理大规模数据,是专为离线和大规模数据分析而设计的,并不适合那种对几个记录随机读写的在线事务处理模式。
Hadoop = HDFS(文件系统,数据存储技术相关)+ Mapreduce(数据处理)。Hadoop 的数据来源可以是任何形式,在处理半结构化和非结构化数据上与关系型数据库相比有更好的性能,具有更灵活的处理能力,不管任何数据形式最终会转化为 key/value(key/value 是基本数据单元)。用函数式编程(Mapreduce)代替 SQL。SQL 是查询语句,而 Mapreduce 则是使用脚本和代码。不过对于习惯使用 SQL 的,Hadoop 也有开源工具 Hive 代替。
解决的核心问题
- 海量数据的存储(HDFS —— Hadoop Distributed File System)
- 海量数据的分析(MapReduce —— 并行计算模型/框架)
- 资源管理调度系统(YARN —— Yet Another Resource Negotiator)
Hadoop 特点
- 扩容能力(Scalable):能可靠地存储和处理千兆字节(PB)数据。
- 成本低(Economical):可以通过普通机器组成的服务器群来分发以及处理数据。这些服务器群总计可达数千个节点。
- 高效率(Efficient):通过分发数据,Hadoop 可以在数据所在的节点上并行地处理它们,这使得处理非常的快速。
- 可靠性(Reliable):Hadoop 能自动地维护数据的多份副本,并且在任务失败后能自动地重新部署(redeploy)计算任务。
使用场景
- 大数据量存储:分布式存储(如各种云盘)。
- 日志处理:Hadoop 擅长这个。
- 海量计算:并行计算。
- ETL:数据抽取到 Oracle、Mysql、DB2、Mongdb 及其他主流数据库。
- 使用 HBase 做数据分析:用扩展性应对大量读写操作(如 Facebook 构建了基于 HBase 的实时数据分析系统)。
- 机器学习:比如 Apache Mahout 项目(常见领域:协作筛选、集群、归类)。
- 搜索引擎:Hadoop + Lucene 实现。
- 数据挖掘:目前比较流行的广告推荐。
- 大量地从文件中顺序读。HDFS 对顺序读进行了优化,代价是对于随机的访问负载较高。
- 用户行为特征建模。
- 个性化广告推荐。
案例:
假如我有一个 100M 的数据库备份的 sql 文件,我现在想在不导入到数据库的情况下直接用 grep 操作通过正则过滤出我想要的内容。例如:某个表中含有相同关键字的记录。有几种方式,一种是直接用 linux 的命令 grep;还有一种就是通过编程来读取文件,然后对每行数据进行正则匹配得到结果好了现在是 100M 的数据库备份。
上述两种方法都可以轻松应对。那么如果是 1G,1T 甚至 1PB 的数据呢,上面 2 种方法还能行得通吗?答案是不能。毕竟单台服务器的性能总有其上限。那么对于这种超大数据文件怎么得到我们想要的结果呢?
解决方案就是分布式计算,分布式计算的核心就在于利用分布式算法把运行在单台机器上的程序扩展到多台机器上并行运行,从而使数据处理能力成倍增加。但是这种分布式计算一般对编程人员要求很高,而且对服务器也有要求。导致了成本变得非常高。
Hadoop 就是为了解决这个问题诞生的。Hadoop 可以很轻易的把很多 linux 的廉价 PC 组成分布式结点,然后编程人员也不需要知道分布式算法之类,只需要根据 mapreduce 的规则定义好接口方法,剩下的就交给 Haddop。它会自动把相关的计算分布到各个结点上去,然后得出结果。
例如上述的例子, Hadoop 要做的事:
- 首先把 1PB 的数据文件导入到 HDFS 中;
- 然后编程人员定义好 map 和 reduce,也就是把文件的行定义为 key,每行的内容定义为 value,然后进行正则匹配,匹配成功则把结果通过 reduce 聚合起来返回;
- Hadoop 会把这个程序分布到 N 个结点去并行的操作。
那么原本可能需要计算好几天,在有了足够多的结点之后就可以把时间缩小到几小时之内。
Hadoop 架构
Hadoop(2.x)架构:
- 底层:存储层。文件系统 HDFS,NoSQL Hbase 等。
- 中间层:资源及数据管理层。YARN 以及 Sentry 等。
- 上层:MapReduce、Impala、Spark 等计算引擎。
- 顶层:基于 MapReduce、Spark 等计算引擎的高级封装及工具,如 Hive、Pig、Mahout。
Hadoop 生态
2. Mapreduce
MapReduce是一种编程模型,用于支持能够并行处理的大型数据集,且其封装了并行计算、容错、数据分布、负载均衡等细节问题。
MapReduce 是 Hadoop 生态系统和 Spark 中的一个重要组件,其原理是分治算法(Divide-and-Conquer):通过把工作拆分成较小的数据集,完成一些独立任务,来支持大量数据的并行处理。
- MapReduce 从用户那里获取整个数据集,把它分割为更小的任务(MAP),然后把它们分配到各个工作节点。
- 一旦所有工作节点成功地完成了它们各自的独立任务,就会聚合(REDUCE)各独立任务的结果,然后返回整个数据集的结果。
通常,Map 和 Reduce 函数是用户定义的函数,它们解决了以往需要用代码解决的业务用例。
3. HDFS
HDFS(Hadoop File System)是 Hadoop 的分布式文件存储系统。
当数据量越来越多,在一个操作系统管辖的范围存不下了,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,因此迫切需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统,是一种允许文件通过网络在多台主机上分享的文件系统,可让多机器上的多用户分享文件和存储空间。分布式文件管理系统有很多,HDFS 只是其中一种。
- HDFS 将大文件分解为多个 Block(最基本的存储单位),每个 Block 保存多个副本(默认 3 个),HDFS 默认 Block 大小是 128MB,以一个 256MB 文件来说,则共有 256/128 = 2 个 Block。
- 不同于普通文件系统的是,HDFS中,如果一个文件小于一个数据块的大小,并不占用整个数据块存储空间 。
- HDFS 提供容错机制,副本丢失或者宕机时自动恢复。
HDFS 特点
- 通透性:让实际上是通过网络来访问文件的动作,由程序与用户看来,就像是访问本地的磁盘一般。
- 容错性:即使系统中有某些节点脱机,整体来说系统仍然可以持续运作而不会有数据损失。
- 适用于一次写入多次查询的情况(不可在线修改,只能下载修改后再上传)。
- 不支持并发写情况(比如一份数据分 8 块,那么得按顺序来写,而不能同时)。
- 不适用于小文件。
HDFS 的架构:主从结构
-
主节点只有一个:NameNode
-
从节点有很多个:DataNode
- 保存元数据信息:如文件属性,服务器,文件怎么存。
- 接收用户操作请求。
- 维护文件系统的目录结构。
- 管理文件与 block 之间关系、block 与 datanode 之间关系。
- 存储文件。
- 文件被分成 block 存储在磁盘上。
- 为保证数据安全,文件会有多个副本。
- 心跳检测。
HDFS 的 Shell
hadoop fs:该命令可以用于其他文件系统,不止是hdfs文件系统内,也就是说该命令的使用范围更广。
hadoop dfs:专门针对 hdfs 分布式文件系统。
hdfs dfs:和上面的命令作用相同,相比于上面的命令更为推荐。当使用 hadoop dfs 时实质内部会被转为 hdfs dfs 命令。
参数说明:
-help [cmd] //显示命令的帮助信息 -ls <path> //显示当前目录下所有文件 -ls -R(递归) -h(大小单位) -du(s) <path> //显示目录中所有文件大小 -count[-q] <path> //显示目录中目录和文件的数量 -mv <src> <dst> //移动多个文件到目标目录 -cp <src> <dst> //复制多个文件到目标目录 -rm(r) //删除文件(夹) -put <localsrc> <dst> //本地文件复制到hdfs -copyFromLocal //同put -moveFromLocal //从本地文件移动到hdfs -get [-ignoreCrc] <src> <localdst> //复制文件到本地,可以忽略crc校验 -getmerge <src> <localdst> //将源目录中的所有文件排序合并到一个文件中 -cat <src> //在终端显示文件内容 -text <src> //在终端显示文件内容 -copyToLocal [-ignoreCrc] <src> <localdst> //复制到本地 -moveToLocal <src> <localdst> -mkdir <path> //创建文件夹 -touchz <path> //创建一个空文件
4. 数据采集、存储、计算
数据采集和 DataFlow
对于数据采集主要分为三类,即结构化数据库采集、日志和文件采集、网页采集。
对于结构化数据库,采用 Sqoop 是合适的,可以实现结构化数据库中数据并行批量入库到 HDFS 存储。
对于网页采集,前端可以采用 Nutch,全文检索采用 Lucense,而实际数据存储最好是入库到 Hbase 数据库。
对于日志文件的采集,现在最常用的仍然是 Flume 或 Chukwa,但是如果对于日志文件数据需要进行各种计算处理再入库的时候,往往 Flume 并不容易处理,这也是为何可以采用 Pig 来做进一步复杂的 DataFlow 和 Process 的原因。
数据采集类似于传统的 ETL 等工作,因此传统 ETL 工具中的数据清洗、转换、调度等都是相当重要的内容。这一方面是要基于已有的工具,进行各种接口的扩展以实现对数据的处理和清洗,一方面是加强数据采集过程的调度和任务监控。
数据存储库
在这里先谈三种场景下的三种存储和应用方式,即 Hive,Impala、Hbase,其中三者都是基于底层的 HDFS 分布式文件系统。
- Hive 重点是 Sql-Batch(批处理)查询,适用于海量数据的统计类查询分析。
- Impala 重点是 Ad-Hoc(点对点)模式和交互式查询。Hive 和 Impala 都可以看作是基于 OLAP(Online analytical processing,联机分析处理)模式的。
- Hbase 重点是支撑业务的 CRUD(增删改查)操作,如各种业务操作下的处理和查询。
Hive
- Hive 是基于 Hadoop 的一个数据仓库工具,用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。Hive 重点是 Sql-Batch(批处理)查询,适用于海量数据的统计类查询分析。
- Hive 数据仓库工具能将结构化的数据文件映射为一张数据库表,并提供 SQL 查询功能,能将 SQL 语句转变成 MapReduce 任务来执行。
- Hive 的优点是学习成本低,可以通过类似 SQL 语句实现快速 MapReduce 统计,使 MapReduce 变得更加简单,而不必开发专门的 MapReduce 应用程序。
Impala
- Impala 是 Cloudera 公司主导开发的新型查询系统,它提供 SQL 语义,能查询存储在 Hadoop 的 HDFS 和 HBase 中的 PB 级大数据。已有的 Hive 系统虽然也提供了 SQL 语义,但由于 Hive 底层执行使用的是 MapReduce 引擎,仍然是一个批处理过程,难以满足查询的交互性。相比之下,Impala的最大特点也是最大卖点就是它的快速,Impala 本身是基于内存的 MPP(Massively Parallel Processing,大规模并行处理)机制。
- Impala 重点是 Ad-Hoc(点对点)模式和交互式查询。Hive 和 Impala 都可以看作是基于 OLAP(Online analytical processing,联机分析处理)模式的。
HBase
- HBase 是一个分布式的、面向列的开源数据库,是 Apache 的 Hadoop 项目的子项目,该技术来源于 Fay Chang 所撰写的 Google 论文“Bigtable:一个结构化数据的分布式存储系统”。
- 就像 Bigtable 利用了 Google 文件系统(File System)所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。
- HBase 不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是 HBase 基于列的而不是基于行的模式。
如何对上面三种模式提供共享一致的数据存储和管理服务,HCatalog 是基于 Apache Hadoop 之上的数据表和存储管理服务,提供统一的元数据管理。不需要知道具体的存储细节当然是最好的,但是 Hcatalog 本身也还处于完善阶段,包括和 Hive、Pig 的集成。
对于 MapReduce 和 Zookeeper 本身就已经在 Hbase 和 Hive 中使用到了。如 Hive 的 HQL 需要通过 MapReduce 解析和合并等。
实时流计算
数据的价值越来越被企业重视,被称为是 21 世纪的石油。
当存储了大规模的数据,我们要干什么呢,当然是分析数据中的价值,Hadoop 的 MapReduce 主要用于离线大数据的分析挖掘,比如电商数据的分析挖掘、社交数据的分析挖掘、企业客户关系的分析挖掘等,最终的目标就是 BI(商业智能)了,以提高企业运作效率,实现精准营销及各个垂直领域的推荐系统、发现潜在客户等等。在这个数据化时代,每件事都会留下电子档案,分析挖掘日积月累的数据档案,我们就能理解这个世界和我们自己更多。
但 MR 编写代码复杂度高,且由于磁盘 I/O,分析结果周期长,现实世界中我们对数据分析的实时性要求越来越高,基于内存计算的 Spark 来了。Hadoop+Spark 正在替代 Hadoop+MR 成为大数据领域的明星,Cloudera 正在积极推动 Spark 成为 Hadoop 的默认数据处理引擎。
同时 Twitter 也推出了 Storm 用来解决实时热点查询和排序的问题。
5. RPC
由远程过程调用中直接基于 TCP 进行远程调用,数据传输在传输层 TCP 层完成,更适合对效率要求比较高的场景。RPC 采用 C/S 模式,主要依赖于客户端和服务端之间建立 Socket 连接进行。
- 首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。
- 在服务器端,进程保持睡眠状态直到调用的信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息。
- 最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。
Hadoop 的整个体系结构就是构建在 RPC 之上(见 org.apache.hadoop.ipc),Server 和 Client 都由 Hadoop 完成。
6. 序列化
Hadoop 序列化的作用
- 序列化在分布式环境的两大作用:进程间通信,持久化存储。
- Hadoop 节点间通信。
Hadoop 序列化的特点
- 紧凑:高效使用存储空间。
- 快速:读写数据的额外开销小。
- 可扩展:可透明地读取老格式的数据。
- 互操作:支持多语言的交互。
7. Spark
什么是 Spark?
Apache Spark 是一个通用的集群计算系统。和 MapReduce 一样,它是与一组计算机(节点)一起工作、并行处理,来提高响应的时间。
MapReduce 采用拆分-应用-合并的策略进行数据分析,把拆分后的数据存储到集群的磁盘上。
相比之下,Spark 在其数据存储之上使用内存,可以在整个集群中并行地加载、处理数据。不过,跟 MapReduce 不同的是,Spark 集群有内存特性。它的内存特性能让 Spark Clusters 把数据缓存到节点上,而不是每次都从磁盘中获取数据(因为数据量巨大,所以通常需要很长时间的读写操作),变成了每个节点的一次性操作。比起 MapReduce,Spark 更有速度优势,因为它的数据分布和并行处理是在内存中完成的。
Spark 的流行,是因为它在内存中处理数据集,所以可以提供快速的结果和 MapReduce 所缺少的实时处理能力。
Spark 功能特点
- 高速(Speed)→因为它是内存处理的。
- 缓存(Caching)→Spark 有一个缓存层来缓存数据,加速处理进程。
- 部署(Deployment)→可以部署在 Hadoop 集群或自己的 Spark 集群中。
- 多语言(Polyglot)→代码可以用 Python、Java、Scala 和 R 编写。
- 实时(Real-time)→开发它的目的就是为了支持“实时”用例。
Spark vs Hadoop
有个常见问题是:当 MapReduce 已经成为 Hadoop 中的一部分时,为什么还要使用 Spark?或者,当 Spark 构建在 Hadoop 生态系统之上时,它有什么优势?
接下来,我们就一起来看一下 Spark 和 Hadoop 之间几个关键的区别:
Hadoop | Spark | |
性能 |
由于磁盘操作, 与 Spark 相比,MapReduce 相对较慢。 |
由于内存计算,与 MapReduce 相比,速度更快。 (Spark 在内存中运行要快 100 倍,在磁盘上快了 10 倍。 但当有其他需要资源的服务正在运行时,执行速度可能会降低。) |
数据处理 |
可用于批量处理(即连续步进式处理,sequential step-wise processing)。 |
可用于批量、实时和图形的方式处理。 |
机器学习 | Hadoop 使用 Mahout 进行代数运算,但缺乏 ML 库支持。 | Spark 有一个大型的 ML 库来构建管道、执行超参数调优(hyperparameter tuning)。 |
易于学习 |
MapReduce 没有交互模式,内置 API 的数量相对较少。 需要大量编程。 |
Spark 有很多高级 API,所以编程和交互较少。 |
成本 | Hadoop 更便宜,因为它只需要更多的磁盘存储空间。 | Spark 需要更高的 RAM 才能在内存中运行,所以成本更高。 |
容错 | Hadoop 跨多个节点复制数据,所以具有容错性。 | Spark RDD 因为它的内存特性,所以也具有一定的容错性 |
总结:
- 当系统需要更便宜、更独立的时间以及更大的容错能力时,要选择 Hadoop。
- 当算法是迭代的,并且需要交互式数据处理或机器学习时,就要选择 Spark。在需要实时分析/预测结果的时候,选择 Spark 也有一定优势。
RDD(Resilient Distributed Dataset)
Spark 数据的内存处理是使用弹性分布式数据集(Resilient Distributed Datasets----RDD)完成的,用户必须指定操作。
RDD 是提供 Spark 特性的支柱,负责数据的分发以及所有节点内存中操作。
- Spark 提供的主要概念是一个弹性的分布式数据集(RDD),它是跨集群节点划分的元素集合,可以进行并行的操作。RDD是通过从 Hadoop 文件系统(或任何其他 Hadoop 支持的文件系统)中的文件或驱动程序中现有的 Scala 集合开始,然后对其进行转换来创建的。用户还可以要求 Spark 将 RDD 持久化在内存中,或缓存 RDD 来提高性能,从而能让它在并行操作中有效地重用。最后,RDD 会自动从节点故障中恢复。
- RDD 是不可变的,这在自我恢复中起了很大的作用。不可变意味着需要存储用于生成 RDD 的转换序列。这是一个有向无环图(DAG),可以把数据集复制到多个节点上。所以,如果处理数据集分区的特定节点发生故障,集群管理器就可以把这个节点分配给沿袭的其他节点,并恢复正在处理的数据。
- RDD 是一种无模式的数据结构,可以处理结构化和非结构化数据。所有的操作都是在 RDD 上完成的,从一个 RDD 转换到另一个 RDD,最终把它们存储在持久存储中。它是一个不可变的分布式对象的集合,这些对象甚至可以是用户自定义的类别。RDD 支持延迟评估,直到执行了某一个操作,结果才被评估。转换产生新的 RDD,操作产生结果。
Spark 生态
Spark 生态系统的设计分为两层——第一层是 Spark Core,第二层是含有 libraries 和 API 的包。
第一层 Spark Core 层:Spark Core 是 Spark 生态系统的基础核心组件,整个生态系统都建立在它之上。
- 引擎(Spark Engine)— SPARK ENGINE 的计算引擎负责执行调度(将任务分解成更小的任务、调度任务、并行处理)、监控(报告故障)、和基本的 IO 功能(向集群提供数据)。它也是与集群管理器和数据管理器交互的管理中枢。
- 管理(Management)— Spark 集群可以通过 Hadoop YARN、Mesos 或 Spark 集群管理器进行管理。
- 库(Library)— Spark 生态系统包括 Spark SQL(用于 RDD 或外部数据源的类似 SQL 查询的运行)、Spark Mlib(用于机器学习)、Spark Graph X(用于构建更好的数据可视化图)、Spark 流(用于同一应用程序中的批量处理和流水式处理)。
- 存储(Storage)—数据可以存储在 Hadoop 文件系统(HDFS)、AWS 的 S3 系统、本地存储中,同时支持 SQL 和 NoSQL 数据库。
第二层 Saprk Core API 层:含有 libraries 和 API 的包。
Apache Spark Core API(在 R、SQL、Python、Scala 和 Java 中可用)最初是用来编写数据处理逻辑的。这些基于 RDD 的 API ,缺少了一些性能优化器。但是,因为没有额外的开销,所以它们还为用户提供了最大程度的个人定制和灵活性,可以根据公司的要求进行编程。
为了克服核心 API 的不足,提供更有针对性的支持,Apache Spark 在核心 API 的基础上引入了第二层。第二层通常分为 4 组逻辑 API/库:
- SparkSQL 和 Dataframes:这允许用户在 Spark 数据帧上执行 SQL 命令。它们主要用于结构化和半结构化数据。
- Streaming:这些 API 用于处理连续传入的无界数据流。
- Mllib:这个库支持所有可以部署在 Spark 框架上的机器学习活动。
- GraphX:是一个能让图形处理算法实施到可用数据集的库。
Spark 工作模式
Spark 主要有以下三种工作模式:
- 批处理模式——调度作业,并且有一个队列用于运行该作业的批处理,此过程无需人工干预。
- 流水式(Stream)处理模式——当数据流到来时,程序进行运行和处理
- 交互(Interactive)模式——用户在 shell 上执行命令,主要用于开发目的。
Spark 架构
SparkSpark 是由一个驱动节点(Driver Node)、集群管理器(Cluster Manager)和多个辅助节点(Secondary Node)组成的。
- 驱动节点包含具有 Spark 环境的驱动程序,驱动程序把用户提交的程序转换为 DAG。
- Spark 环境在集群管理器的帮助下,把任务(作业的可执行部分)分配给次要节点。
- 集群管理器负责分配驱动程序(执行作业所需的资源)。
- 次要节点负责执行任务,并将结果返回到环境的地方 。