Spark安装搭建与使用
- Spark安装搭建与使用
- Spark简介
- Spark框架
- Spark常见API功能
- Spark RDD
- Spark下载与安装
- Spark windows集成开发环境搭建
- 利用Spark调用Ansj进行中文分词
Spark简介
Apache Spark是一个开源分布式的数据处理平台,支持集群进行数据处理。类似于hadoop,却又能提供灵活的编程接口(而不是map和reduce过程)。目前Spark的API支持Java, Python, Scala和R语言。
Spark框架
- Spark Core : 框架核心组件,提供内存管理、任务调度等功能,并对第三方存储系统(例如HDFS,S3等)提供接口支持。同样也提供RDD (弹性分布式数据集,Spark特有的存储单元)API。
- Spark SQL : 提供结构化或半结构化的数据处理。支持用户在Spark内使用SQL进行数据访问,包括Hive datasets, JSON,JDBC等。
- Spark Streaming : 提供流式处理
- MLib : 提供机器学习算法库
- GraphX: 提供图计算。(PageRank等算法)
Spark常见API功能
两种操作类型:Transformation 和Action
Transformation是一种操作RDD数据集的指令,会创建新的RDD进行数据存储,但不会反馈结果给主程序。可以理解为数据的操作。常见的Transformation接口有:
Action是会产生返回结果给主程序的。常见的Action指令有:
- map函数功能
# map
# sc = spark context, parallelize creates an RDD from the passed object
x = sc.parallelize([1,2,3])
y = x.map(lambda x: (x,x**2))
# collect copies RDD elements to a list on the driver
print(x.collect())
print(y.collect())
[1, 2, 3]
[(1, 1), (2, 4), (3, 9)]
- flatMap功能
# flatMap
x = sc.parallelize([1,2,3])
y = x.flatMap(lambda x: (x, 100*x, x**2))
print(x.collect())
print(y.collect())
[1, 2, 3]
[1, 100, 1, 2, 200, 4, 3, 300, 9]
详情可以参见:https://www.iteblog.com/archives/1395.html
Spark RDD
RDD: Resilient Distributed Datasets
Spark在集群上的数据集。支持数据在不同机器上分片存储。具体如下所示:
提供多种接口,支持聪其它数据源获取数据,转换为RDD
hadoopFile() : 从Hadoop文件转换为RDD
objectFile() :序列化数据
textFile() : HDFS 或本地文件
Spark下载与安装
下载地址: http://spark.apache.org/downloads.html
Spark有多种运行方式。此处强调本地模式(Standalone),可以使用Hadoop本地模式,也可以不使用Hadoop。即Spark的运行可以独立Hadoop进行。
支持的语言版本:
(1)Java 7+
(2)Python 2.6+
(3)R 3.1+
(4) Scala 2.10+
下载后解压文件,cmd下进入解压文件目录,即可运行(要求安装了Python):
说明:虽然不需要Hadoop,可以直接使用Spark,但是本地还需要配置HADOOP_HOME,添加winutils.exe文件,具体文件下载可以自行搜索。
Spark windows集成开发环境搭建
选择使用Intellij IDEA集成开发环境,选用Scala语言进行搭建。
下载IDEA(社区免费版本)http://www.jetbrains.com/idea/download/
IDEA工程里library添加Spark的Jar包即可
利用Spark调用Ansj进行中文分词
- Ansj是一个基于java实现的n-Gram+CRF+HMM的中文分词工具,使用说明和源码参见:https://github.com/NLPchina/ansj_seg
- 添加Ansj的Jar包
主要代码如下:
val lines = sc.textFile(doc, 1).map { x =>
val temp = ToAnalysis.parse(x).getTerms()
val word = for(i<-Range(0,temp.size())) yield temp.get(i).getName()
word
}
val pairs = lines.flatMap(words => words.map(word =>(word,1)))