CDH5 Apache Spark初体验

来源:互联网 发布:ssh连接linux 编辑:程序博客网 时间:2024/05/22 14:49
Apache Spark是一个通用的分布式计算框架,为大规模数据处理提供了一个高效、可扩展的计算引擎。由于性能、接口、功能的那个多种原因,Spark正处于“风头浪尖”,热度也超过了MapReduce。在这片博文中,你将学习到如何在CDH5上使用Maven编译、运行一个Spark应用程序。

预备知识:Scala + Maven

完整的代码可以从github地址 https://github.com/yeleid/sparkwordcount 下载。注意,示例的代码是基于CDH5.1.0的版本编写的,如果使用其他的CDH5版本,请到http://www.cloudera.com/content/cloudera/en/documentation/core/latest/topics/cdh_vd_cdh5_maven_repo.html查询具体的依赖包信息。

既然是第一个Apache Spark程序,自然我们从经典的“Word Count”入手。该程序主要的功能是统计文档集合中每个单词出现的频率:
1. 读取文档集合;
2. 计算每个单词的频率;
3. 给定词的前缀,打印所有匹配的单词及其频率

完整的Scala代码如下:
CDH5 <wbr>Apache <wbr>Spark初体验

需要特别注意的是:Spark是惰性计算的 (Lazy Evaluation)。也就是说,只有当特定的操作执行时,Spark任务才会真正运行起来。在“Word Count”代码片段中,collect函数就属于这类“特定的操作”。该函数会将任务执行获得的结果返回给客户端(Spark Driver)。另外比较常用的“特定的操作”还有saveAsTextFile将计算结果写入文件系统,比如HDFS。

另一个需要注意的是 (针对熟悉MapReduce程序员),Spark对reduce的定义是不同于MapReduce的。对于MapReduce, 它的reduce函数可以任意处理具有相同主键(Key)的数据;然后,对于Spark,在reduce函数中的计算逻辑必须符合“结合律”的要求。刚接触的同志们不要慌张,慢慢意会即可。严格意义上来讲,Spark的groupBy函数+map函数 (用于处理groupBy的结构) 与MapReduce的reduce函数更加相似。

让我们转战“编译”。Maven要求项目遵循特定的目录结构,例如所有Scala代码必须放在目录src/main/scala下。另外,它还要求使用项目根目录下的pom.xml来说明编译的配置信息。

为了让Maven能够编译Scala代码,需要指定特定的插件:
CDH5 <wbr>Apache <wbr>Spark初体验

为了让Maven可以下载到以上插件,需要指定插件所在仓库的位置:
CDH5 <wbr>Apache <wbr>Spark初体验

最后自然还需要添加Scala与Spark的依赖库信息:
CDH5 <wbr>Apache <wbr>Spark初体验

万事具备,只差编译打包,使用命令“mvn clean package”编译打包后,会在target目录下面生成wordcountspark-0.0.1.jar。

在运行程序前,需要将准备数据上传到HDFS中 (如果只是本地测试,数据也可以保存在本地),先来看看测试数据来对结果有个预估:
CDH5 <wbr>Apache <wbr>Spark初体验

使用"spark-submit"提交Spark应用程序。在以下示例中,Spark应用程序只是运行在本地进程中,也就是我们之前提到的“本地测试环境”。通过指定不同的master参数,程序可以被运行在不同的执行器上。如果你使用了项目的样本数据,运行结果应该与下图相似:
CDH5 <wbr>Apache <wbr>Spark初体验

恭喜你,你刚刚已经成功了你的第一个Apache Spark应用程序。万事入门难,大家再接再厉,Happy Spark :-)
0 0