Spark快速入门

目录

一、交互式分析

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。

一、交互式分析

Basics

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"的行数:

More on RDD Operations

我们使用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()

Caching

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 

猜你喜欢

转载自blog.csdn.net/yuan1164345228/article/details/108165873