Hadoop Apache Spark是同时读取和处理,还是先读取内存中的整个文件,然后开始转换?

Hadoop Apache Spark是同时读取和处理,还是先读取内存中的整个文件,然后开始转换?,hadoop,apache-spark,Hadoop,Apache Spark,我很好奇Spark是先将整个文件读入内存,然后才开始处理它,这意味着应用转换和操作,还是读取文件的第一个块-对其应用转换,读取第二个块,依此类推 Hadoop中的Spark对于同一问题有什么不同吗?我读到Spark大多数时候都将整个文件保存在内存中,而Hadoop则没有。但是,当我们第一次阅读并映射关键点时,最初的步骤是什么呢 谢谢Spark使用惰性迭代器处理数据,必要时可以将数据溢出到磁盘。它不会读取内存中的所有数据 与Hadoop相比,Spark的区别在于它可以将多个操作链接在一起。我认为一

我很好奇Spark是先将整个文件读入内存,然后才开始处理它,这意味着应用转换和操作,还是读取文件的第一个块-对其应用转换,读取第二个块,依此类推

Hadoop中的Spark对于同一问题有什么不同吗?我读到Spark大多数时候都将整个文件保存在内存中,而Hadoop则没有。但是,当我们第一次阅读并映射关键点时,最初的步骤是什么呢


谢谢

Spark使用惰性迭代器处理数据,必要时可以将数据溢出到磁盘。它不会读取内存中的所有数据


与Hadoop相比,Spark的区别在于它可以将多个操作链接在一起。

我认为一个合理的描述应该是:

Hadoop(或者更准确地说是MapReduce)和Spark都使用相同的底层文件系统HDF

在映射阶段,两者都将读取所有数据,并将映射结果实际写入磁盘,以便通过无序逻辑在节点之间进行排序和分发。 事实上,除了将数据溢出到磁盘以便Shuffle执行其工作之外,这两种方法都会尝试缓存刚刚映射到内存中的数据。 不过,这里的区别在于Spark在这个过程中效率更高,它尝试将为特定计算选择的节点与已缓存在特定节点上的数据进行最佳对齐。 由于Spark也进行了一种称为惰性评估的操作,因此Spark的内存使用与Hadoop非常不同,这是同时规划计算和缓存的结果

在字数计算作业的步骤中,Hadoop执行以下操作:

  • 将所有单词映射到
    1
  • 将所有映射的(字,1)对写入HDFS中的单个文件(单个文件仍然可以跨越分布式HDFS上的多个节点)(这是洗牌阶段)
  • 对共享文件中(word,1)的行进行排序(这是排序阶段)
  • 让还原程序从现在包含所有已排序单词的共享文件中读取部分(分区),并对每个单词的所有
    1
    s进行汇总
  • 另一方面,Spark会反过来:

  • 它认为,与Hadoop一样,通过单独的减速器运行汇总所有这些单词可能是最有效的,因此它根据一些因素决定将作业拆分为x部分,然后将它们合并到最终结果中
  • 因此,它知道单词必须被排序,在给定的时间里,这些单词至少需要部分存储在内存中
  • 之后,它计算出这样一个排序列表将需要映射到(单词,1)对的所有单词来开始计算
  • 它通过第3步、第2步和第1步工作
  • 现在,Hadoop的诀窍在于,它在步骤3中知道在步骤2中需要哪些内存缓存项。在2。它已经知道在最后的步骤1中如何需要这些部件(主要是K-V对)。 这使得Spark能够非常有效地规划作业的执行,但是缓存它知道在作业的后期阶段将需要的数据。Hadoop从开始(映射)一直工作到结束,没有明确地展望以下阶段,根本无法如此高效地使用内存,因此不会浪费资源,将大数据块保留在内存中,而Spark会保留这些内存。与Spark不同,它只是不知道下一步是否需要映射阶段中的所有对

    Spark似乎将整个数据集都保存在内存中,这并不是Spark主动做的事情,而是Spark能够计划作业执行方式的结果。 另一方面,Spark在另一种工作中实际上可以保留较少的记忆。在我看来,计算不同单词的数量是一个很好的例子。 在这里,Spark会提前计划,在映射过程中遇到重复字时,会立即从缓存/内存中删除该重复字,而在Hadoop中,它也会继续进行,并在洗牌重复字时浪费内存(我承认有一百万种方法可以让Hadoop做到这一点,但它不是现成的,也有一些方法可以用不幸的方式编写Spark作业,以打破这些优化,但在这里愚弄Spark并不是那么容易:))

    希望这有助于理解记忆的使用只是Spark工作方式的自然结果,而不是积极针对的东西,也不是Spark严格要求的东西。当内存出现问题时,它还能够在执行步骤之间重复地将数据溢出回磁盘

    为了更深入地了解这一点,我建议从中学习Spark中的DAG调度程序,以了解这在代码中是如何实现的。
    您将看到,它总是遵循这样一种模式,即先确定哪些数据是,然后缓存哪些数据,然后再确定计算哪些数据在哪里。

    我猜您的意思是Mapreduce无法链接?Spark无法与“Hadoop,生态系统”相比