数据挖掘之Spark学习
阅读路线:
- Hadoop与Spark比较
- Spark的安装
- Spark知识点
一、Hadoop与Spark比较
- 简单的比较
刚开始学习Spark的时候,自己总是会想当然的理解两者之间的关系。Hadoop和Spark的处理任务有很多是一样的,比如说他们都是有数据计算处理的功能,但是在一些方面又并不相互重叠,比如说,Spark没有文件管理功能,因而必须依赖Hadoop分布式文件系统(HDFS)或另外某种解决方案。实际上,在Hadoop的项目页面上,Spark就被列为是一个模块。Spark有自己的页面,因为虽然它可以通过YARN(另一种资源协调者)在Hadoop集群中运行,但是它也有一种独立模式。它可以作为 Hadoop模块来运行,也可以作为独立解决方案来运行。
刚开始学习的时候,应该先了解数据处理方面的不同,Spark相比Hadoop 的MapReduce模块,Spark确实速度很快,最多比Hadoop MapReduce快100倍)。这是因为MapReduce使用持久存储,而Spark使用弹性分布式数据集(RDD)。
- Spark核心-RDD
RDD是一种分布式弹性数据集,将数据分布存储在不同节点的计算机内存中进行存储和处理。每次RDD对数据处理的最终结果,都分布在不同的节点中。这样的话,在进行到下一步数据处理的工作的时候,数据可以直接从内存中提取,从而省去了大量的IO操作。
另一个特性是延迟计算,即是一个完整的RDD运行任务被分成两个部分:Transformation和Action。Transformation用于对RDD的创建,同时还提供了大量的操作方法,例如map、filter、groupBy、join。Action是数据的执行部分,其通过执行count、reduce、collect等方法去真正执行数据的计算部分。实际上,RDD中所有的操作都是使用的Lazy模式进行,Lazy是一种程序优化的特殊形式。运行在编译的过程中不会立刻得到计算的最终结果,而是记住所有的操作步骤和方法,只有显式的遇到命令才进行计算。这样做的好处在于大部分的优化和前期工作在Transformation中已经执行完毕,当Action进行工作时,只需要利用全部自由完成业务的核心工作。
二、Spark 的安装
首先建议大家安装spark2.0之后的版本(具体是有多少有点就不说了,反正就是好学,好用)
安装spark2x之前(我是在Linux下安装的),首先要安装
- 安装JAVA8
CentOS下安装JDK的三种方法,这一过程中配置环境变量时可能会出错,大家一定要认真看教程。
- Anaconda安装
Linux下安装Anaconda,仔细看教程就会发现Anaconda的安装过程中,会提示是否配置环境变量,到时输入"yes"。有一点要注意的是,一般Linux下都自带的Python,安装anaconda时要与自带的Python版本相同,不然在数据计算的时候很容易报错。
- 安装scala
linux下安装 scala,看教程配置好环境变量即可。
- 安装Spark
下载地址,在官网上下载好之后按照默认格式下载,自己不要改。
安装Spark中配置环境变量与Scala安装方式是一样的
- 启动spark
我这是单机下运行的,就是说没有连接公司集群
5.1 第一种方式
cd usr/spark/spark-2.0.2-bin-hadoop2.7 (进入到自己spark目录下)
PYSPARK_DRIVER_PYTHON=ipython ./bin/pyspark (启动)
5.2 直接在终端输入pyspark
5.3 如果是想运行含有spark API的Python文件
cd /usr/spark/spark-2.0.2-bin-hadoop2.7 (进入到自己spark目录下)
./bin/spark-submit /usr/xxx/abc.py ('/usr/xxx/abc.py'是自己的文件路径)
三、Spark知识点
在最近的项目中,自己主要利用spark在做数据处理,没有涉及到建模的部分,所以简单的总结如下:
- 数据的读取
lines = sc.textFile("examples/src/main/resources/people.txt") #读到的数据是RDD格式
lines=spark.read.json("examples/src/main/resources/people,json")#读到的数据是Dataframe格式
- RDD
#结合RDD的map函数,可以对数据的每一行进行操作,非常的方便
parts = lines.map(lambda l: l.split(","))
- Dataframe
schemaPeople.createOrReplaceTempView("people")
#其中schemaPeople是Dataframe数据,people是创建的临时视图,对临时视表可以直接进行SQL的操作,所以数据处理起来也是比较简单的
results = spark.sql("SELECT name FROM people")
#此时的results又变成了Dataframe数据
其中如果想改变数据的格式或是Dataframe的列名,也是可以把Dataframe改变成RDD,然后再进行每一行的操作。
lon_lat=lon_lat.rdd.map(lambda p:Row(lat1=float(p["lat"]),lon1=float(p["lon"]))
参考:
更多的spark知识点
spark常用函数