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. 【NLP】Python NLTK处理原始文本

    Python NLTK 处理原始文本 作者:白宁超 2016年11月8日22:45:44 摘要:NLTK是由宾夕法尼亚大学计算机和信息科学使用python语言实现的一种自然语言工具包,其收集的大量公开 ...

  2. C++随笔:.NET CoreCLR之GC探索(4)

    今天继续来 带大家讲解CoreCLR之GC,首先我们继续看这个GCSample,这篇文章是上一篇文章的继续,如果有不清楚的,还请翻到我写的上一篇随笔.下面我们继续: // Initialize fre ...

  3. git基本操作

    一.在Windows平台上安装Git,可以下载一个msysGit的安装包,点击exe即可安装运行.安装包下载地址:https://git-for-windows.github.io/备注:git命令行 ...

  4. Mysql - 触发器/视图

    触发器在之前的项目中, 应用的着实不多, 没有办法的时候, 才会去用这个. 因为这个东西在后期并不怎么好维护, 也容易造成紊乱. 我最近的项目中, 由于数据库设计(别人设计的)原因, 导致一些最简单功 ...

  5. 如何搭建git服务器

    一.前言 现在越来越多的公司用git进行版本控制,不过git是默认是开源的,如果私有的话是需要付费的,如果不想付费自己可以搭建一个git服务器用来版本控制. 二.服务器端操作 1.安装git sudo ...

  6. mono中发送邮件并保存本次收件人的地址

    在ios端mono开发中,发送邮件可以选择调用ios原生email程序.有两种方式实现这种功能,一是程序跳转到ipad中email程序,另外一种是将发送邮件的界面在自己应用里弹出. 首先第一种方式的代 ...

  7. 舍弃Nunit拥抱Xunit

    前言 今天与同事在讨论.Net下测试框架的时候,说到NUnit等大多数测试框架的SetUp以及TearDown方法并不是显得那么完美,所以在公司内部的项目中采用了Xunit框架.那么究竟是什么样的原因 ...

  8. DBCP 配置备注

    <property name="initialSize" value="5"></property> <property name ...

  9. 【AI开发第一步】微软认知服务API应用

    目录 介绍 API分类 使用‘视觉’API完成的Demo 点击直接看干货 介绍 从3月份Google家的阿尔法狗打败韩国围棋冠军选手李世石,到之后微软Build2016大会宣布的“智能机器人”战略.种 ...

  10. 透过浏览器看HTTP缓存

    作为前端开发人员,对于我们的站点或应用的缓存机制我们能做的似乎不多,但这些却是与我们关注的性能息息相关的部分,站点没有做任何缓存机制,我们的页面可能会因为资源的下载和渲染变得很慢,但大家都知道去找前端 ...