动手实验Apache Spark的最好方式是使用交互式Shell命令行,Spark目前有Python Shell和Scala Shell两种交互式命令行。
可以从 这里下载Apache Spark,下载时选择最近预编译好的版本以便能够立即运行shell。
目前最新的Apache Spark版本是1.5.0,发布时间是2015年9月9日。
tar -xvzf ~/spark-1.5.0-bin-hadoop2.4.tgz
运行Python Shell
cd spark-1.5.0-bin-hadoop2.4
./bin/pyspark
在本节中不会使用Python Shell进行演示。
Scala交互式命令行由于运行在JVM上,能够使用java库。
运行Scala Shell
cd spark-1.5.0-bin-hadoop2.4
./bin/spark-shell
执行完上述命令行,你可以看到下列输出:
Scala Shell欢迎信息
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 1.5.0
/_/
Using Scala version 2.10.4 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_25)
Type in expressions to have them evaluated.
Type :help for more information.
15/08/24 21:58:29 INFO SparkContext: Running Spark version 1.5.0
下面是一些简单的练习以便帮助使用shell。也许你现在不能理解我们做的是什么,但在后面我们会对此进行详细分析。在Scala Shell中,执行下列操作:
在Spark中使用README 文件创建textFileRDD
val textFile = sc.textFile("README.md")
获取textFile RDD的第一个元素
textFile.first()
res3: String = # Apache Spark
对textFile RDD中的数据进行过滤操作,返回所有包含“Spark”关键字的行,操作完成后会返回一个新的RDD,操作完成后可以对返回的RDD的行进行计数
筛选出包括Spark关键字的RDD然后进行行计数
val linesWithSpark = textFile.filter(line => line.contains("Spark"))
linesWithSpark.count()
res10: Long = 19
要找出RDD linesWithSpark单词出现最多的行,可以使用下列操作。使用map方法,将RDD中的各行映射成一个数,然后再使用reduce方法找出包含单词数最多的行。
找出RDD textFile 中包含单词数最多的行
textFile.map(line => line.split(" ").size)
.reduce((a, b) => if (a > b) a else b)
res11: Int = 14
返回结果表明第14行单词数最多。
也可以引入其它java包,例如 Math.max()方法,因为map和reduce方法接受scala函数字面量作为参数。
在scala shell中引入Java方法
import java.lang.Math
textFile.map(line => line.split(" ").size)
.reduce((a, b) => Math.max(a, b))
res12: Int = 14
我们可以很容易地将数据缓存到内存当中。
将RDD linesWithSpark 缓存,然后进行行计数
linesWithSpark.cache()
res13: linesWithSpark.type =
MapPartitionsRDD[8] at filter at <console>:23
linesWithSpark.count()
res15: Long = 19
上面简要地给大家演示的了如何使用Spark交互式命令行。
弹性分布式数据集(RDDs)
Spark在集群中可以并行地执行任务,并行度由Spark中的主要组件之一——RDD决定。弹性分布式数据集(Resilient distributed data, RDD)是一种数据表示方式,RDD中的数据被分区存储在集群中(碎片化的数据存储方式),正是由于数据的分区存储使得任务可以并行执行。分区数量越多,并行越高。下图给出了RDD的表示:
Display- Edit
想像每列均为一个分区(partition ),你可以非常方便地将分区数据分配给集群中的各个节点。
为创建RDD,可以从外部存储中读取数据,例如从Cassandra、Amazon简单存储服务(Amazon Simple Storage Service)、HDFS或其它Hadoop支持的输入数据格式中读取。也可以通过读取文件、数组或JSON格式的数据来创建RDD。另一方面,如果对于应用来说,数据是本地化的,此时你仅需要使用parallelize方法便可以将Spark的特性作用于相应数据,并通过Apache Spark集群对数据进行并行化分析。为验证这一点,我们使用Scala Spark Shell进行演示:
热门文章更多>>
标签更多>>
专题更多>>
最新文章更多>>
- 团队城市未满足要求:MSBuildTools12.0_x86_Path 存在
- 使用 MSBuild.exe 在发布模式下构建 C# 解决方案
- 当我发布 Web 应用程序时,AfterPublish 脚本不运行
- 构建时 T4 转换的产品仅在下一个构建中使用
- ASP.NET Core Application (.NET Framework) for Windows x64 only error in project.assets.json
- 新的 .csproj 格式 - 如何将整个目录指定为“链接文件"到子目录?
- 如何将条件编译符号(DefineConstants)传递给 msbuild
- MSBuild 支持 Visual Studio 2017 RTM 中的 T4 模板
- NuGet 包还原找不到包,没有源
- 使用 C# 6.0 功能运行 TFS 构建
但求问心无愧i