导言
这个问题是早些年的提问,大概2021年,现在回头看仍有收获。
Shuffle之累
彼时,Spark的shuffle模型确实存在因文件句柄数过多而引发的问题,但随着技术演进至Spark 2.x版本后,sort based Shuffle机制已大体解决了这一困扰,并且随后引入的ESS外部shuffle服务及远程shuffle架构更是对提升shuffle稳定性做出了显著贡献。
成也内存,败也?
关于与内存溢出(OOM)无关的观点,此看法值得进一步探讨。Spark所采用的依赖内存资源的DAG执行模型,在内部计算流程中往往难以精准预估各环节所需的内存规模。尽管有人声称仅用10GB内存就能处理高达1000GB的数据,这无疑得益于精细的编程技艺和参数调优,然而对于广大非专业使用者而言,他们可能并未充分掌握此类框架的操作技巧,因此Spark在面临复杂任务时易于出现崩溃的现象仍然较为普遍。
时代的局限
追溯至早期Hive基于MapReduce执行计算的时代,两者之间的重要差异恰好体现在内存使用理念上。鉴于MapReduce设计之初,内存资源极度珍贵,设计理念自然无法以内存为中心,转而频繁倚重磁盘读写操作。众所周知,磁盘往往就是性能的杀手,这也是数据库及SQL领域历经多年优化的核心目标——减少不必要的I/O操作。故而,当Hive借助MR进行计算时,由于MR频繁地与磁盘交互,其性能表现自然无法令人满意。
殊途同归
相比之下,Hive后来引入Tez引擎后,对内存的依赖度明显增强,随之而来的是内存异常以及系统稳定性的潜在挑战,这一点与Spark存在的稳定性问题颇为相似。Tez的主要使命在于优化Hadoop MapReduce模型,提供一个更灵活高效的大数据处理环境。然而,Tez在运行过程中对资源的需求相对更高,特别是内存方面。若YARN集群资源配置不足或不合理,如Container大小、内存限制设定不当,将可能导致任务因资源耗尽而失败,从而影响整个系统的稳定性。
权衡罢了
综上所述,无论是Spark还是Hive,在追求高性能与高稳定性之间的权衡取舍,正是大数据技术二十年发展历程的真实写照,犹如“鱼与熊掌不可兼得”的古老智慧,在当今时代背景下得到了生动体现。