[翻译][Spark In Action 中文版][Spark 实战 ]1.3 Spark 程序流

1.3 Spark 程序流


让我们看看一个典型的Spark程序是什么样子。 假设一个300 MB的日志文件存储在一个三节点HDFS集群中。 HDFS自动将文件拆分为128 MB部分(Hadoop术语中的块),并将每个部分放在集群的单独节点上(见图1.3)。 让我们假设Spark在YARN上运行,在同一个Hadoop集群中。

spark-program-flow-paymoon-com

图1.3 在三节点Hadoop群集中存储300 MB日志文件

Spark数据工程师的任务是分析在过去两周内发生了多少类型为Out-OfMemoryError的错误。 工程师玛丽知道日志文件包含公司应用程序服务器集群的最近两周的日志。 她坐在她的笔记本电脑上,开始工作。
她首先启动她的Spark shell并建立到Spark集群的连接。 接下来,她使用这个(Scala)行从HDFS加载日志文件(见图1.4):

1-4-paymoon-com

图1.4 从hdfs上加载一个txt文件

为了实现最大数据本地化,加载操作向Hadoop询问日志文件的每个块的位置,然后将所有块传送到集群节点的RAM。现在Spark具有对RAM中每个块(Spark术语中的分区)的引用。这些分区的总和是来自RDD引用的日志文件的行的分布式集合。或者,我们可以说,RDDs允许您使用分布式集合,就像使用任何本地,非分布式集合一样。你不必担心集合是分布式的,你也不必自己处理节点故障。
除了自动容错和分发之外,RDD还提供了一个精心设计的API,允许您以功能样式使用集合。您可以过滤集合;用一个函数映射它;减少到累积值;减去,相交或创建与另一个RDD的联合,等等。
玛丽现在有一个对RDD的引用,所以为了找到错误计数,她首先想删除所有没有OutOfMemoryError子字符串的行。这是过滤功能的工作,她这么调用:

过滤集合后,它包含她需要分析的数据子集(见图1.5),Mary调用缓存,告诉Spark在内存中将RDD留在作业中。 缓存是我们之前提到的Spark的性能改进的基本组件。 缓存RDD的好处将在后面显而易见。


本文http://www.paymoon.com:8001/index.php/2016/12/27/spark-program-flow/

如果转载请联系 龙遥Yol  i@paymoon.com


现在她只剩下那些包含错误子字符串的行。 对于这个简单的例子,我们将忽略OutOfMemoryError字符串可能出现在单个错误的多行中的可能性。 我们的数据工程师计算剩余行数,并将结果报告为最近两周内发生的内存不足错误数:

Spark使她只用三行代码执行数据的分布式过滤和计数。 她的小程序在所有三个节点上并行执行。
如果她现在想要使用OutOfMemoryErrors进一步分析行,并且可能再次调用过去在内存中缓存的oomLines对象上的过滤器(但是使用其他条件),则Spark将不会再次从HDFS加载文件,就像通常那样。 Spark将从缓存加载它。

1-5-paymoon-com

图1.5 过滤集合以仅包含包含OutOfMemoryError字符串的行


本文http://www.paymoon.com:8001/index.php/2016/12/27/spark-program-flow/

如果转载请联系 龙遥Yol  i@paymoon.com


Spark 实战更多文章:[翻译]Spark In Action – PayMoon贝明实验室

[翻译]Spark In Action

发表评论

电子邮件地址不会被公开。