测试用例:Spark在20+秒内对6G数据进行字数统计。
我理解 MapReduce , FP 和 stream 编程模型,但无法弄清楚单词计数是如此惊人的快速。
我认为在这种情况下它是一个I / O密集型计算,并且不可能在20多秒内扫描6G文件。我想在字数统计之前会有索引,就像Lucene一样。神奇应该是 RDD (弹性分布式数据集)设计,我不太了解。
我很感激有人可以解释 RDD 这个词计数案例。谢谢!
答案 0 :(得分:4)
首先是启动时间。 Hadoop MapReduce作业启动需要启动一些不快的JVM。 Spark作业启动(在现有Spark集群上)导致现有JVM分叉新任务线程,这比启动JVM快一些
接下来,没有索引也没有魔法。 6GB文件存储在47个块中,每块128MB。想象一下,你有一个足够大的Hadoop集群,所有这47个HDFS模块都驻留在不同的JBOD硬盘上。它们中的每一个都可以为您提供70 MB /秒的扫描速率,这意味着您可以在约2秒内读取此数据。使用群集中的10GbE网络,您可以在7秒内将所有这些数据从一台计算机传输到另一台计算机。
最后,Hadoop多次将中间数据放入磁盘。它将map
输出至少放入磁盘一次(如果映射输出很大并且磁盘上合并发生,则更多)。在reduce
本身执行之前,它会在reduce
侧将数据放入磁盘。 Spark在shuffle
阶段仅将数据放入HDD一次,参考Spark实施建议增加文件系统写入缓存,不要让这个“随机”数据到达磁盘
与Hadoop相比,所有这些都为Spark带来了巨大的性能提升。与此问题相关的Spark RDD没有任何魔力
答案 1 :(得分:0)
除0x0FFF提到的因素外,结果的局部组合也使得火花运行字数更有效。默认情况下,Spark会在将结果发送到其他节点之前组合每个节点上的结果。
在单词计数作业的情况下,Spark计算节点上每个单词的计数,然后将结果发送到其他节点。这减少了通过网络传输的数据量。要在Hadoop Map-reduce中实现相同的功能,您需要指定组合器类job.setCombinerClass(CustomCombiner.class)
通过在Spark中使用combineByKey()
,您可以指定自定义组合器。
答案 2 :(得分:0)
Apache Spark 处理内存中的数据,而Hadoop MapReduce 会在map或reduce操作后保留回磁盘。但Spark需要大量内存
Spark 将一个进程加载到内存中,并将其保留在那里,直到进一步通知为止,以便进行缓存。
弹性分布式数据集(RDD),它允许您透明地将数据存储在内存中,并在需要时将其保存到光盘中。
由于 Spark 使用内存,因此没有同步障碍会降低您的速度。这是Spark表现的主要原因。
Spark不仅可以像处理MapReduce一样处理一批存储数据,还可以使用 Spark Streaming 实时处理数据。
DataFrames API的灵感来自R和Python(Pandas)中的数据框架,但是从头开始设计为现有 RDD API的扩展强>
DataFrame 是按指定列组织的分布式数据集合,但支持火花速度的更丰富的优化。
使用 RDD 的Spark可以简化复杂的操作,例如加入和 groupBy ,在后端,您可以处理碎片数据。这种碎片使 Spark 能够并行执行。
Spark 允许使用有向非循环图( DAG )模式开发复杂的多步数据管道。它支持跨DAG的内存数据共享,因此不同的作业可以使用相同的数据。 DAG 是 Spark 速度的主要部分。
希望这有帮助。