Spark 入门

目录

一、

1.

2.

3.

二、

三、

1、

2、

3、

(1)

(2)

(3)

4、

5、

四、

1、

2、

3、

4、

5、

五、         Spark
Shell使用

1、

2、

六、         运行WordCount
Demo

1、

2、

3、

七、         Spark
TopKey Demo

八、

1、

2、

一、 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源码编译

1、   下载Spark源码

Spark源码下载:http://spark.apache.org/downloads.html

我们这里选择Spark1.6.1的源码进行编译。

2、   编译要求

Spark编译官方文档地址为:http://spark.apache.org/docs/1.6.1/building-spark.html

Spark源码编译有三种方式:SBT编译、Maven编译、打包编译

官方文档上讲到Spark1.6.1编译要求Maven版本最低是3.3.3,Java版本最低是7。

3、   注意事项

(1)     
修改make-distribution.sh
文件

make-distribution.sh在源码的根目录下,脚本里有动态查找Spark版本、Scala版本、Hadoop版本、Hive版本的代码,如果编译时去计算会很慢,可以直接将版本写死,可以提高编译速度。

原来的配置:

VERSION=$("$MVN"
help:evaluate -Dexpression=project.version $@ 2>/dev/null | grep -v
"INFO" | tail -n 1)

SCALA_VERSION=$("$MVN"
help:evaluate -Dexpression=scala.binary.version $@ 2>/dev/null\

|
grep -v "INFO"\

|
tail -n 1)

SPARK_HADOOP_VERSION=$("$MVN"
help:evaluate -Dexpression=hadoop.version $@ 2>/dev/null\

|
grep -v "INFO"\

|
tail -n 1)

SPARK_HIVE=$("$MVN"
help:evaluate -Dexpression=project.activeProfiles -pl sql/hive $@
2>/dev/null\

|
grep -v "INFO"\

|
fgrep --count "<id>hive</id>";\

#
Reset exit status to 0, otherwise the script stops here if the last grep
finds nothing\

#
because we use "set -o pipefail"

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

(2)     
配置镜像

[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>

(3)     
修改下域名解析服务器配置

[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

四、 安装Spark

1、   解压spark tar

[hadoop@spark01-61cdh software]$ tar -zxf
/opt/software/spark-1.6.1-bin-2.5.0-cdh5.3.6.tgz -C /opt/modules

2、   检查环境

检查Java是否已经安装好

[hadoop@spark01-61cdh
spark-1.6.1-bin-2.5.0-cdh5.3.6]$ java -version

java version
"1.7.0_67"

Java(TM) SE Runtime
Environment (build 1.7.0_67-b01)

Java HotSpot(TM)
64-Bit Server VM (build 24.65-b04, mixed mode)

检查Scala是否已经安装好

[hadoop@spark01-61cdh
spark-1.6.1-bin-2.5.0-cdh5.3.6]$ scala -version

Scala code runner
version 2.10.4 -- Copyright 2002-2013, LAMP/EPFL

3、   配置spark-env.sh

从模板复制一个配置文件

[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

4、   启动Spark

[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
INFO repl.SparkILoop: Created spark context..

Spark context
available as sc.

这里意思是spark会创建一个context对象叫做sc。这个sc是SparkContext,它是SparkCore的程序入口,SparkContext会创建一个RDD。

5、   Web页面

启动shell后,可用通过4040端口的Web页面查看监控页面。

五、 Spark Shell使用

1、  准备数据

将spark根目录下的README.md文件上传到HDFS上去

[hadoop@spark01-61cdh
spark-1.6.1-bin-2.5.0-cdh5.3.6]$ hdfs dfs -put README.md /

2、  测试

加载文件到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)

六、 运行WordCount Demo

按照大数据处理三步走:

1、   读取数据

scala> val
rdd=sc.textFile("/input.txt")

这个sc是一个SparkContext对象,textFile方法是读取HDFS上的文件,读取文件后,赋值给一个RDD对象。后续的操作都是用户RDD来操作的。

2、  处理数据

²  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))

3、  保存数据

scala>
wordcountRdd.saveAsTextFile("/spark-out")

保存到HDFS根目录下的spark-out目录下

七、 Spark TopKey Demo

1、加载数据

scala> val
rdd=sc.textFile("/input.txt")

2、处理数据

scala>
var wordcountRdd=rdd.flatMap(line => line.split(" ")).map(word
=>(word,1)).reduceByKey((a,b)=>(a+b))

3、根据个数排序后,取前5个

scala>
wordcountRdd.map(tuple=>(tuple._2,tuple._1)).sortByKey(false).map(tuple=>(tuple._2,tuple._1)).take(5)

链式编程:

sc.textFile("/input.txt").
flatMap(line => line.split(" ")).map(word
=>(word,1)).reduceByKey((a,b)=>(a+b)).
map(tuple=>(tuple._2,tuple._1)).sortByKey(false).map(tuple=>(tuple._2,tuple._1)).take(5)

八、 RDD理解

1、   定义

RDD是弹性分布式数据集(Resilient Distributed Dataset)的简称,其实就是分布式元素集合。在Spark中,对数据的所有操作不外乎创建RDD、转化已有的RDD、调用RDD操作进行求值。

2、   操作类型

RDD有两种类型的操作:Transformation操作、Action操作,Transformation操作和Action操作区别在于Spark计算RDD的方式不同。

²  Transformation操作会由一个RDD生成另一个新的RDD,生成的新的RDD是惰性求值的,只有在Action操作时才会被计算。

²  Action操作会对RDD计算出一个结果,并把结果返回到驱动器程序中,或者是把结果存储到外部存储系统中。

附件列表

Spark 入门的更多相关文章

  1. Spark入门实战系列--10.分布式内存文件系统Tachyon介绍及安装部署

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .Tachyon介绍 1.1 Tachyon简介 随着实时计算的需求日益增多,分布式内存计算 ...

  2. 使用scala开发spark入门总结

    使用scala开发spark入门总结 一.spark简单介绍 关于spark的介绍网上有很多,可以自行百度和google,这里只做简单介绍.推荐简单介绍连接:http://blog.jobbole.c ...

  3. Spark入门实战系列--1.Spark及其生态圈简介

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .简介 1.1 Spark简介 年6月进入Apache成为孵化项目,8个月后成为Apache ...

  4. Spark入门实战系列--2.Spark编译与部署(上)--基础环境搭建

    [注] 1.该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取: 2.Spark编译与部署将以CentOS 64位操作系统为基础,主要是考虑到实际应用 ...

  5. Spark入门实战系列--2.Spark编译与部署(中)--Hadoop编译安装

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .编译Hadooop 1.1 搭建环境 1.1.1 安装并设置maven 1. 下载mave ...

  6. Spark入门实战系列--2.Spark编译与部署(下)--Spark编译安装

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .编译Spark .时间不一样,SBT是白天编译,Maven是深夜进行的,获取依赖包速度不同 ...

  7. Spark入门实战系列--3.Spark编程模型(上)--编程模型及SparkShell实战

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .Spark编程模型 1.1 术语定义 l应用程序(Application): 基于Spar ...

  8. Spark入门实战系列--3.Spark编程模型(下)--IDEA搭建及实战

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 . 安装IntelliJ IDEA IDEA 全称 IntelliJ IDEA,是java语 ...

  9. Spark入门实战系列--4.Spark运行架构

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 1. Spark运行架构 1.1 术语定义 lApplication:Spark Appli ...

随机推荐

  1. Emoji选项列表

    一.需要的前提文件 从网上下载Emoji的表情包,当然是png的图片,因为WPF不支持彩色的Emoji,所以,做列表的时候,需要用图片. 随着压缩包一起的还有一个Emoji.xml文件,文件的层级结构 ...

  2. 一起学微软Power BI系列-使用技巧(1)连接Oracle与Mysql数据库

    说起Oracle数据库,以前没用过Oracle不知道,但是这1年用Oracle后,发现真的是想狂吐槽,特别是那个.NET驱动和链接字符串,特别奇葩.总归是和其他数据库不一样,标新立异,不知道为何.另外 ...

  3. SQL Server-聚焦计算列持久化(二十一)

    前言 上一节我们结束了Hash Match Aggregate和Stream Aggregate的讲解,本系列我们来讲讲关于SQL Server中的计算列问题,简短的内容,深入的理解,Always t ...

  4. ASP.NET WebApi OWIN 实现 OAuth 2.0

    OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. OAuth 允许用户提供一个令牌, ...

  5. 基于AngularJs的上传控件-angular-file-upload

    今天跟大家分享的是一个依赖于angular的上传控件. 前段时间做项目遇到一个需求是上传文件,大概需要实现的样式是这样子的,见下图: 需要同时上传两个文件.并且规定文件格式和文件大小.因为前端框架使用 ...

  6. 【腾讯Bugly干货分享】基于RxJava的一种MVP实现

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57bfef673c1174283d60bac0 Dev Club 是一个交流移动 ...

  7. 从Maya中把模型搬运至网页的过程

    虽然利用threejs来在网页中渲染3d模型不是第一次折腾了,但是还是遇到了各种问题.总结下我所遇到的问题,希望能给正在使用threejs的小伙伴一个帮助. 一.所使用的软件与开发环境 Maya201 ...

  8. 达夫设备(Duff's Device)

    达夫设备设备是一段非常巧妙,看起来非常诡异的c代码,它可以很大的提高程序执行的效率(本文将试验),达夫设备的来源我就不说了,我们来分析一下. 达夫设备是考虑到我们一般用for或者while循环的时候, ...

  9. eclipse下查看maven下载的源码中文乱码问题

    在项目中设置通过maven下载源代码和javadoc,直接通过eclipse浏览源代码时,发现中文为乱码.解决方法如下: 修改Eclipse中文本文件的默认编码:windows->Prefere ...

  10. 使用自定义 classloader 的正确姿势

    详细的原理就不多说了,网上一大把, 但是, 看了很多很多, 即使看了jdk 源码, 说了罗里吧嗦, 还是不很明白: 到底如何正确自定义ClassLoader, 需要注意什么 ExtClassLoade ...