目录
一、交互式分析
Basics
More on RDD Operations
Caching
二、编写独立运行的应用程序
本文主要内容来源于官方Spark Quick Start,spark版本为spark-2.4.6-bin-hadoop2.7,环境为Windows,spark路径为:D:\BigData\spark-2.4.6-bin-hadoop2.7。
Spark Shell可以使用scala或python访问,本文目前主要进行python方式的学习,后续有机会对scala方式进行补充。首先进入D:\BigData\sspark-2.4.6-bin-hadoop2.7\bin目录,
Scala打开方式:双击spark-shell.cmd
Python打开时,首先要安装python,注意spark1.x需要装python2.x, 否则会报TypeError: namedtuple() missing 3 required keyword-only arguments: 'rename',错误;本文使用spark2.4不会出现该问题。打开方式:双击pyspark.cmd
spark主要的数据抽象为RDD,即弹性分布式数据集,RDD可以从HDFS、文本文件、json、关系数据库等多种方式创建,下面演示从readme.md创建。在交互式窗口输入下面的命令即完成创建RDD:
textFile=sc.textFile("D:\BigData\spark-2.4.6-bin-hadoop2.7\README.md")
RDD支持的操作分为Action和Transformation,执行Action操作后,返回的是数值,而执行Transformation操作后,返回的是新的RDD。比如在命令行执行textFile.count(),返回的是RDD中元素的个数;而执行textFile.first(),返回的是RDD中的第一个元素,它也是一个RDD。
下面执行一个RDD的filter()转换操作,并返回包含文件子集的RDD:
linesWithSpark = textFile.filter(lambda line: "Spark" in line)
再对返回的RDD执行count()Action操作,返回文件中包含"Spark"的行数:
我们使用RDD的Action和Transformation可以实现很多复杂的运算,下面通过它实现查找包含单词最多行的单词数:
textFile.map(lambda line: len(line.split())).reduce(lambda a, b: a if (a > b) else b)
在上面的例子中,先是使用map把每一行映射为单词数,并生成一个新的RDD;然后使用reduce查找最多的单词数。map和reduce的参数都是python中lambda表达式,我们也可以为其传递其他python函数,例如下面定义一个求最大值的函数:
def max(a, b):
if a > b:
return a
else:
return b
然后将该函数作为参数传递给reduce:
textFile.map(lambda line: len(line.split())).reduce(max)
可以看到得到了与上面使用lambda表达式一致的结果。
spark可以轻松的实现类似MapReduce的数据流模式,比如经典的WordCount:
wordCounts = textFile.flatMap(lambda line: line.split()).map(lambda word: (word, 1)).reduceByKey(lambda a, b: a+b)
上面得到的结果仍是一个RDD,我们对其应用collect Action得到每个单词的个数统计:
wordCounts.collect()
spark还支持将RDD缓存到集群范围的缓存中,这在进行迭代计算时非常有用,下面演示将linesWithSpark标记为要缓存的RDD:
这一节官网给了java、scala、python三种语言的讲解,我们还是先学习python。
先创建一个SimpleApp.py文件。
"""SimpleApp.py"""
from pyspark import SparkContext
logFile = "D:\BigData\spark-2.4.6-bin-hadoop2.7\README.md" # Should be some file on
your system
sc = SparkContext("local", "Simple App")
logData = sc.textFile(logFile).cache()
numAs = logData.filter(lambda s: 'a' in s).count()
numBs = logData.filter(lambda s: 'b' in s).count()
print("=================================================")
print("a: %i, b: %i" % (numAs, numBs))
print("=================================================")
上面的程序实现统计文件中a和b的个数。对于使用自定义类或第三方库的应用程序,还可以通过将代码依赖关系打包到.zip文件中,通过其--py-files参数将代码依赖项添加到spark-submit中(有关详细信息,请参见spark-submit --help)。当然,对于上面的SimpleApp非常简单,我们不需要指定任何代码依赖项。
下面使用bin/spark-submit脚本运行此应用程序:
spark-submit --master local[4] SimpleApp.py
执行结果:
原文链接:http://spark.apache.org/docs/1.6.0/quick-start.html
相关链接:
Spark programming guide 、deployment overview