日常用python做数据挖掘,最近需要用到spark,不过还好spark提供了强大的python接口。本学习笔记都是基于python3.6而来(没办法,虽说spark是用Scala语言写的,但是本人只会使用python),学习资料主要来自spark2.0官方文档(暂时没有提供python接口的翻译)和《python+spark2.0 Hadoop 机器学习与大数据实战》这本书。
Apache Spark是一个分布式计算框架
,旨在简化运行于计算机集群上的并行程序的编写。该框架对资源调度,任务的提交、执行和跟踪,节点间的通信以及数据并行处理的内在底层操作都进行了抽象。它提供了一个更高级别的API用于处理分布式数据。从这方面说,它与Apache Hadoop等分布式处理框架类似。但在底层架构上,Spark与它们有所不同。
Spark起源于加利福利亚大学伯克利分校的一个研究项目。学校当时关注分布式机器学习算法的应用情况。因此,Spark从一开始便为应对迭代式应用的高性能需求而设计。在这类应用中,相同的数据会被多次访问。该设计主要靠利用数据集内存缓存以及启动任务时的低延迟和低系统开销来实现高性能。再加上其容错性、灵活的分布式数据结构和强大的函数式编程接口,Spark在各类基于机器学习和迭代分析的大规模数据处理任务上有广泛的应用,这也表明了其实用性。
Spark支持四种运行模式
。
本地单机模式:所有Spark进程都运行在同一个Java虚拟机(Java Vitural Machine,JVM)中。
集群单机模式:使用Spark自己内置的任务调度框架。
基于Mesos:Mesos是一个流行的开源集群计算框架。
基于YARN:即Hadoop 2,它是一个与Hadoop关联的集群计算和资源调度框架。
RDD-弹性分布式数据集
RDD是Spark的核心概念之一!
SparkContext类与SparkConf类
任何Spark程序的编写都是从SparkContext(或用Java编写时的JavaSparkContext)开始的。SparkContext的初始化需要一个SparkConf对象,后者包含了Spark集群配置的各种参数(比如主节点的URL)。初始化后,我们便可用SparkContext对象所包含的各种方法来创建和操作分布式数据集和共享变量。
Spark shell在Scala和Python下可以自动完成上述初始化,但不支持Java
SparkSession
SparkSession是Spark 2.0引入的新概念。
在spark的早期版本中(2.0版本以前),SparkContext是spark的主要切入点(由于RDD是主要的API,我们通过sparkcontext来创建和操作RDD。)对于每个其他的API,我们需要使用不同的context。例如,对于Streming,我们需要使用StreamingContext;对于sql,使用sqlContext;对于hive,使用hiveContext。
在 Spark 2.0 之后, RDD 被 Dataset 替换, 它是像RDD 一样的 strongly-typed(强类型), 但是在引擎盖下更加优化,RDD 接口仍然受支持。但是随着DataSet和DataFrame的API逐渐成为标准的API,就需要为他们建立接入点。
所以在spark2.0中,引入SparkSession作为DataSet和DataFrame API的切入点。也为用户提供了统一的切入点,来让用户学习spark的各项功能。
SparkSession实质上是SQLContext和HiveContext的组合(未来可能还会加上StreamingContext),
所以在SQLContext和HiveContext上可用的API在SparkSession上同样是可以使用的。
SparkSession内部封装了SparkContext,所以计算实际上是由SparkContext完成的
。
Python shell
Spark提供了pythonshell,但是我们可以设置使用jupyter notebook,设置如下:
在终端输入pyspark
注:当你通过pyspark打开jupyter时,
SparkContext和
SparkSession都已经初始化,可以直接使用
假设我们希望使用 Spark API 来创建一个独立的应用程序,可以通过以下实例:
from
pyspark.sql
import
SparkSession
spark = SparkSession.builder().appName(appName).master(master).getOrCreate()
如果想执行这个应用程序,可以通过spark-submit 命令来执行