Spark是否会替代Hadoop?

我经常会从客户或者网上听到这个问题,尤其是最近几年。那么关于spark哪些被我们神化了,哪些又是真实的,以及它在“大数据”的生态系统中又是怎样的?
这里写图片描述
说实话,其实我把这个问题作为标题是有问题的,但是我们经常会这样问。Hadoop并不是一个单独的产品而是一个生态系统,而spark也是一样的。下面让我们来一个一个解释。目前Hadoop生态系统主要包括:

  1. HDFS—Hadoop分布式文件系统。它是一个分布式的、面向块的、不可更新的、高度伸缩性的、可运行在集群中普通硬盘上的文件系统。此外,HDFS还是一个独立的工具,它可以独立于Hadoop生态系统中其他组件而运行(但是如果我们想要使HDFS高可用时,还需要依赖zookeeper和日志管理器,但这又是另外一码事了)。
  2. MapReduce框架—这是一个基本的在集群中一组标准硬件上执行的分布式计算框架。我们没必要一定在HDFS张使用它—因为文件系统是可插拔的;同样的,我们也没必要一定在yarn中使用它,因为资源管理器是可插拔的:例如我们可以用Mesos来替换它。
  3. YARN—Hadoop集群中默认的资源管理器。但是我们可以在集群中不使用yarn,而是将我们的mr(译注:map/reduce)任务运行在Mesos之上;或者仅仅在集群中运行不需要依赖yarn的hbase。
  4. Hive—Hive是一个构建在MapReduce框架之上的类sql查询引擎,它可以将hiveQL语句转换为一系列运行在集群中的mapReduce任务。此外,hdfs也不是唯一的存储系统,也不一定非得使用MapReduce框架,比如在这里我么可以替换为Tez。
  5. Hbase—基于HDFS的键值对存储系统,为Hadoop提供了联机事务处理(OLTP)能力。Hbase仅仅依赖HDFS和zookeeper;但是Hbase只能依赖于HDFS吗?不是的,Hbase除了可以运行在HDFS上之外,还可以运行在Tachyon(内存文件系统)、MapRFS、IBM GPFS以及其他一些框架之上。
    这里写图片描述
    就这么多了。此外你可能还会想到storm可以处理数据流,但是它完全独立于hadoop,可以独立运行;你可能还会想到运行于MapReduce之上的机器学习框架Mahout,但它在之前被社区关注的越来越少。下图为Mahout被反馈的问题(红色)和被解决的问题(绿色)趋势图:
    这里写图片描述
    下面我们来说说spark,它主要包含以下几个方面:
  6. Spark Core – 用于通用分布式数据处理的引擎。它不不依赖于任何其他组件,可以运行在任何商用服务器集群上。
  7. Spark Sql – 运行在Spark上的SQL查询语句,支持一系列SQL函数和HiveQL。但是还不是很成熟,所以不要在生产系统中使用;而HiveQL集成了需要的hive元数据和Hive相关的jar包。
  8. Spark Streaming – 基于spark的微批处理引擎,支持各种各样数据源的导入。唯一依赖的是Spark Core引擎。
  9. MLib – 构建在spark之上的机器学习库,支持一系列数据挖掘算法。
    这里写图片描述
    此外我们这里还要讲到的是一个关于spark的重要误区—“spark是基于内存的技术”。它不是基于内存的技术;spark是一个管道式的执行引擎,而且在shuffle的过程中会将数据写入磁盘(比如说,如果我们想针对某个字段做聚合操作)、如果内存不够的话也一样会内存溢出(但是内存可以调整)。因此,spark之所以比MapReduce快主要是因为它是管道式处理方式而不是有些人说的“基于内存的优化”。当然,spark在内存中做了缓存来提高性能,但这不是spark真正工作快的原因。
    现在,我们再来完整比对一下:
  10. MapReduce可以被Spark Core替换?是的,它会随着时间的推移被替代,而且这种替代是合理的。但是spark目前还不是特别成熟能完全替代MapReduce。此外,也没有人会完全放弃MapReduce,除非所有依赖MapReduce的工具都有可替代方案。比如说,想要在pig上运行的脚本能在spark上执行还是有些工作要做的。
  11. Hive可以被Spark SQL替换?是的,这又是对的。但是我们需要理解的是Spark SQL对于spark本身来说还是比较年轻的,大概要年轻1.5倍。相对于比较成熟的Hive来说它只能算是玩具了吧,我将在一年半到两年之内再回头来看Spark SQL.。如果我们还记得的话,两到三年前Impala就号称要终结Hive,但是截止到目前两种技术也还是共存状态,Impala并没有终结Hive。在这里对于Spark SQL来说也是一样的。
  12. Storm可以被Spark Streaming替换? 是的,可以替换。只不过平心而论storm并不是Hadoop生态系统中的一员,因为它是完全独立的工具。他们的计算模型并不太形同,所以我不认为storm会消失,反而仍会作为一个商业产品。
  13. Mahout可以被MLib替换?公平的讲,Machout已经失去了市场,而且从过去的几年来看它正在快速失去市场。对于这个工具,我们可以说这里是Spark真正可以替换Hadoop生态系统中的地方。
    因此,总的来说,这篇文章的结论是:
  14. 不要被大数据供应商的包装所愚弄。他们大量推进的是市场而不是最终的真理。Hadoop最开始是被设计为可扩展的框架,而且其中很多部分是可替换的:可以将HDFS替换为Tachyon,可以将YARN替换为Mesos,可以将MapReduce替换为Tez并且在Tez之上可以运行Hive。这将会是Hadoop技术栈的可选方案或者完全替代方案?倘若我们放弃的MR(MapReduce)而使用Tez,那么它还会是Hadoop吗?
  15. Spark不能为我们提供完整的技术栈。它允许我们将它的功能集成到我们的Hadoop集群中并且从中获益,而不用完全脱离我们老的集群方案。
  16. Spark还不够成熟。我认为在过三到四年我们就不会再叫“Hadoop栈”而是叫它“大数据栈”或者类似的称呼。因为在大数据栈中我们有很广泛的选择可以选出不同的开源产品来组合在一起形成一个单独的技术栈使用。

译注:原文发表于2015-2-11

  1. 本文由程序员学架构翻译
  2. 转载请务必注明本文出自:程序员学架构(微信号:archleaner)
  3. 更多文章请扫码:
    这里写图片描述
    (长按上图识别二维码)
### ### HiveSpark 的功能差异 Hive 是一个基于 Hadoop 的数据仓库工具,其核心功能在于提供类 SQL 接口(HiveQL)以简化大规模结构化数据的分析过程。Hive 的底层执行引擎最初依赖于 MapReduce,但后来也支持 Spark 作为执行引擎,这种集成方式被称为 Hive on Spark [^1]。Hive 的主要优势在于其强大的元数据管理能力,适用于静态数据分析批处理任务,例如日志处理、报表生成等场景。 Spark 是一个通用的分布式计算框架,具备内存计算能力,能够高效处理批处理、流式计算、图计算机器学习等任务。SparkSQL 是 Spark 的模块之一,用于处理结构化数据,支持 SQL 查询,并与 Hive 兼容,允许访问 Hive 的元数据表结构。SparkHive 的集成方式包括 Spark with Hive,即 Spark 使用 Hive 的元数据进行查询,但不使用 Hive 的执行引擎 [^1]。 ### ### Spark 是否可以完全取代 Hive 从功能角度来看,Spark 并不能完全取代 HiveHive 在元数据管理方面具有独特优势,其 Metastore 服务提供了完整的数据库管理能力,包括表结构定义、分区管理、列式存储优化等。这些特性使得 Hive 成为构建企业级数据仓库的重要组件 [^2]。 SparkSQL 虽然支持 SQL 查询,并且可以访问 Hive 表,但它本质上是一个计算引擎,而不是数据管理工具。Spark 的优势在于其执行效率,特别是在内存计算迭代计算任务中表现优异。然而,在涉及复杂元数据管理、数据生命周期控制、权限管理等方面,Spark 并不提供完整的替代方案 [^4]。 在实际应用中,HiveSpark 的结合使用更为常见。例如,Hive on SparkHive 的查询优化能力与 Spark 的高性能计算能力结合,提升了 Hive 查询的执行效率。而在 Spark with Hive 模式下,Spark 可以直接读取 Hive 的元数据并执行查询,从而在保持 Hive 元数据一致性的前提下提升计算性能 [^1]。 ### ### 适用场景对比 Hive 更适合用于数据仓库、批处理分析复杂 ETL 流程。其类 SQL 语法降低了数据分析师 SQL 开发者的使用门槛,同时其与 Hadoop 生态系统的深度集成使其在大规模数据存储管理方面具有不可替代的优势 。 Spark 更适合用于实时数据处理、机器学习、图计算等高性能计算场景。Spark 的内存计算能力使其在处理迭代计算流式数据时具有显著优势,尤其适合需要快速响应高吞吐量的应用 [^4]。 在实际部署中,Hive Spark 通常协同工作。例如,Hive 负责数据存储元数据管理,而 Spark 负责高效的数据处理。这种组合方式既保留了 Hive 的数据管理能力,又利用了 Spark 的计算优势,实现了“强强联合”的效果 。 ### ### 相关问题 ```python # 示例:使用 SparkSQL 查询 Hive 表 from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("SparkWithHive") \ .enableHiveSupport() \ .getOrCreate() # 查询 Hivespark.sql("SELECT * FROM hive_table WHERE age > 30").show() ```
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值