测试用例:Spark 在 20 秒以上对 6G 数据进行字数统计。
我明白映射减少, FP and stream编程模型,但无法弄清楚字数统计的速度如此惊人。
我认为这种情况下是I/O密集型计算,不可能在20秒以上扫描6G文件。我猜想在字数统计之前会执行索引,就像 Lucene 那样。魔法应该在RDD(弹性分布式数据集)我不太理解的设计。
如果有人能解释我很感激RDD对于字数统计的情况。谢谢!
首先是启动时间。 Hadoop MapReduce 作业启动需要启动多个单独的 JVM,速度并不快。 Spark 作业启动(在现有 Spark 集群上)会导致现有 JVM 分叉新任务线程,这比启动 JVM 快数倍
接下来,没有索引,也没有魔法。 6GB 文件存储在 47 个块中,每个块 128MB。想象一下,您有一个足够大的 Hadoop 集群,所有这 47 个 HDFS 块都驻留在不同的 JBOD HDD 上。它们中的每一个都将为您提供 70 MB/秒的扫描速率,这意味着您可以在大约 2 秒内读取此数据。通过集群中的 10GbE 网络,您只需 7 秒即可将所有这些数据从一台计算机传输到另一台计算机。
最后,Hadoop 多次将中间数据放入磁盘。它把map
至少一次输出到磁盘(如果地图输出很大并且发生磁盘合并,则输出更多次)。下次将数据写入磁盘reduce
之前的一侧reduce
本身被执行。 Spark 在运行期间仅将数据写入 HDD 一次shuffle
阶段,参考 Spark 实现建议增加文件系统写入缓存,以免此“随机”数据命中磁盘
与 Hadoop 相比,所有这些都为 Spark 带来了巨大的性能提升。 Spark RDD 中没有与此问题相关的魔法
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)