Spark 入门
Spark 入门
目录
一、 Spark功能和优势
1.
Spark功能
Spark类似于MapReduce,是另一种分布式计算框架,由于MapReduce最大的痛点在于IO,包括硬盘IO和网络IO都成了限制计算的瓶颈,Spark是使用内存来极端,所以Spark是一种内存计算框架。将中间解决存入内存中,大大提高了计算的速度。不同于MapReduce只有map和reduce,Spark提供了上百种操作,功能强大。
2.
Spark处理数据分三步走
² 读取数据:读取数据一般是从HDFS上读取数,如sc.textfile(‘/user/input’)
对于Spark
Core来说,将数据变为RDD。
对于Spark
Sql来说,是将数据变为DataFrame
对于Streaming来说,将数据变为DStream
² 处理数据
对于Spark
Core来说,调用RDD的一系列方法。
对于Spark
Sql来说,是调用df的一系列方法
对于Streaming来说,是调用dstream一系列方法
这些方法大部分是高阶函数。使用各种方法来在内存中处理数据。
² 输出数据:输出数据也大部分是存入硬盘,
sc.SaveAsTextFile
resultDF.write.jdbc()
resultDStream.foreach(Redis\HBase\)
3.
Spark优势
Spark是对于海量数据的快速通用引擎。它的优势如下:
(1)
快
Spark运行快的原因一是因为运行过程中将中间结果存入内存,二是因为Spark运行前会将运行过程生成一张DAG图(有向无环图)。
当处理的源数据在文件中时,比Hadoop快10倍,当处理的源数据在内存中时,比Hadoop快100倍。
(2)
通用
可以使用Core/SQL/Streaming/Graphx/MLib/R/StructStreaming(2.0)等进行Spark计算。
处理的数据通用:可以处理HDFS/Hive/HBase/ES、JSON/JDBC等数据
Spark运行模式:Spark可以运行在本地模式、集群模式,集群模式时,可以运行在YARN上、Mesos上、Standalone集群上、云端
(3)
使用简单
可以使用Python、Scala、Java等开发。
二、 Spark与MapReduce的比较
|
|
MapReduce |
Spark |
|
数据存储结构 |
磁盘HDFS文件系统 |
使用内存构建弹性分布式数据集RDD对数据进行运算和缓存 |
|
编程范式 |
Map+Reduce |
DAG(有向无环图):Transformation+action |
|
中间结果存储 |
中间结果落地磁盘,IO及序列化反序列化代价比较大 |
中间结果存储在内存中,速度比磁盘多几个数量级 |
|
运行方式 |
Task以进程方式维护,任务启动慢 |
Task以线程方式维护,任务启动快 |
三、 Spark源码编译
Spark源码下载:http://spark.apache.org/downloads.html
我们这里选择Spark1.6.1的源码进行编译。

Spark编译官方文档地址为:http://spark.apache.org/docs/1.6.1/building-spark.html
Spark源码编译有三种方式:SBT编译、Maven编译、打包编译
官方文档上讲到Spark1.6.1编译要求Maven版本最低是3.3.3,Java版本最低是7。
make-distribution.sh在源码的根目录下,脚本里有动态查找Spark版本、Scala版本、Hadoop版本、Hive版本的代码,如果编译时去计算会很慢,可以直接将版本写死,可以提高编译速度。
|
原来的配置: VERSION=$("$MVN" SCALA_VERSION=$("$MVN" | | SPARK_HADOOP_VERSION=$("$MVN" | | SPARK_HIVE=$("$MVN" | | # # echo -n) |
|
修改为: VERSION=1.6.1 SCALA_VERSION=2.10.4 SPARK_HADOOP_VERSION=2.5.0-cdh5.3.6 SPARK_HIVE=1 |
这里版本号一定要跟实际的情况一致。
VERSION是Spark的版本号
SPARK_HIVE为1是支持Hive,0是不支持hive
[hadoop@spark01-61cdh apache-maven-3.3.3]$
vim /opt/modules/apache-maven-3.3.3/conf/settings.xml
|
<mirror> <id>mirrorId</id> <mirrorOf>repositoryId</mirrorOf> <name>Human Readable Name for this Mirror.</name> <url>http://my.repository.com/repo/path</url> </mirror> |
[hadoop@spark01-61cdh apache-maven-3.3.3]$
sudo vim /etc/resolv.conf
|
nameserver 8.8.8.8 nameserver 8.8.4.4 |
4、 mvn编译
[hadoop@spark01-61cdh spark-1.6.1]$ mvn
clean package -DskipTest -Phadoop-2.5 -Dhadoop.version=2.5.0 -Pyarn -Phive -Phive-thriftserver
-Dmaven.test.skip=true -Dmaven.test.skip=true -e
² OutOfMemoryError错误
参考:https://cwiki.apache.org/confluence/display/MAVEN/OutOfMemoryError
是因为JVM的可用内存太少,需要手动调整Meven的JVM可用内存量。
配置环境变量:export
MAVEN_OPTS="-Xmx1024m -XX:MaxPermSize=1024m"
² MojoFailureException错误
5、 make-distribution进行打包编译
(1)
命令参数说明
./make-distribution.sh --name custom-spark
--tgz -Psparkr -Phadoop-2.5
-Phive -Phive-thriftserver –Pyarn
² name参数是指编译完成后tar包的名称,比如spark-1.6.1-bin-2.5.0.tar.gz
² -Phadoop-2.5是指使用hadoop2.5版本
² -Phive是指定spark支持hive
² -Phive-thriftserver是指定支持hive-thriftserver
² -Pyarn是指定支持yarn
[hadoop@spark01-61cdh software]$ tar -zxf
/opt/software/spark-1.6.1-bin-2.5.0-cdh5.3.6.tgz -C /opt/modules
|
检查Java是否已经安装好 [hadoop@spark01-61cdh java version Java(TM) SE Runtime Java HotSpot(TM) |
|
检查Scala是否已经安装好 [hadoop@spark01-61cdh Scala code runner |
从模板复制一个配置文件
[hadoop@spark01-61cdh
spark-1.6.1-bin-2.5.0-cdh5.3.6]$ cp conf/spark-env.sh.template
conf/spark-env.sh
在spark-env.sh添加配置:
|
JAVA_HOME=/opt/modules/jdk1.7.0_67 SCALA_HOME=/opt/modules/scala-2.10.4/bin HADOOP_CONF_DIR=/opt/modules/hadoop-2.5.0-cdh5.3.6/etc/hadoop |
[hadoop@spark01-61cdh
spark-1.6.1-bin-2.5.0-cdh5.3.6]$ bin/spark-shell
这样就进入到了Spark的shell交互式命令行。
这里请注意,在启动时的日志里有一句:
|
16/10/12 23:40:36 Spark context |
这里意思是spark会创建一个context对象叫做sc。这个sc是SparkContext,它是SparkCore的程序入口,SparkContext会创建一个RDD。
5、 Web页面
启动shell后,可用通过4040端口的Web页面查看监控页面。

将spark根目录下的README.md文件上传到HDFS上去
[hadoop@spark01-61cdh
spark-1.6.1-bin-2.5.0-cdh5.3.6]$ hdfs dfs -put README.md /
加载文件到rdd:scala> val
rdd=sc.textFile("/README.md")
计算多少行:scala>
rdd.count
计算包含Spark关键字的行数:scala>
rdd.filter(line=>line.contains("Spark")).count
取前5行数据:scala> rdd.take(5)
按照大数据处理三步走:
scala> val
rdd=sc.textFile("/input.txt")
这个sc是一个SparkContext对象,textFile方法是读取HDFS上的文件,读取文件后,赋值给一个RDD对象。后续的操作都是用户RDD来操作的。
² scala>
var wordcountRdd=rdd.flatMap(line => line.split(" ")).map(word
=>(word,1)).reduceByKey((a,b)=>(a+b))
flatMap是将文件中的内容根据空格分隔开后,变换为一个单词数组。
map是针对每一个单词生成一个键值对,键为单词,值为1。
reduceByKey是将每一个键值对的值根据key进行合并相加,来统计各个单词的个数。
² scala>
wordcountRdd.count
² scala>
wordcountRdd.take(11)
res4: Array[(String, Int)] = Array((min,1),
(hive,2), (word,1), (hua,2), (hello,1), (zhongh,1), (spark,2), (hadoop,2),
(ren,2), (work,1), (storm,1))
scala>
wordcountRdd.saveAsTextFile("/spark-out")
保存到HDFS根目录下的spark-out目录下
|
1、加载数据 scala> val 2、处理数据 scala> 3、根据个数排序后,取前5个 scala> 链式编程: sc.textFile("/input.txt"). |
八、 RDD理解
RDD是弹性分布式数据集(Resilient Distributed Dataset)的简称,其实就是分布式元素集合。在Spark中,对数据的所有操作不外乎创建RDD、转化已有的RDD、调用RDD操作进行求值。
RDD有两种类型的操作:Transformation操作、Action操作,Transformation操作和Action操作区别在于Spark计算RDD的方式不同。
² Transformation操作会由一个RDD生成另一个新的RDD,生成的新的RDD是惰性求值的,只有在Action操作时才会被计算。
² Action操作会对RDD计算出一个结果,并把结果返回到驱动器程序中,或者是把结果存储到外部存储系统中。
附件列表
Spark 入门的更多相关文章
- Spark入门实战系列--10.分布式内存文件系统Tachyon介绍及安装部署
[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .Tachyon介绍 1.1 Tachyon简介 随着实时计算的需求日益增多,分布式内存计算 ...
- 使用scala开发spark入门总结
使用scala开发spark入门总结 一.spark简单介绍 关于spark的介绍网上有很多,可以自行百度和google,这里只做简单介绍.推荐简单介绍连接:http://blog.jobbole.c ...
- Spark入门实战系列--1.Spark及其生态圈简介
[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .简介 1.1 Spark简介 年6月进入Apache成为孵化项目,8个月后成为Apache ...
- Spark入门实战系列--2.Spark编译与部署(上)--基础环境搭建
[注] 1.该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取: 2.Spark编译与部署将以CentOS 64位操作系统为基础,主要是考虑到实际应用 ...
- Spark入门实战系列--2.Spark编译与部署(中)--Hadoop编译安装
[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .编译Hadooop 1.1 搭建环境 1.1.1 安装并设置maven 1. 下载mave ...
- Spark入门实战系列--2.Spark编译与部署(下)--Spark编译安装
[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .编译Spark .时间不一样,SBT是白天编译,Maven是深夜进行的,获取依赖包速度不同 ...
- Spark入门实战系列--3.Spark编程模型(上)--编程模型及SparkShell实战
[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .Spark编程模型 1.1 术语定义 l应用程序(Application): 基于Spar ...
- Spark入门实战系列--3.Spark编程模型(下)--IDEA搭建及实战
[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 . 安装IntelliJ IDEA IDEA 全称 IntelliJ IDEA,是java语 ...
- Spark入门实战系列--4.Spark运行架构
[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 1. Spark运行架构 1.1 术语定义 lApplication:Spark Appli ...
随机推荐
- android http 抓包
有时候想开发的时候想看APP发出的http请求和响应是什么,这就需要抓包了,这可以得到一些不为人知的api,比如还可以干些“坏事”... 需要工具: Fiddler2 抓包(点击下载) Android ...
- 免费开源的DotNet任务调度组件Quartz.NET(.NET组件介绍之五)
很多的软件项目中都会使用到定时任务.定时轮询数据库同步,定时邮件通知等功能..NET Framework具有“内置”定时器功能,通过System.Timers.Timer类.在使用Timer类需要面对 ...
- c# 基础 object ,new操作符,类型转换
参考页面: http://www.yuanjiaocheng.net/webapi/config-webapi.html http://www.yuanjiaocheng.net/webapi/web ...
- C语言中如何判断文件是否存在
方法一:access函数判断文件夹或者文件是否存在 函数原型: int access(const char *filename, int mode); 所属头文件:io.h filename:可以填写 ...
- MATLAB中绘制质点轨迹动图并保存成GIF
工作需要在MATLAB中绘制质点轨迹并保存成GIF以便展示. 绘制质点轨迹动图可用comet和comet3命令,使用例子如下: t = 0:.01:2*pi;x = cos(2*t).*(cos(t) ...
- 自定义鼠标光标cursor
通过css属性 Cursor:url()自定义鼠标光标. {cursor:url('图标路径'),default;} url是自定义鼠标图标路径 default指的是定义默认的光标(通常是一个箭头), ...
- 安卓客户端a标签长按弹框提示解决办法
昨天工作时候发现一个bug,是关于a标签的,在安卓客户端中,如果是a标签的话,长按会出现一个弹框,如图所示 是因为安卓客户端的长按触发机制,以后进行wap端开发的时候,如果用到跳转页面尽量不要用a标签 ...
- iOS开发 判断当前APP版本和升级
从iOS8系统开始,用户可以在设置里面设置在WiFi环境下,自动更新安装的App.此功能大大方便了用户,但是一些用户没有开启此项功能,因此还是需要在程序里面提示用户的 方法一:在服务器接口约定对应的数 ...
- 在VMware上安装CentOS -7
1.下载好VMware 2.准备好CentOS的镜像文件 3.打开VMware创建新的虚拟机 选择自定义高级后按下一步 继续下一步 选择稍后安装操作系统 客户机操作系统选择Linux,版本选择Cent ...
- BZOJ 1692: [Usaco2007 Dec]队列变换 [后缀数组 贪心]
1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1383 Solved: 582[Submit][St ...